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 ...
随机推荐
- [javaSE] 反射-动态加载类
Class.forName(“类的全称”) ①不仅表示了类的类类型,还代表了动态加载类 ②请大家区分编译,运行 ③编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 Ⅰ所有的new对象都是静态加载 ...
- Lock的实现之ReentrantLock详解
摘要 Lock在硬件层面依赖CPU指令,完全由Java代码完成,底层利用LockSupport类和Unsafe类进行操作: 虽然锁有很多实现,但是都依赖AbstractQueuedSynchroniz ...
- selenium webdriver自动化对日期控件的处理
用JS去掉日期输入框的readOnly属性. 代码如下: ----------------------------------------------------------------------- ...
- tomcat 7下spring 4.x mvc集成websocket以及sockjs完全参考指南
之所以sockjs会存在,说得不好听点,就是因为微软是个流氓,现在使用windows 7的系统仍然有近半,而windows 7默认自带的是ie 8,有些会自动更新到ie 9,但是大部分非IT用户其实都 ...
- PDF.NET 开发框架之 SOD框架 Ver 5.2 正式版开源源码发布
PDF.NET 开发框架之 SOD框架 Ver 5.2.1.0307 正式版发布,包含以下部分: SOD_Pwmis.Core --包括下列数据提供程序 SqlServer SqlServerCe A ...
- HTML+AngularJS+Groovy如何实现登录功能
AngularJS是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS核心特性有:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入等.AngularJS认为声明 ...
- Debug - 支持浏览器和 Node 平台的全端调试工具
Debug 是一个跟踪调试消息的 JavaScript 库.因为它只是对 console.log 的包装,所以支持 Node 和浏览器.它允许你过滤日志输出而不需要改变你的源代码,也输出时间差异,可以 ...
- Box2D自定义重力
需要给刚体添加一个自定义的属性:m_customGravity,这样就可以动态的修改每一个刚体自定义的重力,查找box2d源码大约在5486行,加上红色的一句代码 b2Island.prototype ...
- TABLE CONTROL隐藏列和固定列的实现
一.设置固定列 需求:为了方便对主要关心信息地查看,用户希望TABLE CONTROL左边的一列或者几列在屏幕上固定.针对用户这样子的需求, 我们首先会想到类似与屏幕编辑/可见等字段属性设置,但是此方 ...
- 传说中的AutoCAD公司 - 欧特克(Autodesk)招聘开发顾问-上海或北京
如果您热衷新技术,垂涎科技前沿,对编程有狂热的热情,乐于帮助别人打造解决方案,喜爱分享和交流,英文沟通无障碍,来吧,把简历丢过来! 如果您刚毕业不久,那也不要因为工作经历尚浅而怯步,我们也非常欢迎您! ...