当前位置:   article > 正文

windows下使用waveOut播放音频pcm_waveoutopen 播放

waveoutopen 播放

目录

一、前言

二、waveOut主要API介绍

三、waveOut播放PCM音频框架

《Windows平台使用waveOut播放PCM数据代码实现》链接:

https://edu.csdn.net/learn/38258/606147?spm=1003.2001.3001.4157

一、前言

       在<windows下directShow音视频采集>一篇文章中就介绍了windows下通过directShow音视频采集的流程。windows下directShow不仅可以对音进行采也可以对音频进行播放,但是directShow使用过程较为复杂,所以本文将介绍windows下使用WAVE播放音频的过程。在微软的官方SDK文档说明中就对WAVE播放音频的API做了详细的介绍,连接为<wave播放音频的API介绍>。

二、waveOut主要API介绍

1、waveOutOpen()

        waveOutOpen函数的详细定义如下,该函数用于打开用于播放音频的输出设备。

  1. MMRESULT waveOutOpen(
  2. LPHWAVEOUT phwo,
  3. UINT uDeviceID,
  4. LPCWAVEFORMATEX pwfx,
  5. DWORD_PTR dwCallback,
  6. DWORD_PTR dwInstance,
  7. DWORD fdwOpen
  8. );

     参数是phwo是存放wave音频输出设备的句柄的指针;

     参数uDeviceID是wave设备标识ID,当参数为WAVE_MAPPER时候标识可以播放给定格式的音频数据。

    参数pwfx用于设置要播放的音频数据格式。其结构体类型WAVEFORMATEX定义如下。

  1. typedef struct tWAVEFORMATEX
  2. {
  3. WORD wFormatTag; /* format type */
  4. WORD nChannels; /* number of channels (i.e. mono, stereo...) */
  5. DWORD nSamplesPerSec; /* sample rate */
  6. DWORD nAvgBytesPerSec; /* for buffer estimation */
  7. WORD nBlockAlign; /* block size of data */
  8. WORD wBitsPerSample; /* number of bits per sample of mono data */
  9. WORD cbSize; /* the count in bytes of the size of */
  10. /* extra information (after cbSize) */
  11. } WAVEFORMATEX;

      参数dwCallback用于指定回调的机制;当前支持的回调机制包含如下;

指向回调函数的指针A pointer to a callback function
窗口的句柄A handle to a window
线程标识符A thread identifier
事件的句柄A handle to an event
值为 NULLNULL

     参数dwInstance用于传递给回调机制的用户实例数据。

     参数fdwOpen用于打开设备的标志。其值如下(部分)

Value含义
CALLBACK_EVENTdwCallback 参数是事件句柄。
CALLBACK_FUNCTIONdwCallback 参数是回调过程地址。
CALLBACK_NULL无回调机制。 这是默认设置。
CALLBACK_THREADdwCallback 参数是线程标识符。
CALLBACK_WINDOWdwCallback 参数是窗口句柄。

2、waveOutPrepareHeader()

      waveOutPrepareHeader函数的定义如下,该函数用于准备wave音频数据块以供播放。

  1. MMRESULT waveOutPrepareHeader(
  2. HWAVEOUT hwo,
  3. LPWAVEHDR pwh,
  4. UINT cbwh
  5. );

      参数hwo为wave音频输出设备的句柄,即waveOutOpen的第一个参数值。

      参数pwh指向要发送的音频数据。其结构体定义如下。

  1. /* wave data block header */
  2. typedef struct wavehdr_tag {
  3. LPSTR lpData; /* pointer to locked data buffer */
  4. DWORD dwBufferLength; /* length of data buffer */
  5. DWORD dwBytesRecorded; /* used for input only */
  6. DWORD_PTR dwUser; /* for client's use */
  7. DWORD dwFlags; /* assorted flags (see defines) */
  8. DWORD dwLoops; /* loop control counter */
  9. struct wavehdr_tag FAR *lpNext; /* reserved for driver */
  10. DWORD_PTR reserved; /* reserved for driver */
  11. } WAVEHDR;

       参数cbwh为WAVEHDR 结构的大小,通常取值为sizeof(WAVEHDR)。

3、waveOutWrite()

       waveOutWrite函数的定义如下,该函数用于发送一个数据给音频播放设备。

  1. MMRESULT waveOutWrite(
  2. HWAVEOUT hwo,
  3. LPWAVEHDR pwh,
  4. UINT cbwh
  5. );

    参数hwo为wave音频输出设备的句柄,即waveOutOpen的第一个参数值。

    参数pwh指向要发送的音频数据。

    参数cbwh为WAVEHDR 结构的大小,通常取值为sizeof(WAVEHDR)。

  4、除了上诉三个API,在使用wave播放PCM音频还会用到CreateEvent、CloseHandle和WaitForSingleObject函数。CreateEvent用于创建事件。CloseHandle用于关闭事件。WaitForSingleObject用于观察线程信号状态,当线程信号状态为事件则返回;其定义如下

  1. WaitForSingleObject(
  2. _In_ HANDLE hHandle,
  3. _In_ DWORD dwMilliseconds
  4. );

      参数hHandle为CreateEvent创建事件的句柄;

      参数dwMilliseconds为超时等待的参数。

5、waveOutClose(_In_ HWAVEOUT hwo)

     该函数用于关闭已经打开的wave音频播放设备。

     参数hwo为wave音频输出设备的句柄;

三、waveOut播放PCM音频框架

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/995085
推荐阅读
相关标签
  

闽ICP备14008679号