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的首地址,此時可以讀取寫入的數據。