您的位置:首页 > 其它

x01.Game.CubeRun: XACT3 播放声音

2013-12-22 17:03 295 查看
1.使用 Xact3 工具

在 DXSDK 安装目录 => Uilities => bin => x86 里,运行 Xact3.exe 程序,新建波形库(Wave Bank)、声音库(Sound Bank) 项目,将 clip.wav 或类似的文件复制到 Wave Bank 工作区,再将其拖入 Sound Bank 工作区,选择 Build 菜单,便可生成 XBox 和 Win 目录,里面即为待用的声音文件。

2.添加 XactAudio 类

#include <iostream>
#include "XACT3Audio.h"

XACT3Audio::XACT3Audio(void) :
WaveBank(nullptr), SoundBank(nullptr), m_pWaveData(nullptr), m_pSoundData(nullptr)
{
}

XACT3Audio::~XACT3Audio(void)
{
Clearup();
}

bool XACT3Audio::InitEngine()
{
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
if (FAILED(hr))
{
return false;
}

hr = XACT3CreateEngine(XACT_FLAG_API_AUDITION_MODE, &XactEngine);
if (FAILED(hr))
{
return false;
}

XACT_RUNTIME_PARAMETERS rp = { 0 };
rp.lookAheadTime = XACT_ENGINE_LOOKAHEAD_DEFAULT;

hr = XactEngine->Initialize(&rp);
if (FAILED(hr))
{
return false;
}

return true;
}

bool XACT3Audio::LoadWaveBank(LPCWSTR path)
{
DWORD size = 0;
m_pWaveData = MapFileData(path, size);

HRESULT hr = XactEngine->CreateInMemoryWaveBank(m_pWaveData, size, 0, 0, &WaveBank);
if (FAILED(hr))
{
return false;
}

return true;
}

bool XACT3Audio::LoadSoundBank(LPCWSTR path)
{
DWORD size = 0;
m_pSoundData = MapFileData(path, size);

HRESULT hr = XactEngine->CreateSoundBank(m_pSoundData, size, 0, 0, &SoundBank);
if (FAILED(hr))
{
return false;
}

return true;
}

void* XACT3Audio::MapFileData(LPCWSTR path, DWORD& size)
{
HANDLE hFile = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
if (hFile == INVALID_HANDLE_VALUE)
{
return nullptr;
}

size = GetFileSize(hFile, nullptr);
if (size == -1)
{
CloseHandle(hFile);
return nullptr;
}

HANDLE hMap = CreateFileMapping(hFile, nullptr, PAGE_READONLY, 0, size, nullptr);
if (!hMap)
{
CloseHandle(hFile);
return nullptr;
}

void* data = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);

CloseHandle(hMap);
CloseHandle(hFile);

return data;
}

void XACT3Audio::Clearup()
{
if (WaveBank)
{
WaveBank->Destroy();
WaveBank = nullptr;
}

if (SoundBank)
{
SoundBank->Destroy();
SoundBank = nullptr;
}

if (m_pWaveData)
{
UnmapViewOfFile(m_pWaveData);
m_pWaveData = nullptr;
}

if (m_pSoundData)
{
UnmapViewOfFile(m_pSoundData);
m_pSoundData = nullptr;
}

if (XactEngine)
{
XactEngine->ShutDown();
XactEngine->Release();
XactEngine = nullptr;
}

CoUninitialize();
}


XactAudio.cpp
3.使用 XactAudio 类

基本都是程式化的东西,只需在 Cube.cpp 的 LoadContent() 最后添加如下代码即可:

if (!m_audio.InitEngine())
{
return false;
}

if (!m_audio.LoadWaveBank(L"Win/Wave Bank.xwb"))
{
return false;
}

if (!m_audio.LoadSoundBank(L"Win/Sound Bank.xsb"))
{
return false;
}

XACTINDEX cue = m_audio.SoundBank->GetCueIndex("clip");
m_audio.SoundBank->Play(cue, 0, 0, nullptr);


完整代码可到我的博客 x01.Lab.Download 中下载获取。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: