WaveInOpen函數
外觀
waveInOpen是動態連接庫winmm.dll之函數,用以開啟波形輸入設備。
waveInOpen之原形為︰
MMRESULT waveInOpen( LPHWAVEIN phwi, UINT_PTR uDeviceID, LPWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwCallbackInstance, DWORD fdwOpen );
解述︰
- LPHWAVEIN phwi 為一指針,以指示返回輸入設備。
- UINT_PTR uDeviceID 乃所用波形輸入設備之ID。若此為 WAVE_MAPPER,系統則會自動尋找合適設備。
- LPWAVEFORMATEX pwfx ,指向波形聲音格式數據類型(WAVEFORMAT)之指針。
- DWORD_PTR dwCallback 為指向回調函數的指針或窗口句柄,用於處理波形聲音輸入過程中產生的消息。
- DWORD_PTR dwCallbackInstance為傳遞給回調函數的數據,以回調函數的參數方式傳遞。注意:若回調方式為窗口方式,該項不適用。
- DWORD fdwOpen用於打開一些該函數中定義的選項,通常為0。
函數返回值:
- 若函數正常調用,返回值為0,其中可能的錯誤及返回值為︰
- MMSYSERR_BADDEVICEID = 2; {設備ID超界};
- MMSYSERR_ALLOCATED = 4; {指定的資源已被分配};
- MMSYSERR_NODRIVER = 6; {沒有安裝驅動程序};
- MMSYSERR_NOMEM = 7; {不能分配或鎖定內存};
- WAVERR_BADFORMAT = 32; {設備不支持請求的波形格式}
以上內容來自WINAPI。
waveInPrepareHeader、waveInAddBuffer、waveInStart、waveInReset及waveInClose。
在一個標準的通過波形聲音輸入設備記錄聲音的程序中,函數應該按照以下順序調用:獲取波形聲音輸入設備,設置波形聲音格式;waveInOpen,打開波形聲音輸入設備;waveInPrepareHeader,為波形聲音輸入設備準備一個緩衝區;waveInAddBuffer 向波形聲音輸入設備添加緩衝區;waveInStart 開始錄音。
在使用waveInOpen這個函數之前,應該設置一個類型為HWAVEIN的變量,傳遞給該函數來記錄輸入設備的句柄,並在之後的函數中使用,同時應通過uDeviceID和pwfx指定設備和聲音格式,其中WINAPI中給予聲音格式。 *WAVEFORMATEX之原形為︰
typedef struct { WORD wFormatTag;{指定格式类型; 默认 WAVE_FORMAT_PCM = 1;} WORD nChannels;{指出波形数据的声道数; 单声道为 1, 立体声为 2} DWORD nSamplesPerSec;{指定采样频率(每秒的样本数)} DWORD nAvgBytesPerSec;{指定数据传输的传输速率(每秒的字节数)} WORD nBlockAlign;{指定块对齐块对齐是数据的最小单位} WORD wBitsPerSample;{采样大小} WORD cbSize;{附加信息的字节大小} } WAVEFORMATEX; fdwOpen中记录了可以打开的选项,其可选值为 WAVE_FORMAT_QUERY = $0001; {判断设备是否支持给定的格式, 并不打开} WAVE_ALLOWSYNC = $0002; {当是同步设备时必须指定} CALLBACK_WINDOW = $00010000; {当 dwCallback 是窗口句柄时指定} CALLBACK_FUNCTION = $00030000; {当 dwCallback 是函数指针时指定}
通常用於指定函數回調方式(以窗口方式或回調函數方式)
當指定函數回調方式為回調函數時,需定義回調函數,其原形為:
void CALLBACK waveInProc( HWAVEIN hwi, //声音输入设备句柄 UINT uMsg, //产生的消息,由系统给出 DWORD dwInstance,//在waveinopen中给出要传递给该函数的数据 DWORD dwParam1, //附加数据1 DWORD dwParam2 //附加数据2 );
注意事項:
- 該函數不能為動態生成的函數,所以一般情況下不能作為類的成員函數,但可以作為靜態函數,此時可通過dwInstance傳遞類的地址。
- 可以處理的消息有:
- WIM_OPEN 錄音設備打開
- WIM_CLOSE 錄音設備關閉
- WIM_DATA 數據緩存區被寫滿
當消息類型為WIM_DATA時,dwParam1中為指向被寫滿的header的首地址,此時可以讀取寫入的數據。