目录
一、前言
二、waveOut主要API介绍
三、waveOut播放PCM音频框架
《Windows平台使用waveOut播放PCM数据代码实现》链接:
https://edu.csdn.net/learn/38258/606147?spm=1003.2001.3001.4157
在
1、waveOutOpen()
waveOutOpen函数的详细定义如下,该函数用于打开用于播放音频的输出设备。
MMRESULT waveOutOpen(
LPHWAVEOUT phwo,
UINT uDeviceID,
LPCWAVEFORMATEX pwfx,
DWORD_PTR dwCallback,
DWORD_PTR dwInstance,
DWORD fdwOpen
);
参数是phwo是存放wave音频输出设备的句柄的指针;
参数uDeviceID是wave设备标识ID,当参数为WAVE_MAPPER时候标识可以播放给定格式的音频数据。
参数pwfx用于设置要播放的音频数据格式。其结构体类型WAVEFORMATEX定义如下。
typedef struct tWAVEFORMATEX
{
WORD wFormatTag; /* format type */
WORD nChannels; /* number of channels (i.e. mono, stereo...) */
DWORD nSamplesPerSec; /* sample rate */
DWORD nAvgBytesPerSec; /* for buffer estimation */
WORD nBlockAlign; /* block size of data */
WORD wBitsPerSample; /* number of bits per sample of mono data */
WORD cbSize; /* the count in bytes of the size of */
/* extra information (after cbSize) */
} WAVEFORMATEX;
参数dwCallback用于指定回调的机制;当前支持的回调机制包含如下;
指向回调函数的指针 | A pointer to a callback function |
窗口的句柄 | A handle to a window |
线程标识符 | A thread identifier |
事件的句柄 | A handle to an event |
值为 NULL | NULL |
参数dwInstance用于传递给回调机制的用户实例数据。
参数fdwOpen用于打开设备的标志。其值如下(部分)
Value | 含义 |
---|---|
CALLBACK_EVENT | dwCallback 参数是事件句柄。 |
CALLBACK_FUNCTION | dwCallback 参数是回调过程地址。 |
CALLBACK_NULL | 无回调机制。 这是默认设置。 |
CALLBACK_THREAD | dwCallback 参数是线程标识符。 |
CALLBACK_WINDOW | dwCallback 参数是窗口句柄。 |
2、waveOutPrepareHeader()
waveOutPrepareHeader函数的定义如下,该函数用于准备wave音频数据块以供播放。
MMRESULT waveOutPrepareHeader(
HWAVEOUT hwo,
LPWAVEHDR pwh,
UINT cbwh
);
参数hwo为wave音频输出设备的句柄,即waveOutOpen的第一个参数值。
参数pwh指向要发送的音频数据。其结构体定义如下。
/* wave data block header */
typedef struct wavehdr_tag {
LPSTR lpData; /* pointer to locked data buffer */
DWORD dwBufferLength; /* length of data buffer */
DWORD dwBytesRecorded; /* used for input only */
DWORD_PTR dwUser; /* for client's use */
DWORD dwFlags; /* assorted flags (see defines) */
DWORD dwLoops; /* loop control counter */
struct wavehdr_tag FAR *lpNext; /* reserved for driver */
DWORD_PTR reserved; /* reserved for driver */
} WAVEHDR;
参数cbwh为WAVEHDR 结构的大小,通常取值为sizeof(WAVEHDR)。
3、waveOutWrite()
waveOutWrite函数的定义如下,该函数用于发送一个数据给音频播放设备。
MMRESULT waveOutWrite(
HWAVEOUT hwo,
LPWAVEHDR pwh,
UINT cbwh
);
参数hwo为wave音频输出设备的句柄,即waveOutOpen的第一个参数值。
参数pwh指向要发送的音频数据。
参数cbwh为WAVEHDR 结构的大小,通常取值为sizeof(WAVEHDR)。
4、除了上诉三个API,在使用wave播放PCM音频还会用到CreateEvent、CloseHandle和WaitForSingleObject函数。CreateEvent用于创建事件。CloseHandle用于关闭事件。WaitForSingleObject用于观察线程信号状态,当线程信号状态为事件则返回;其定义如下
WaitForSingleObject(
_In_ HANDLE hHandle,
_In_ DWORD dwMilliseconds
);
参数hHandle为CreateEvent创建事件的句柄;
参数dwMilliseconds为超时等待的参数。
5、waveOutClose(_In_ HWAVEOUT hwo)
该函数用于关闭已经打开的wave音频播放设备。
参数hwo为wave音频输出设备的句柄;