最近在写录音的程序,网上找了些代码,不能响应MM_WIM_DATA消息(写错了消息处理函数的位置了(晕死)),只能在msdn上找找一些接口的使用了,顺便做下笔记:
(1)UINT waveInGetNumDevs(VOID); 是用来获取当前的录音设备的数目,只要简单调用就好,返回值为录音设备的数目
(2)
MMRESULT waveInGetDevCaps(
UINT_PTR uDeviceID,
LPWAVEINCAPS pwic,
UINT cbwic
); 这个是用来获取录音设备的一些详细信息,包括录音设备的名称,出厂标识(MMREG.h 文件中有很多定义好的),暂且这样理解,(对于uDeviceID,参数 可以调用
MMRESULT waveInGetID(
HWAVEIN hwi,
LPUINT puDeviceID
);
这个函数来获取 , HWAVEIN hwi, 是通过OPen一个录音设备然后返回的 )好像不对 看waveinopen的解释是感觉有些矛盾
暂时用WAVE_mapper, The function selects a waveform-audio input device capable of recording in the specified format.
(3)
waveinopen()
MMRESULT waveInOpen(
LPHWAVEIN phwi, OUT 返回打开的录音设备的句柄
UINT_PTR uDeviceID, WAVE_MAPPER
LPWAVEFORMATEX pwfx,
DWORD_PTR dwCallback,
DWORD_PTR dwCallbackInstance,
DWORD fdwOpen
);
//
Use the waveInGetNumDevs function to determine the number of waveform-audio input devices present on the system. The device identifier specified by uDeviceID varies from zero to one less than the number of devices present. The WAVE_MAPPER constant can also be used as a device identifier.
If you choose to have a window or thread receive callback information, the following messages are sent to the window procedure or thread to indicate the progress of waveform-audio input: MM_WIM_OPEN, MM_WIM_CLOSE, and MM_WIM_DATA.
If you choose to have a function receive callback information, the following messages are sent to the function to indicate the progress of waveform-audio input: WIM_OPEN, WIM_CLOSE, and WIM_DATA.
录音开始后会发送: MM_WIM_OPEN, MM_WIM_CLOSE, and MM_WIM_DATA 到你定义的处理过程,可以是窗口,线程或者是自定义的处理函数 。
typedef struct {
WORD wFormatTag; WAVE_FORMAT_PCM
WORD nChannels; //声道 1单声道,2立体声 需要去准备两个缓存分别录制
DWORD nSamplesPerSec; //采样频率 一般为8.0 kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz.
DWORD nAvgBytesPerSec; //每秒采样数据量 :为采样频率×nBlockAlign;
WORD nBlockAlign; //最小的数据块 在录音时处理的数据量是最小块的倍数 声道×wBitsPerSample/8;
WORD wBitsPerSample; //采样大小,8位,16位,32位
WORD cbSize; 额外的数据信息 可以忽略
} WAVEFORMATEX;
(4) 准备一个缓存区 ,我的理解是说应该是开辟一个缓存区,还有标记下缓存的状态,主要任务是修改dwFlags的状态为:那个...
The waveInPrepareHeader function prepares a buffer for waveform-audio input.准备一个缓存,为波形设备的输入
MMRESULT waveInPrepareHeader(
HWAVEIN hwi,
LPWAVEHDR pwh, The WAVEHDR structure defines the header used to identify a waveform-audio buffer。
UINT cbwh
);
typedef struct {
LPSTR lpData;
DWORD dwBufferLength;
DWORD dwBytesRecorded; //录音时,记录当前缓冲区的数据量
DWORD_PTR dwUser;
DWORD dwFlags;
DWORD dwLoops; //Number of times to play the loop. This member is used only with output buffers
struct wavehdr_tag * lpNext; //保留
DWORD_PTR reserved;
} WAVEHDR;
(5) 将准备好的HDR结构与录音设备绑定 。
WaveInaddBuffer()
MMRESULT waveInAddBuffer(
HWAVEIN hwi,
LPWAVEHDR pwh,
UINT cbwh
);
传递的WAVEHDR必须是waveInPrepareHeader 准备好的HDR 。
(6) 准备好之后就可以调用
waveinStart 录音了 。
(7)
MM_WIM_DATA
这是在缓存区被写满后或者停止录音时 就会响应的消息,这时候可以读出缓存中的录音数据,将数据保存到多媒体文件,然后重新准备一块缓存 。