x01.Game.CubeRun: XACT3 播放声音
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 播放声音的更多相关文章
- x01.Game.CubeRun: 风一样的女子
1.题解 小孩学英语比较有意思,Monkey three => 猴三,风一样的女子 => 风 Girl.诸如此类不是重点,重点是一花一世界,一草一天堂.花花草草,纷纷扰扰.大千世界,当别具 ...
- x01.Tetris: 俄罗斯方块
最强大脑有个小孩玩俄罗斯方块游戏神乎其技,那么,就写一个吧,玩玩而已. 由于逻辑简单,又作了一些简化,所以代码并不多. using System; using System.Collections.G ...
- x01.MagicCube: 简单操作
看最强大脑,发现魔方还是比较好玩的,便买了一个,对照七步还原法,居然也能成功还原. 为什么不写一个魔方程序呢?在网上找了找,略作修改,进行简单操作,还是不错的,其操作代码如下: protected o ...
- x01.BSheepTree: 树
数据结构,无外乎三: 1. 一对一,线性表,数组是也: 2. 一对多,树,菜单是也: 3. 多对多,图,网络是也. 涉及到树,有一个平衡的问题,左旋转,右旋转,转得人晕晕乎乎.好在陈广的<数据结 ...
- x01.CodeBuilder: 生成代码框架
根据 Assembly 生成代码框架. 这是学习 AvalonEdit 的一个副产品.学习时,照着源代码新建文件夹,新建文件,添加方法与属性,虽然只是个框架,也要花费大量时间.为什么不让它自动生成呢? ...
- x01.TestViewContent: 插件测试
开发神器 SharpDevelop 的插件系统,很有学习的必要. 1.首先在 github 上下载源代码,确保编译运行无误. 2.在 AddIns/Misc 下添加 SharpDevelop 插件项目 ...
- 转载:WinForm中播放声音的三种方法
转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...
- x01.TextProc: 两三分钟完成的一个小工具
在工作中,遇到这么个问题,需要将 Excel 表中类似 2134-1234-4456 的商品编号输入到单位的程序中,而程序只认 213412344456 这种没有 ‘-’ 的输入.数量比较多,一笔一笔 ...
- x01.Weiqi.12: 定式布局
定式 下一步当将定式保存到数据库中,如布局中的代码所示,但其初始的代码更有利于理解.以小飞挂为例: // 0 // + 0 0 // + // // + List<Pos> P_LuSta ...
随机推荐
- Scalaz(3)- 基础篇:函数概括化-Generalizing Functions
Scalaz是个通用的函数式编程组件库.它提供的类型.函数组件都必须具有高度的概括性才能同时支持不同数据类型的操作.可以说,scalaz提供了一整套所有编程人员都需要的具有高度概括性的通用函数,它是通 ...
- Sql--列操作
Oracle的列操作(增加列,修改列,删除列),包括操作多列增加一列: alter table emp4 add test varchar2(10);修改一列: alter table emp ...
- CnBlogs自定义博客样式
弄了半个晚上的时间,总算马马虎虎搞好了博客的样式. 整个博客是蓝色的基调,比较激情,我喜欢. 比较郁闷的是,rightmenu 和 main都是position:absolute 布局的.要添加一个f ...
- Hibernate(九)__OpenSessionInView解决懒加载问题
什么是OpenSessionInView? 在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关 ...
- Elastislide - 响应式的图片循环展示效果
Elastislide 是一款非常优秀的响应式 jQuery 图片循环展示(旋转木马)插件,集成了 Touchwipe 插件以支持触屏设备.提供了四种效果:水平图片传送带.垂直图片传送带.固定在屏幕底 ...
- 强大的<canvas>
<canvas> 个人认为<canvas>是h5最重量级的新标签了,现在各种h5小游戏都是基于<canvas>的,它为游戏提供了一个功能强大的画布,可在画布上绘制丰 ...
- JavaScript 开发者经常忽略或误用的七个基础知识点(转)
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- 原创:phoenix4.6.0连接hbase1.1.2(不使用phoenix-4.6.0-HBase-1.1-client.jar)
官网上面的例子是在phoenix-4.6.0-HBase-1.1-client.jar完成的,这个jar包含了phoenix4.6连接hbase1.1.2所有的依赖,真是包罗万象(里面竟然还包括了se ...
- Failed to connect to database. Maximum number of conections to instance exceeded
我们大体都知道ArcSDE的连接数有 48 的限制,很多人也知道这个参数可以修改,并且每种操作系统能支持的最大连接数是不同的. 如果应用报错:超出系统最大连接数 该如何处理? 两种解决办法: 第一,首 ...
- <转>iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!
原文地址:http://blog.csdn.net/xiaominghimi/article/details/6937097 //——2012-12-11日更新 获取"产品付费数量等于0 ...