The minimalistic sample demonstrates support of [deprecated] Waveform Audio API for multiple playback streams.
Depending on command line parameters, the application starts threads to open audio hardware using separate waveOutOpen call and stream one or more generated sine waves:
- 1,000 Hz sine wave as 22,050 Hz, Mono, 16-bit PCM (command line parameter “a”)
- 5,000 Hz sine wave as 32,000 Hz, Mono, 16-bit PCM (command line parameter “b”)
- 15,000 Hz sine wave as 44,100 Hz, Mono, 16-bit PCM (command line parameter “c”)
Check(waveOutOpen(&hWaveOut, WAVE_MAPPER, &WaveFormatEx, NULL, NULL, CALLBACK_NULL)); ATLASSERT(hWaveOut); WAVEHDR* pWaveHeader; HGLOBAL hWaveHeader = (WAVEHDR*) GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof *pWaveHeader + WaveFormatEx.nAvgBytesPerSec * 10); pWaveHeader = (WAVEHDR*) GlobalLock(hWaveHeader); ATLENSURE_THROW(pWaveHeader, E_OUTOFMEMORY); pWaveHeader->lpData = (LPSTR) (BYTE*) (pWaveHeader + 1); pWaveHeader->dwBufferLength = WaveFormatEx.nAvgBytesPerSec * 10; //pWaveHeader->dwUser = pWaveHeader->dwFlags = 0; pWaveHeader->dwLoops = 0; #pragma region Generate Actual Data { SHORT* pnData = (SHORT*) pWaveHeader->lpData; SIZE_T nDataCount = pWaveHeader->dwBufferLength / sizeof *pnData; for(SIZE_T nIndex = 0; nIndex < nDataCount; nIndex++) pnData[nIndex] = (SHORT) (32000 * sin(1.0 * nIndex / WaveFormatEx.nSamplesPerSec * nFrequency * 2 * M_PI)); } #pragma endregion Check(waveOutPrepareHeader(hWaveOut, pWaveHeader, sizeof *pWaveHeader)); Check(waveOutWrite(hWaveOut, pWaveHeader, sizeof *pWaveHeader)); GlobalUnlock(hWaveHeader);
The operating system is supposed to mix the waves, which can be easily perceived taking place. It is possible to run the application with multiple waveforms within a process, e.g. “abc” command line parameter, and/or start multiple instances of the application.
A binary [Win32] and partial Visual C++ .NET 2010 source code are available from SVN.










Recent Comments