source: trunk/Utilities/WaveOutMultiPlay/WaveOutMultiPlay.cpp @ 27

Last change on this file since 27 was 26, checked in by roman, 11 years ago
  • Property svn:keywords set to Id
File size: 3.1 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2008-2011
3// Created by Roman Ryltsov roman@alax.info
4//
5// $Id: WaveOutMultiPlay.cpp 26 2011-10-07 14:19:25Z roman $
6
7#include "stdafx.h"
8#define _USE_MATH_DEFINES
9#include <math.h>
10#include <mmsystem.h>
11
12#pragma comment(lib, "winmm.lib")
13
14CString g_sOptions;
15
16VOID Check(MMRESULT nResult)
17{
18        if(nResult == MMSYSERR_NOERROR)
19                return;
20        _tprintf(_T("nResult %d\n"), nResult);
21        AtlThrow(E_FAIL);
22}
23
24VOID Play(const WAVEFORMATEX& WaveFormatEx, UINT nFrequency)
25{
26        _ATLTRY
27        {
28                HWAVEOUT hWaveOut = NULL;
29                if(g_sOptions.Find(_T("0")) >= 0)
30                        Check(waveOutOpen(&hWaveOut, 0, &WaveFormatEx, NULL, NULL, CALLBACK_NULL));
31                else
32                        Check(waveOutOpen(&hWaveOut, WAVE_MAPPER, &WaveFormatEx, NULL, NULL, CALLBACK_NULL));
33                ATLASSERT(hWaveOut);
34                WAVEHDR* pWaveHeader;
35                HGLOBAL hWaveHeader = (WAVEHDR*) GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof *pWaveHeader + WaveFormatEx.nAvgBytesPerSec * 10);
36                pWaveHeader = (WAVEHDR*) GlobalLock(hWaveHeader);
37                ATLENSURE_THROW(pWaveHeader, E_OUTOFMEMORY);
38                pWaveHeader->lpData = (LPSTR) (BYTE*) (pWaveHeader + 1);
39                pWaveHeader->dwBufferLength = WaveFormatEx.nAvgBytesPerSec * 10;
40                //pWaveHeader->dwUser =
41                pWaveHeader->dwFlags = 0;
42                pWaveHeader->dwLoops = 0;
43                #pragma region Generate Actual Data
44                {
45                        SHORT* pnData = (SHORT*) pWaveHeader->lpData;
46                        SIZE_T nDataCount = pWaveHeader->dwBufferLength / sizeof *pnData;
47                        for(SIZE_T nIndex = 0; nIndex < nDataCount; nIndex++)
48                                pnData[nIndex] = (SHORT) (32000 * sin(1.0 * nIndex / WaveFormatEx.nSamplesPerSec * nFrequency * 2 * M_PI));
49                }
50                #pragma endregion
51            Check(waveOutPrepareHeader(hWaveOut, pWaveHeader, sizeof *pWaveHeader)); 
52                Check(waveOutWrite(hWaveOut, pWaveHeader, sizeof *pWaveHeader)); 
53                GlobalUnlock(hWaveHeader);
54                Sleep(INFINITE);
55        }
56        _ATLCATCHALL()
57        {
58                _tprintf(_T("Fatal error while trying to play waveform, nFrequency %d\n"), nFrequency);
59        }
60}
61
62UINT STDMETHODCALLTYPE PlayA(VOID*)
63{
64        static const WAVEFORMATEX g_WaveFormatEx = 
65        {
66                WAVE_FORMAT_PCM,
67                1, 
68                22050,
69                44100,
70                2,
71                16
72        };
73        Play(g_WaveFormatEx, 1000);
74        return 0;
75}
76
77UINT STDMETHODCALLTYPE PlayB(VOID*)
78{
79        static const WAVEFORMATEX g_WaveFormatEx = 
80        {
81                WAVE_FORMAT_PCM,
82                1, 
83                32000,
84                64000,
85                2,
86                16
87        };
88        Play(g_WaveFormatEx, 5000);
89        return 0;
90}
91
92UINT STDMETHODCALLTYPE PlayC(VOID*)
93{
94        static const WAVEFORMATEX g_WaveFormatEx = 
95        {
96                WAVE_FORMAT_PCM,
97                1, 
98                44100,
99                88200,
100                2,
101                16
102        };
103        Play(g_WaveFormatEx, 15000);
104        return 0;
105}
106
107int _tmain(int argc, _TCHAR* argv[])
108{
109        if(argc <= 1)
110        {
111                _tprintf(_T("Syntax: WaveOutMultiPlay [a][b][c][0]\n"));
112                _tprintf(_T("        Run 'WaveOutMultiPlay abc' to simultaneously play 1 kHz, 5 kHz and 15 kHz via default audio output device\n"));
113                return 1;
114        }
115        g_sOptions = argv[1];
116        if(g_sOptions.Find(_T('a')) >= 0)
117                ATLVERIFY(_beginthreadex(NULL, 0, &PlayA, NULL, 0, NULL));
118        if(g_sOptions.Find(_T('b')) >= 0)
119                ATLVERIFY(_beginthreadex(NULL, 0, &PlayB, NULL, 0, NULL));
120        if(g_sOptions.Find(_T('c')) >= 0)
121                ATLVERIFY(_beginthreadex(NULL, 0, &PlayC, NULL, 0, NULL));
122        Sleep(INFINITE);
123        return 0;
124}
125
Note: See TracBrowser for help on using the repository browser.