| Real-Time Protocol-based Audio Engine: Audio Codec Module | ||
|---|---|---|
| Prev | ||
This is the full Waveform Audio API.
MMRESULT waveInAddBuffer ( HWAVEIN hwi , LPWAVEHDR pwh , UINT cbwh );
MMRESULT waveInClose ( HWAVEIN hwi );
MMRESULT waveInGetDevCaps ( UINT uDeviceID , LPWAVEINCAPS pwic , UINT cbwic );
MMRESULT waveInGetErrorText ( MMRESULT mmrError , LPSTR pszText , UINT cchText );
MMRESULT waveInGetID ( HWAVEIN hwi , LPUINT puDeviceID );
UINT waveInGetNumDevs ( VOID );
MMRESULT waveInGetPosition ( HWAVEIN hwi , LPMMTIME pmmt , UINT cbmmt );
DWORD waveInMessage ( HWAVEIN hwi , UINT uMsg , DWORD dwParam1 , DWORD dwParam2 );
MMRESULT waveInOpen ( LPHWAVEIN phwi , UINT uDeviceID , LPWAVEFORMATEX pwfx , DWORD dwCallback , DWORD dwCallbackInstance );
MMRESULT waveInPrepareHeader ( HWAVEIN hwi , LPWAVEHDR pwh , UINT cbwh );
CALLBACK waveInProc ( HWAVEIN hwi , UINT uMsg , DWORD dwInstance , DWORD dwParam1 , DWORD dwParam2 );
MMRESULT waveInReset ( HWAVEIN hwi );
MMRESULT waveInStart ( HWAVEIN hwi );
MMRESULT waveInStop ( HWAVEIN hwi );
MMRESULT waveInUnprepareHeader ( HWAVEIN hwi , LPWAVEHDR pwh , UINT cbwh );
MMRESULT waveOutBreakLoop ( HWAVEOUT hwo );
MMRESULT waveOutClose ( HWAVEOUT hwo );
MMRESULT waveOutGetDevCaps ( UINT uDeviceID , LPWAVEOUTCAPS pwoc , UINT cbwoc );
MMRESULT waveOutGetErrorText ( MMRESULT mmrError , LPSTR pszText , UINT cchText );
MMRESULT waveOutGetID ( HWAVEOUT hwo , LPUINT puDeviceID );
UINT waveOutGetNumDevs ( VOID );
MMRESULT waveOutGetPitch ( HWAVEOUT hwo , LPDWORD pdwPitch );
MMRESULT waveOutGetPlaybackRate ( HWAVEOUT hwo , LPDWORD pdwRate
);
MMRESULT waveOutGetPosition ( HWAVEOUT hwo , LPMMTIME pmmt , UINT cbmmt );
MMRESULT waveOutGetVolume ( HWAVEOUT hwo , LPDWORD pdwVolume );
DWORD waveOutMessage ( HWAVEOUT hwo , UINT uMsg , DWORD dwParam1 , DWORD dwParam2 );
MMRESULT waveOutOpen ( LPHWAVEOUT phwo , UINT uDeviceID , LPWAVEFORMATEX pwfx , DWORD dwCallback , DWORD dwCallbackInstance );
MMRESULT waveOutPause ( HWAVEOUT hwo );
MMRESULT waveOutPrepareHeader ( HWAVEOUT hwo , LPWAVEHDR pwh , UINT cbwh );
CALLBACK waveOutProc ( HWAVEOUT hwo , UINT uMsg , DWORD dwInstance , DWORD dwParam1 , DWORD dwParam2 );
MMRESULT waveOutReset ( HWAVEOUT hwo );
MMRESULT waveOutSetPitch ( HWAVEOUT hwo , DWORD dwPitch );
MMRESULT waveOutSetPlaybackRate ( HWAVEOUT hwo , DWORD dwRate );
MMRESULT waveOutSetVolume ( HWAVEOUT hwo , DWORD dwVolume );
MMRESULT waveOutUnprepareHeader ( HWAVEOUT hwo , LPWAVEHDR pwh , UINT cbwh );
MMRESULT waveOutWrite ( HWAVEOUT hwo , LPWAVEHDR pwh , UINT cbwh );
The following figure (Figure B-1) shows how input device is opened, and how the first buffers are sent to the OS. This code is taken from the Sound Engine module, prepared by the author.
pwf.wBitsPerSample= 16;
pwf.wf.nChannels = 1;
pwf.wf.nSamplesPerSec = 8000;
pwf.wf.wFormatTag = WAVE_FORMAT_PCM;
pwf.wf.nBlockAlign =
pwf.wf.nChannels * pwf.wBitsPerSample / 8;
pwf.wf.nAvgBytesPerSec =
pwf.wf.nSamplesPerSec * pwf.wf.nBlockAlign;
if (waveInOpen(&rip->hwi,
/*WAVE_MAPPER*/ 0, (LPWAVEFORMATEX)&pwf,
(DWORD) rip->eventh, 0, CALLBACK_EVENT )) {
printf("Couldn't open sound device. Leaving..\n");
goto problem;
}
/* Preparing system buffers */
sb = (WAVEHDR**) malloc(sizeof(WAVEHDR**) * system_buf_num);
if(!sb)
goto problem;
for (i = 0; i < system_buf_num; i++)
sb[i] = NULL;
for (i = 0; i < system_buf_num; i++) {
count = i;
sb[i] = (WAVEHDR*) malloc(sizeof(WAVEHDR));
if (sb[i] == NULL) {
put_debug_message("malloc() error!\n");
goto problem;
}
sb[i]->lpData = (LPBYTE) malloc(system_buf_len);
sb[i]->dwBufferLength = system_buf_len;
sb[i]->dwBytesRecorded = 0;
sb[i]->dwUser = 0;
sb[i]->dwFlags = 0;
sb[i]->dwLoops = 0;
if(!sb[i]->lpData)
goto problem;
if (waveInPrepareHeader(rip->hwi, sb[i], sizeof(WAVEHDR))) {
put_debug_message("waveInPrepareHeader problem!\n");
goto problem;
}
if (waveInAddBuffer(rip->hwi, sb[i], sizeof(WAVEHDR))) {
put_debug_message("waveInAddBuffer problem!\n");
goto problem;
}
}
Figure B-1. A fragment of the capturing procedure