zoukankan      html  css  js  c++  java
  • DirectSound---音效使用

    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. 音效使用逻辑

    logic-pic

    所有标准音效都按照一致的方式来使用,首先先调用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音效的应用:

    result-pic

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

  • 相关阅读:
    (转载)gethostbyname() 用域名或主机名获取IP地址
    (转载)Linux网络编程inet_aton和inet_network和inet_addr三者比较
    (转载)Linux网络编程inet_pton与inet_ntop
    (转载)获取以太网卡的MAC地址
    (转载)Linux网络编程使用gethostbyaddr,通过ip地址,得到该ip地址的主机的信息
    (转载)Linux网络编程inet_ntoa问题记录
    Linux中pthread_detach()线程注意
    regexpfield tcl tk
    Iwidgets checkbox
    iwidgets hyperhelp tcl tk
  • 原文地址:https://www.cnblogs.com/lgxZJ/p/8538983.html
Copyright © 2011-2022 走看看