1.使用 Xact3 工具

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

2.添加 XactAudio 类

#pragma once

#include <xact3.h>

class XACT3Audio
{
public:
XACT3Audio(void);
~XACT3Audio(void); bool InitEngine();
bool LoadWaveBank(LPCWSTR path);
bool LoadSoundBank(LPCWSTR path);
void* MapFileData(LPCWSTR path, DWORD& size);
void Clearup(); IXACT3Engine* XactEngine;
IXACT3WaveBank* WaveBank;
IXACT3SoundBank* SoundBank; private:
void* m_pWaveData;
void* m_pSoundData;
};

XactAudio.h

#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 = { };
rp.lookAheadTime = XACT_ENGINE_LOOKAHEAD_DEFAULT; hr = XactEngine->Initialize(&rp);
if (FAILED(hr))
{
return false;
} return true;
} bool XACT3Audio::LoadWaveBank(LPCWSTR path)
{
DWORD size = ;
m_pWaveData = MapFileData(path, size); HRESULT hr = XactEngine->CreateInMemoryWaveBank(m_pWaveData, size, , , &WaveBank);
if (FAILED(hr))
{
return false;
} return true;
} bool XACT3Audio::LoadSoundBank(LPCWSTR path)
{
DWORD size = ;
m_pSoundData = MapFileData(path, size); HRESULT hr = XactEngine->CreateSoundBank(m_pSoundData, size, , , &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, , nullptr);
if (hFile == INVALID_HANDLE_VALUE)
{
return nullptr;
} size = GetFileSize(hFile, nullptr);
if (size == -)
{
CloseHandle(hFile);
return nullptr;
} HANDLE hMap = CreateFileMapping(hFile, nullptr, PAGE_READONLY, , size, nullptr);
if (!hMap)
{
CloseHandle(hFile);
return nullptr;
} void* data = MapViewOfFile(hMap, FILE_MAP_READ, , , ); 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, , , nullptr);

完整代码可到我的博客 x01.Lab.Download 中下载获取。

x01.Game.CubeRun: XACT3 播放声音的更多相关文章

  1. x01.Game.CubeRun: 风一样的女子

    1.题解 小孩学英语比较有意思,Monkey three => 猴三,风一样的女子 => 风 Girl.诸如此类不是重点,重点是一花一世界,一草一天堂.花花草草,纷纷扰扰.大千世界,当别具 ...

  2. x01.Tetris: 俄罗斯方块

    最强大脑有个小孩玩俄罗斯方块游戏神乎其技,那么,就写一个吧,玩玩而已. 由于逻辑简单,又作了一些简化,所以代码并不多. using System; using System.Collections.G ...

  3. x01.MagicCube: 简单操作

    看最强大脑,发现魔方还是比较好玩的,便买了一个,对照七步还原法,居然也能成功还原. 为什么不写一个魔方程序呢?在网上找了找,略作修改,进行简单操作,还是不错的,其操作代码如下: protected o ...

  4. x01.BSheepTree: 树

    数据结构,无外乎三: 1. 一对一,线性表,数组是也: 2. 一对多,树,菜单是也: 3. 多对多,图,网络是也. 涉及到树,有一个平衡的问题,左旋转,右旋转,转得人晕晕乎乎.好在陈广的<数据结 ...

  5. x01.CodeBuilder: 生成代码框架

    根据 Assembly 生成代码框架. 这是学习 AvalonEdit 的一个副产品.学习时,照着源代码新建文件夹,新建文件,添加方法与属性,虽然只是个框架,也要花费大量时间.为什么不让它自动生成呢? ...

  6. x01.TestViewContent: 插件测试

    开发神器 SharpDevelop 的插件系统,很有学习的必要. 1.首先在 github 上下载源代码,确保编译运行无误. 2.在 AddIns/Misc 下添加 SharpDevelop 插件项目 ...

  7. 转载:WinForm中播放声音的三种方法

    转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...

  8. x01.TextProc: 两三分钟完成的一个小工具

    在工作中,遇到这么个问题,需要将 Excel 表中类似 2134-1234-4456 的商品编号输入到单位的程序中,而程序只认 213412344456 这种没有 ‘-’ 的输入.数量比较多,一笔一笔 ...

  9. x01.Weiqi.12: 定式布局

    定式 下一步当将定式保存到数据库中,如布局中的代码所示,但其初始的代码更有利于理解.以小飞挂为例: // 0 // + 0 0 // + // // + List<Pos> P_LuSta ...

随机推荐

  1. 深入浅出Java多线程

    Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别的形式,但多线程使用了 ...

  2. 初识React Native,踩坑之旅....

    开启Genymotion Android模拟器后 1.运行“react-native run-android”报端口冲突....解决方法: 2.运行“react-native run-android” ...

  3. mongodb命令使用大全(常用命令)

    数据库常用命令 1.Help查看命令提示 help db.help(); db.yourColl.help(); db.youColl.find().help(); rs.help(); 2.切换/创 ...

  4. apache maven pom setting

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...

  5. linux基础知识总结

    使用linux将近一年了,一直都没有时间来总结一下,借着最近在整理知识框架的机会总结一下linux的应用知识.   1.linux有两个目录很特殊,一个是~,另一个是/.两个目录的含义不一样,/是系统 ...

  6. WPF实现炫酷Loading控件

    Win8系统的Loading效果还是很不错的,网上也有人用CSS3等技术实现,研究了一下,并打算用WPF自定义一个Loading控件实现类似的效果,并可以让用户对Loading的颗粒(Particle ...

  7. 【HTML5】Canvas图像

    把一幅图像放置到画布上, 使用以下方法: drawImage(Img,x,y); 注:这里的Img必须是一个图像对象.   显示一个canvas图像: <!DOCTYPE html> &l ...

  8. CSS3中DIV水平垂直居中-2(3)

    用到CSS3中display的新属性. HTML <div class="parent"> </div> CSS html,body{ width: 100 ...

  9. 尝试加载 Oracle 客户端库时引发 BadImageFormatException。问题记录

    电脑是win8 64位,安装oracle 11g r2 64位的,谁知道一切装完毕后,打开项目却连不上oracle数据了...首先是pl/sql连不上,装了oracle服务器,应该是不用再装客户端,p ...

  10. Snort - manual 笔记(五)

    1.9 Miscellaneous 1.9.1 Running Snort as a Daemon 如果你想让Snort作为守护程序运行,你可以在最后加上 -D 选项.清注意如果你想通过发送一个 SI ...