Waveform Audio[译]

最近要做远程控制的语音部分。。。。把WaveForm Audio看一篇。翻译一下。。总体分三个小节

  • About Waveform Audio
  • Using Waveform and Auxiliary Audio
  • Waveform Audio Reference

    一、关于波形音频

    增加声音到你的应用程序中,把它变得更加实用的有趣。你可以通过使用声音在关键步骤提高用户的效率,帮助他们避免出错,或者让他们知道操作已经结束。你可以帮助他们找到更多的乐趣通过增加音乐或者声音。

    有几种方法可以通过使用波形音频增加声音到你的程序中。最简单的方法使用PlaySound函数。大多数的其它的方法都通过低级的API实现。使用mci函数可以方便的把声音增加到你的程序中,它比使用低级音频函数要速度。

    要获得更加多的信息,看下列主题:

    PlaySound函数

    你可以使用PlaySound函数播放音频波形文件。

    PlaySound函数允许你指定一个声音文件通过以下三种方式:

    作为系统提醒,使用在WIN.INI文件或注册表中的系统别名

    ②使用文件名

    ③作为一个资源ID

    PlaySound函数允许你连续的循环播放声音直至你再次调用PlaySound函数,指定Null或资源ID在pszsound参数中

    你可以使用PlaySound同步或异步播放声音,使用函数控制它们的行为当它必须共享系统资源

    .波形音频接口

    下列主题描述波形音频接口,这是使用的应用程序,需要最大限度地控制音频设备。这些函数和接口的结构以”wave”为命名前缀。

    1.设备和数据类型

    本节介绍波形音频设备,包括怎么打开,关闭和查询设备的能力。同时还介绍了怎样通过设备句柄和设备标识符在系统中跟踪设备。

    打开波形音频输出设备

    通过使用waveOutOpen函数打开一个波形音频设备播放。这个函数通过指定一个设备标识符附加到打开的设备上,返回一个打开设备的句柄。

    一些多媒体计算机有多个波形音频输出设备,除非你想在系统中打开指定的波形音频输出设备,你必须在打开设备时使用WAVE_MAPPER标志标识打开的设备。waveOutOpen函数选择一个系统中最佳的设备播放指定的数据格式。

    查询音频设备

    Windows提示了以下函数决定系统中有多少个设备可用

    函数                                                           描述

    auxGetNumDevs                                      选取一些系统中存在的辅助输出设备

    WaveInGetNumDevs                                 选取一些系统中存在的波形音频输入设备

    WaveOutGetNumDevs                             选取一些系统中存在的波形音频输出设备

    音频设备通过一个设备标识符来标识。设备标识符由系统中的设备数目决定。设备标识符的范围从0到最少1个在现在的设备数目中。例如,如果你的系统中有两个波形音频输出设备,可用的设备标符识从0到1.

    当你确定系统中有多少个设备类型时,你可以使用下列其中之一的函数来查询每一个设备的能力:

    函数                                       描述

    auxGetDevCaps                      返回一个输出设备的能力

    waveinGetDevCaps                返回一个波形音频输入设备的能力

    waveOutGetDevCaps             返回一个波形音频输出设备的能力

    下列的每一个函数填充一个指定设备能力的数据结构。下列表格列出了数据结构相对应的函数

    函数                                        结构

    auxgetDevCaps                       AUXCAPS

    waveInGetDevCaps                 WAVEINCAPS

    waveOutGetDevCaps               WAVEOUTCAPS

    标准的格式列在WAVEOUTCAPS结构成员的dwFormats中。波形音频设备可以支持一个非标准的格式。为了确定一个特殊的格式是否被这个设备支持,你可以指定WAVE_FORMAT_QUERY标志调用waveOutOpen 函数。这个标志位不会打开设备。你指定的格式问题的WAVEFORMATEX结构所指向pwfx参数传递给waveOutOpen 。关于如何设备这个结构,请看设备和数据类型一节。

    波形音频输出设备的能力不同,结构WAVEOUTCAPS中的dwSupport成员声明一个设备是否支持这样的能力,如:声音调节等

    设备句柄和设备标识符

    每个函数打开一个音频设备指定一个设备标识符,一个指向内存的指针,一些参数惟一的确定一个设备。这个内存的位置填充了一个设备句柄。通过使用这个设备句柄当调用其它声频函数时来标识一个打开设备。

    音频设备标识符和句柄的区别是微妙但是很重要:

    ①设备标识符确定一个明确的设备数字在一个系统中。这个数字通过auxGetNumDevs,auxInGetNumDevs或者waveOutGetNumDevs函数

    ②当一个设备驱动通过waveInOpen或waveOutOpen函数打开时,返回一个设备句柄。

    没有函数打开或关闭辅助音频设备。辅助音频设备同波形音频设备一样不需要被打开或被关闭,因为没有持续的数据与它们联系。所有的辅助音频函数使用设备标识符来标识设备。

    波形音频输出数据类型

    类型                   描述

    HWAVEOUT                                                        波形音频输出设备的句柄

    WAVEFORMATEX                                               波形音频设备所支持的指定的结构体,

    WAVEHDR                                                          波形音频输入数据的结构体头

    WAVEOUTCAPS                                                经常用作查询特殊波形音频输出设备能力

    指定波形音频数据类型

    当你调用waveOutOpen函数打开个设备驱动来播放或者查询驱动是否支持特殊的数据格式,用pwfx参数来指定一个指向WAVEFORMATEX的结构的指针继续波形音频格式的请求。WAVEFORMATEX结构是一个扩展的WAVEFORMAT结构。它包括WAVEFORMAT所有的成员,并且增加了两个新成员:wBitsPerSample成员,它包含了额外的PCM格式信息,cbSize成员在最后。你可以随着cbSize增加数据到结构中,填写的大小的cbSize的数据。你可以使用WAVEFORMATEX结构来描述PCM数据,虽然你可以使用PCMWAVEFORMAT结构。当波形音频格式类型不是PCM时,你必须使用WAVEFORMATEX来代替WAVEFORMAT。

    过时的WAVEFORMAT结构不包括所有描述PCM格式的信息。PCMWAVEFORMAT结构包括一个WAVEFORMAT结构随着增加一个新成员包括PCM所指定的信息。PCMWAVEFORMAT结构也被WAVEFORMATEX结构所取代.

    写时波形音频数据

    在成功打开波形音频输出设备驱动后,你可以开始播放声音,Windows提供waveOutWrite函数来发送数据块给波形音频输出设备。

    使用WAVEHDR结构来指定你用waveOutWrite发送的波形音频数据块。这个结构包括一个指向锁定的数据块的指针,这个数据块的大小和一些标志。这个数据块必须在你使用之前准备。更多的关于准备数据块的信息,请参考Audio Data Blocks

    在你使用waveOutWrite发送一个数据块到输出设备后,你必须等待直到设备驱动完成完成数据块释放之前,如果你发送多个数据块,你必须监测完成的数据块来知道何时增加额外的数据块,更多的信息,请看Audio Data Blocks.

    PCM波形音频数据格式

    在WAVEHDR结构中lpData结构成员指向一个波形音频数据采样,对于8位的PCM数据,每一个样本代表单一的无符号数据字节,对于16位PCM数据,每一个样本代表一个16位的有符号数值。以下表格总结了最大,最小和适中的PCM波形音频数据数值。

    数据格式                   最大值                 最小值                    适中的值

    8位PCM                       255                       0                              128

    16位PCM                       32767                -32768                         0

    PCM数据包

    关闭波形音频输出设备

    在完成波形音频播放之后,调用waveOutclose函数来关闭输出设备,如果在波形音频文件正在播放时调用waveOutClose,关闭操作将会失败,函数会返回一个错误代码来表明设备没有被关闭。如果你不想等到播放完就关闭设备,调用waveOutreset函数来关闭,这个允许结构播放和关闭设备。确定在关闭之前使用waveOutUnprepareHeader函数来清除所有准备好的数据块。

    2.播放波形音频文件

    在你的应用程序中使用函数,宏以及消息来播放声音是非常容易的。技术和内容文档在这里只能操作波形音频。如果你想增加音乐到你的应用程序中,不关心别的种类的声音,你也许可以使用MIDI。对于播放MIDI音乐的讨论,请看MCIWnd Windows Class。对于MIDI接口的讨论,请看Musical Instrument Digital Interface (MIDI)..

    你可以调用以下的函数在你的程序中播放波形音频。

    函数                                                  描述

    MessageBeep                                    播放指定的系统提醒声音

    sndPlaySound                                    播放系统注册表中或指定的文件名的声音

    PlaySound                                          提供所有sndPlaySound的功能和直接通过资源

    MessageBeep是一个标准的Win32 API函数,因为它的能力非常有限,它的文档在别的地方,这里不再讨论。

    函数列表提供以下的方法来播放波形音频:

    ①通过系统级别来播放波形音频文件。

    ②播放注册表中指定的波形音频文件。

    ③播放内存中的WAVE资源

    ④播放存储在硬盘上或CD-ROM中的波形音频文件

    sndPlaySound和PlaySound函数加载一个波形音频文件到内存中,限制它所能播放的大小。使用sndPlaySound和PlaySound来播放一个相对较小的波形音频文件,最大约为100K。这两个函数同样也接受格式化可播放的声音数据,包括音频mapper.

    对于大的声音文件,使用MCI服务,更多的信息,看MCI.

    使用Windows消息来控制波形音频播放

    以下的消息可以被发送到一个窗口消息过程函数来控制波形音频的播放。

    消息                                描述

    MM_WOM_CLOSE                        使用waveOutclose函数设备关闭时被发送

    MM_WOM_DONE                          使用waveOutWrite函数时设备驱完成数据块的时被发送

    MM_WOM_OPEN                          使用waveOutOpen函数时设备打开时被发送

    参数wParam和lParam附加在消息上。wParam参数总是指定一个打开的波形音频设备的句柄。对于MM_WOM_DONE消息,lParam参数指定了一个指向WAVEHDR结构的指针,指明完成的数据块。lParam参数对于MM_WOM_CLOSE和MM_WOM_OPEN消息来说是无用的。

    最有用的消息可能是MM_WOM_DONE.当播放数据块完成时发送该消息。你可以清除和释放数据块。除非你需要分配内存和初始化变量,否则你不必处理MM_WOM_OPEN和MM_WOM_CLOSE消息。

    波形音频输出设备回调函数由应用程序提供。更多的关于回调函数,请看waveOutProc函数。

    检索当前播放的位置

    当波形音频正在播放时,你可以监测当前播放的文件的位置通过waveOutGetPositon函数。

    对于波形音频设备,样本是首选的时间格式,其中代表当前的位置。current position of a waveform-audio device is specified as the number of samples for one channel from the beginning of the waveform-audio file。为了查询当前波形音频设备的位置,设置MMTIME结构的wType成员TIME_SAMPLES,通过这个结构waveOutGetPosition.

    MMTIME结构代表时间的不同格式,包括微秒,样本,SMPTE和MIDI声音指针格式。wType成员指定现在的格式。在调用使用MMTIME结构的函数之前,你必须wtype来表明你接受的时间格式。在函数调用之后检查wType,确定时间格式被支持。如果时间格式不被支持,设备驱动程序在指定时间的替代格式和时间变化的wType成员到选定的时间格式。

    停止,暂停和重新播放

    当波形音频正在播放的时候,你可以停止和暂停。当播放被暂停时,你可以重新播放它。Windows提供以下的函数来控制波形音频播放。

    函数                                                描述

    waveOutPause                                 在一个波形音频输出设备上暂停播放

    waveOutReset                                 在一个波形音频输出设备上停止播放和标识所有候选的数据完成

    waveOutRestart                               在一个波形音频输出设备上重新开始播放

    使用waveOutPause暂停一个波形音频设备可能不是瞬时的,驱动可以会在暂停之前结束当前播放的数据块。

    通常,当使用waveOutWrite函数发送第一个波形音频数据块的时候,波形音频设备开始播放。如果你不想声音立刻播放,调用waveOutWrite之前调用waveOutPause。这样,当你想开始播放波形音频数据时,调用waveOutRestart.

    一个已经通过waveOutReset停止的设备你不可以使用waveOutRestart来重新开始设备。你必须使用waveOutWrite来发送第一个数据块来恢复设备上的播放。

    循环播放

    循环播放声音由WAVEHDR结构的dwLoops和dwFlags成员控制的。设置WHDR_BEGINLOOP和WHDR_ENDLOOP标志在成员dwFlags中指定开始的结束的循环数据块。

    为了循环一个单一的数据块,指定两个标志指向相同的块。为了指定循环的数目,指定WAVEHDR结构的中dwLoops成员为第一个循环的数据块。

    你可以调用waveOutBreakLoop函数来停止循环播放。

    改变波形音频播放音量

    windows提供下列函数来查询和设置波形音频输出设备的音量:

    函数                                                     描述

    waveOutGetVolume                             返回所指定的波形音频输出设备的音量等级

    waveOutSetVolume                              设置所指定的波形音频输出设备的音量等级

    不是所有的波形音频设备支持音量改变。一些设备支持左声道和右声道声音控制。

    一些应用程序允许用户控制系统中所有的音频设备音量,除非你的应用程序有控制这种类型设备的能力,否则你应该在改变它的音量前打开设备。你同样应该先查询音量,然后再改变它,尽快的恢复它原先的音量等级。

    音量用一个DWORD类型来指定。当音频格式为立体声,高16位指定右声道音量,低16位指定左声道音量。对于那些不支持左右声道的设备,低16位指定音量等级,高16位忽略。

    改变音调和播放速率

    一些波形音频输出设备可以有多种音和播放速率。并不是所有的波形音频设备支持音调和播放速率的调节。

    改变音调和播放速率的不同有以下几个方面:

    改变播放速度是由设备驱动程序并不需要指定硬件。 样本速率是不能改变的,但是可以通过驱动进行插值或综合样本。

    改变音调需要指定硬件。播放速率和样本速率并不改变。

    Windows提供以下几个函数来查询和改变波形音频音调和播放速率

    函数                                                        描述

    waveOutGetPitch                                     返回指定波形音频输出设备的音调

    waveOutGetPlaybackRate                       返回指定波形音频输出设备的播放速率

    waveOutSetPitch                                     设置指定波形音频输出设备的音调

    waveOutSeetPlaybackRate                     设置指定波形音频输出设备的播放速率

    录制波形音频

    如果MCI波形音频服务不适合你的应用程序,你可以使用波形音频服务来录制波形音频。

    波形音频输入数据类型

    以下的数据类型定义了波形音频输入函数:

    类型                                              描述

    HWAVEIN                                      已打开的波形音频输入设备的句柄

    WAVEFORMATEX                          波形音频输入设备所支持的数据格式的结构体。这个结构同样也适用于波形音频输出设备

    WAVEHDR                                     波形音频输入设备的数据块的HEADER。这个结构也同样适用输出设备

    WAVEINCAPS                                这个结构体被用作来查询波形音频输入设备的能力

    查询波形音频输入设备

    在录制波形音频之前,你应该调用waveInGetDevCaps函数来确定波形音频输入设备的能力。这个函数填充WAVEINCAPS结构体关于所有指定的设备。这个信息包括制造商和产品标识,设备的产品名字和设备驱动的版本号。

    此外,WAVEINCAPS结构体提供设备支持的标准波形音频信息。
    打开波形音频输入设备

    使用waveInOpen函数打开一个波形音频输入设备来录制。这个函数打开设备并附加所指定的设备标识符,返回一个打开设备的句柄。

    一些多媒体计算机有多个波形音频输入设备。除非你知道你想打开一个指定的波形音频设备,否则你应该使用WAVE_MAPPER的标识符当你打开一个设备的时候。waveInOpen函数选择一个系统中最好的设备来录制指定的数据格式。

    管理波形音频录制

    在你打开一个波形音频输入设备之后,你可以开始录制波形音频数据。波形音频数据将会被录制进应用程序所提供的由WAVEHDR结构体所指定的缓冲区中。这些数据块必须先准备然后使用。关于更多的信息,请看Audio Data Blocks

    Windows提供以下的函数来管理波形音频录制

    函数                                            描述

    waveInAddBuffer                         发送一个缓冲区到设备驱动中,使它可以录制波形音频数据

    waveInReset                                停止一个波形音频录制和标识所有的缓冲动已完毕

    waveInStart                                  开始一个波形音频录制

    waveInStop                                   停止一个波形音频录制

    使用waveInAddBuffer函数来增加一个缓冲区到设备驱动中。当缓冲区中填满波形音频数据时,应用程序发送一个windows消息,回调消息,线程消息,或事件,由打开设备时所指定的标志所决定。

    在你开始录制时使用waveInStart,你应该发送至少一个缓冲区动到驱动中,否则到来的数据将会丢失。

    在你使用waveInClose函数关闭设备之前,你应该调用waveInReset来标识所有的数据块已经准备好。

    使用windows消息来管理波形音频录制

    以下的消息被发送到windows窗口过程函数中用来管理波形音频录制。

    消息                                                描述

    MM_WIM_CLOSE                             当使用waveInClose函数关闭设备时被发送

    MM_WIM_DATA                               使用waveInAddBuffer函数,当设备驱动完成缓冲区的填充时被发送

    MM_WIM_OPEN                               当使用waveInOpen函数打开设备时被发送

    MM_WIM_DATA消息的lParam参数指向一个WAVEHDR结构标识一个缓冲区。这个缓冲区可能不会完全填充波形音频数据;在缓冲区被填满之前录像会被停止。使用WAVEHDR结构的dwBytesRecorded成员来决定当前可用缓冲区可用的数据。

    最有用的消息可能是MM_WIM_DATA。当你的应用程序使用完设备驱动所发送的数据块,你可以消除和释放数据块。除非你需要分配内存或者初始化变量,你可能不需要使用MM_WIM_OPEN和MM_WIM_CLOSE消息。

    波形音频输入设备的回调函数由应用程序提供。更多关于回调函数,请看waveInProc函数

    辅助音频接口

    辅助音频设备是音频输出设备在多媒体计算机上输出由MIDI和波形音频输出设备的混合。一个辅助音频设备是CD从CD-ROM驱动输出。

    查询辅助音频设备

    不是所有的多媒体系统支持辅助音频。你可以使用auxGetNumDevs函数来确定当前系统中有多少个辅助设备。

    为了得到更多的关于辅助音频设备。使用auxGetDevCaps函数。这个函数填充一个AUXCAPS结构体的信息,这个结构体的信息是指定设备的能力。这个信息包括制造商和产品标识符,设备产品名称和设备驱动版本号。

    改变辅助音频设备的音量

    windows提供以下函数来查询和设置辅助音频设备的音量:

    函数                                                         描述

    auxGetVolume                                          返回当前所指定的辅助输出设备的音量设置

    auxSetVolume                                           设置当前所指定的辅助输出设备的音量

    并不是所有的辅助音频设备支持音量的改变。一些设备可以支持左声道和右声道的音量改变。

    音量是一个指定的DWORD值,同波形音频和MIDI音量控制一样。当一个音频格式是立体声,高16位指定右声道音量,低16位指定左声道音量。对于那些不支持左右声道的设备,低16位指定声音等级,高16位忽略。