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. 【thinkphp5】【THINKCMG】标签部分开发(一)

    最近打算开一个自己的CMS后台轮子,框架选择了thinkphp 5 (别问我为什么选择这个框架)然后想边开发边记录一下,方便自己方便他人 进入正题 1.数据库设计 一共三张表 post文章表这个就不贴 ...

  2. Java新集合

    对我来说,集合类属于最强大的一种工具,特别适合在原创编程中使用.大家可能已感觉到我对Java 1.1 提供的集合多少有点儿失望.因此,看到Java 1.2 对集合重新引起了正确的注意后,确实令人非常愉 ...

  3. MyBatis入门(一)

    一.MyBaris简介 1)MyBaris发展过程 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移 ...

  4. store.js - 轻松实现本地存储(LocalStorage)

    store.js 是一个兼容所有浏览器的 LocalStorage 包装器,不需要借助 Cookie 或者 Flash.store.js 会根据浏览器自动选择使用 localStorage.globa ...

  5. react native 学习一(环境搭配和常见错误的解决)

    react native 学习一(环境搭配) 首页,按照http://reactnative.cn/docs/0.30/getting-started.html#content上的介绍,下载安装pyt ...

  6. Number()、parseInt() 和 parseFloat() 的区别

    一:Number() 如果是Boolean值,true和false值将分别被转换为1和0. 如果是数字值,只是简单的传入和返回. 如果是null值,返回0. 如果是undefined,返回NaN. 如 ...

  7. 安装配置php5.4 win2003

    php php-5.4.38 1.下载 http://windows.php.net/downloads/releases/php-5.4.38-Win32-VC9-x86.zip 解压到 D:\we ...

  8. 使用eclipse开发android准备工作

    1.官网下载JDK  http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html    (注 ...

  9. 使用imeOptions

    Android的软键盘右下角有Action按钮,如下图的“上一步” 在EditText中有 android:imeOptions选项,它包括完成按钮“actionDone”,发送按钮“actionSe ...

  10. iOS启动过程

    1.main函数 | 2.UIApplicationMain      * 创建UIApplication对象      * 创建UIApplication的delegate对象 | 3.delega ...