DirectSound以DMO(DirectX Nedua Objects)的方式提供了对原始音频数据的处理,开发者能够通过VC6.0里的Audio Effect DMO Wizard来开发自定义的DMO。实际上这个DMO开发向导已经不在Visual Studio里面提供了,并且已经被MFT(Media Foundation Transforms)替代了,但这个不是我们今天的重点。

除此之外,DirectSound提供了以下标准DMO音效(原谅鄙人对音效这块不是很了解,因此没有翻译这些术语):

  • Chorus
  • Compression
  • Distortion
  • Echo
  • Environmental Reverberation
  • Flange
  • Gargle
  • Parametric Equalizer
  • Waves Reverberation

1. 音效使用逻辑

所有标准音效都按照一致的方式来使用,首先先调用DirectSoundCreate8()获取设备对象接口并设置协作级别:

if (DirectSoundCreate8(&DSDEVID_DefaultPlayback, &m_directSound8, NULL) != DS_OK) {
throw std::exception("Error: maybe no default audio device in your system");
} if (m_directSound8->SetCooperativeLevel(windowHandle, DSSCL_PRIORITY) != DS_OK) {
throw std::exception("set cooperative level on default audio device failed!");
}

容纳后通过设备对象接口获取播放声音的次缓冲区接口:

if (soundBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID*)&m_soundBufferInterface) != S_OK)
throw std::exception("IDirectSoundBuffer8 interface not supported!");

接着通过次缓冲区接口的GetObjectInPath()函数获取想要的音效接口:

IUnknown* interfacePtr;
if (m_soundBufferInterface->GetObjectInPath( guid, guidIndex, interfaceGuidMaps[guid], (LPVOID*)&interfacePtr ) != DS_OK)
throw std::exception( "GetObjectInPath error" );

最后,调用SetFX()函数, 传入类型为DSEFFECTDESC的音效参数一个或多个音效参数:

DSEFFECTDESC effectDescriptions = { 0 };
effectDescriptions.dwSize = sizeof(effectDescriptions);
effectDescriptions.dwFlags = DSFX_LOCSOFTWARE;
effectDescriptions.guidDSFXClass = effectGuid; ... auto callResult = m_soundBufferInterface->SetFX(m_effects.size(), m_effects.data(), resultCodes.data());
if (callResult != DS_OK) {
...
}

2. Chorus音效简介

Chorus音效即合声,标准音效参数由以下几个参数构成:

  • Wet/Dry 比例:Wet代指被音效处理过的音频信号;Dry代指原始的音频信号。
  • Depth: 延迟时间被低频振荡器调整的百分比。
  • Feedback: 输出音频信号反馈到音效输入的百分比。
  • Fraquency: 低频振荡器的频率
  • Waveform: 低频振荡器的波形形状:三角、正弦。
  • Delay: 音效的延迟播放时间。
  • Phase: 左右低频振荡器的相位差

3. Chorus音效展示

Demo中我只实现了Chorus音效的应用:

大家可以编译完整代码来体验一下。

DirectSound---音效使用的更多相关文章

  1. 3D音效

    摘自:http://baike.baidu.com/view/1330437.htm?fr=aladdin 3D音效就是用扬声器仿造出似乎存在但是虚构的声音.例如扬声器仿造头顶上有一架飞机从左至右飞过 ...

  2. DirectSound的应用

    假设仅仅使用PlaySound()这个API函数来表现声音效果的话,那么就无法表现出声音的混音效果,由于PlaySound在播放还有一个声音时,必定会导致现有声音的停止.因此,使用 PlaySound ...

  3. DirectSound播放PCM(可播放实时采集的音频数据)

    前言 该篇整理的原始来源为http://blog.csdn.net/leixiaohua1020/article/details/40540147.非常感谢该博主的无私奉献,写了不少关于不同多媒体库的 ...

  4. 最简单的视音频播放示例8:DirectSound播放PCM

    本文记录DirectSound播放音频的技术.DirectSound是Windows下最常见的音频播放技术.目前大部分的音频播放应用都是通过DirectSound来播放的.本文记录一个使用Direct ...

  5. 最简单的视音频播放演示样例8:DirectSound播放PCM

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  6. DirectSound应用

    只是使用的假设PlaySound()这个API函数来显示的声音效果,然后,然后,它不会出现在混合声音,因为PlaySound还有播放期间声音,这将不可避免地导致现有声音停止. 因此,使用 PlaySo ...

  7. WASAPI、DirectSound/DS、WaveOut、Kernel Streaming/KS

    先放结论: ASIO:硬件支持+对应驱动程序 DS:兼容性最好,一般也是默认的. WASAPI:是Vista之后的,较佳选择输出方式. 再来详细看: ASIO.WDM都是指音频通道,就是音频数据走的路 ...

  8. C++播放wav音乐和音效

    1.  #include <mmsystem.h>#pragma comment(lib,"winmm.lib")PlaySound(TEXT("c:\\te ...

  9. Android 学习笔记之三—— 音效的使用

    在开发手电筒应用的处理音效的过程中,看网上使用的是MediaPlayer,因为音效一般都比较短,所以这里使用的是SoundPool,如下: SoundPool soundPool=new SoundP ...

  10. WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)

    刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. D ...

随机推荐

  1. xcode7中使用cocos2d-x3.8的webview控件

    在XCode7中使用cocos2d-x 3.3以上版本的WebView控件时,碰到了编译错误 App Transport Security has blocked a cleartext HTTP ( ...

  2. Java实现单链表的快速排序和归并排序

    本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...

  3. SUSE-11 本地 zypper 配置

    配置本地 zypper 目的: 安装 SUSE-11 后想要再添加或删除软件组件将比较麻烦.通过配置本地 zypper 将可以从下载的软件仓库(repository)中安装软件包.   本地 zypp ...

  4. Google 搜索引擎语法

    Google Hack原理很简单,就是利用搜索引擎强大的搜索能力,来查找一些存在漏洞的网站.要利用Google来查找网站的漏洞自然要学会Google这个搜索引擎的语法了.下面先给大家讲解一下Googl ...

  5. 使用echarts水球图

    使用echarts水球图 官方实例中没有水球图样式,当我们需要用到水球图的时候需要下载echarts-liquidfill.js. 使用 在echarts之后引入 echarts-liquidfill ...

  6. Thrift入门

    简介 Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Has ...

  7. [Python Study Notes]Socket模拟ssh执行cmd并记录遇到的问题

    服务器端: 流程: 1.创建servert实例 2.绑定地址和端口 3.开始监听 4.创建客户端连接实例 5.等待客户端的消息 6.......... # The_author = 'liu66' # ...

  8. PHP生成图片验证码、点击切换实例

    http://www.jb51.net/article/51506.htm 现在让我们来看下 PHP 代码 复制代码代码如下: <?php session_start();function ra ...

  9. 撸一撸Spring Cloud Ribbon的原理-负载均衡器

    在上一篇<撸一撸Spring Cloud Ribbon的原理>中整理发现,RestTemplate内部调用负载均衡拦截器,拦截器内最终是调用了负载均衡器来选择服务实例. 接下来撸一撸负载均 ...

  10. 每个前端开发者必会的 20 个 JavaScript 面试题

    JavaScript 未声明变量直接使用会抛出异常:var name is not defined,如果没有处理异常,代码就停止运行了.但是,使用typeof undeclared_variable并 ...