65.9K
CodeProject 正在变化。 阅读更多。
Home

DirectSound API 的包装类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (19投票s)

2001 年 3 月 22 日

viewsIcon

230409

downloadIcon

5207

本文重点介绍如何通过使用 DirectSound 包装类, 在 PC 游戏软件开发中使用 DirectX API。

<!-- 下载链接 -->

引言

本文重点介绍如何通过使用 DirectSound 封装类,在 PC 游戏软件开发中使用 DirectX API 的示例。

DirectSound 封装类

封装类具有处理声音播放各个方面的功能。

封装类的结构

DirectSound 对象使用双缓冲来处理声音数据处理和播放。 DirectSound 对象创建一个主缓冲区来处理输出设备以播放声音数据。 DirectSound 对象创建多个二级缓冲区来加载、存储各种声音数据并配置声音数据性能。 对象从辅助缓冲区加载和混合声音数据,并将处理后的声音数据发送到主缓冲区,以通过输出设备播放。

封装类包含指向 DirectSound 对象的指针、主缓冲区对象(DirectSoundBuffer 类型的指针)和辅助缓冲区数组(DirectSoundBuffer 对象数组)

封装类中的 DirectSound 对象

DirectSound 是一个 COM 接口,因此 DirectSound 对象是 COM 组件对象(指向 DirectSound 的指针)。 DirectSound 对象是声音播放的核心,所有缓冲区(包括主缓冲区和辅助缓冲区)都由它创建,因此在进行任何声音播放之前,必须先对其进行实例化。

由于 DirectSound 对象是一个 COM 对象,因此可以通过创建 COM 组件的通用方法或通过调用 DirectSoundCreate 来实例化它。 在我的封装类中,我发现创建 COM 对象的通用方法更可靠。 请记住:DirectX 接口是 COM 接口的子集,因此在使用它们之前,请调用 CoInitialize/ CoInitializeEx,并在应用程序结束时调用 CoUninitialize

// To start...
BOOL CSoundManager::CoInitializeDSound(void)
{
    HRESULT  hr;
    GUID     guID;

    // Clear the GUID
    ::memset(&guID, 0, sizeof(GUID));
 
    // Initialize COM service, create STA 
    hr = ::CoInitialize(NULL);
    ................................. 
    .................................
    // Create the IDirectSound object with the realiable way (create
    // standard COM object)
    hr = CoCreateInstance(CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,
              IID_IDirectSound, (void**)&m_pIDS);
    ................................. 
    ................................
    // Initialize the IDirectSound object
    hr = IDirectSound_Initialize(m_pIDS, &guID);
    ................................. 
    .................................
    return TRUE;
}

// To finish up...
void CSoundManager::CoUnInitializeDSound(void)
{
    if(m_pIDS)
    {
        m_pIDS->Release();
        m_pIDS = NULL;
        ::CoUninitialize();
    }	
}

主缓冲区

主缓冲区是一个 DirectSoundBuffer 对象,其主要任务是从 DirectSound 对象接收处理后的声音数据,并将其发送到输出设备进行播放。 主缓冲区的格式设置决定了输出设备的声音播放效果。 主缓冲区的格式是一个 WAVEFORMATEX 结构,必须在播放之前设置。

二级缓冲区

二级缓冲区加载声音数据并设置声音性能,然后将声音发送到 DirectSound 对象。 二级缓冲区是一个 DirectSoundBuffer 对象,由 DirectSound 对象创建。

在我的库中,我使用 DirectSoundBuffer 的封装类作为二级缓冲区。 此封装类具有 DirectSoundBuffer 对象以及用于设置声音性能的方法,例如调整音量、频率和声道。

DirectSoundBuffer 封装类的一个特殊功能是淡入(音量逐步升高)和淡出(音量逐步降低)的特殊声音效果。

为了避免传入函数调用的并发,DirectSoundBuffer 封装类中使用互斥对象来同步函数调用。

定时器事件

DirectSound 封装类需要一个定时器来以特定的时间间隔监控和操作声音状态和性能。 DirectSound 封装类是一个通用类,因此很难在该类中使用 Windows 定时器。 作为替代方案,该类中使用可等待的定时器。 创建一个线程以在实例化类对象时检查计时器事件。

测试程序

测试程序是用 MFC 编写的对话框应用程序。 它测试了各种封装类功能,例如音量、频率、声道、循环、混合以及淡入和淡出等。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.