Appendix B. WaveForm API

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