跳转到内容

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的首地址,此时可以读取写入的数据。