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音效的应用:

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

最新文章

  1. 嵌入式linux下如何尽快播放开机音乐
  2. PAT算法题学习笔记
  3. Android Gradle的使用
  4. 我的android学习经历28
  5. magneto创建运费模板
  6. Selenium定位元素
  7. 360随身wifi怎样购买?360随身wifi怎样预约?
  8. Android 获取图片资源的4种方式
  9. JavaScript 继承机制小记
  10. 实现自己的cp命令
  11. SQL Server 与 Entity Framework 级联删除
  12. Knockout应用开发指南 第二章:监控属性(Observables)
  13. Mixin模式:带实现的协议
  14. 关于win8/win8.1系统不能调节亮度的解决办法
  15. iOS开发基础之设置状态栏和二维码的unspported type found 问题
  16. VMWare 鼠标无法点击 的问题
  17. JS的作用域链
  18. deque源码1(deque概述、deque中的控制器)
  19. Quick Introduction to SQL Server Profiler
  20. [转]tableExport.js 导出excel 如果有负数或是空值 导出前面会自动加上单引号

热门文章

  1. ACE_TEST1.obj : error LNK2019: 无法解析的外部符号
  2. LeetCode - 596. Classes More Than 5 Students
  3. maven的下载安装,配置本地仓库
  4. 蓝桥杯 基础练习 之 FJ的字符串
  5. angularjs 服务详解
  6. NOIP 总结
  7. React设计思想
  8. Spark DataFrame写入HBase的常用方式
  9. Spring框架系列之AOP思想
  10. Tomcat启动出现:Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/SpringMvc]]解决办法