DirectSound学习1

来源:互联网 发布:网络协议的主要要素 编辑:程序博客网 时间:2024/05/16 04:34

DirectSound介绍

DirectSound封装了大量的音频处理PAPI函数,它可以提供快速的混音,硬件加速功能,并可以直接访问相关设备。允许用户最大效率地使用硬件,并拥有良好的兼容性。用DirectSound可以实现下列功能:

  • 播放WAV格式的声音文件或资源

  • 同时播放多路声音

  • 在硬件控制的缓冲区中指定声音播放的优先级

  • 在3D环境中设定某个声音的位置

  • 在声音中增加一些效果,如回声和齐声等,并且可以改变这些效果的参数

  • 从麦克风或其他拾音设备中捕捉声音并保存为WAV文件

DirectSound 基本结构

DirectSound的结构模块通常包括播放,回放,三位音效,音频捕获,硬件抽象层和硬件仿真层等。DirectSound的体系结构如下图所示:
这里写图片描述

  1. 音频的播放

DirectSound缓冲区对象表示一个包含音频数据的缓冲区,这些数据以PCM格式被存储。该对象不仅可以用于开始,停止和暂停音频的播放,还能够设置音频数据中频率和格式等属性。缓冲区中包括主缓冲区和次缓冲区。主缓冲区是听者将要听到的信号,一般是次缓冲区中信号混音后的结果,而次缓冲区中存放着许多单独的音频信号,有的可以直接播放,有的要混音,有的循环播放。主缓冲区DirectSound自动创建,而次缓冲区需要应用程序来创建。DirectSound将次缓冲区中的音频混合后存入主缓冲去,再输出到相应的播放设备。

2.DirectsSound回放

directsound缓存用于控制回放声音的开始,停止,暂停,回放声音时声音数据存放在DirectSound缓存中。DirectSound将声音缓冲区分为主缓冲区和次缓冲区主缓冲区只有一个,直接与硬件相关,用于存放播放的数据。次缓冲区可以有多个,一个次缓冲区存放一路播放数据,次缓冲区的数据只有在主缓冲区上才能播放。一个次声音缓冲区对象代表一个声源,回放时将要播放的声音数据混合到主缓冲区中,由主缓冲区送到音频输出设备,这样就可以实现混音。

3.3D音效

DirectSound可以创建一个与3D图像结合的3D世界。应用程序指定声源和3D听众的空间位置,可以让移动的声音产生多普勒效应和控制一些声音随距离衰减速度等参数。通过三维坐标来表示声源的方向,位置,传播速度及3D听众的位置;可以通过DirectSound 3D缓冲区来获得具有震撼力的3D音效。

4.DirectSound捕获

DirectSound对象可以查询音频捕获设备的性能,并为从输入源到捕获音频而创建缓冲区。

DirectSound编程步骤

1.创建一个设备对象

通过调用DirectSoundCreate8函数来创建一个支持IDirectSound8接口的对象,这个对象通常代表默认的播放设备。也可以枚举可用的设备,然后将设备的GUID传递给DirectSoundCreate函数.
DirectSound虽然是COM的,但是并不需要初始化COM库,这些DirectSound都已经做好了。当然,如果用户使用DMOs特技,就需要自己初始化COM库

2.创建一个次缓冲区

通过调用IDirectSound8::CreateSoundBuffer函数来创建一个包含声音数据的Buffer对象,这个对象主要用来获取处理数据,这种Buffer称作次缓冲区。

3.获取PCM的数据类型。将WAV文件或者其他资源的数据读取到缓冲区中。

4.把数据读取到缓冲区

通过调用IDirectSoundBuffer8::Lock函数来为写入此缓冲区做准备。通常这个函数返回一个表示缓冲区的内存地址,把数据从私有的缓冲区中复制到这个地址中,然后调用IDirectSoundBuffer8::Unlock。

5.播放缓冲区中的数据

通过调用IDirectSoundBuffer8::Play来播放缓冲区中的音频数据,也可通过IDirectSoundBuffer8::Stop来暂停数据,可以反复地停止和播放音频数据。一次只能播放缓冲区中的一个声音实例,如果同时创建了多个缓冲区,那么就可以同一时间来播放这些数据,这些声音会自动进行混音。

DirectSound中常见对象

这里写图片描述

0 0
原创粉丝点击