专题10游戏音乐与音效

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Copyright 2008 By Neusoft Group. All rights reserved
麻雀虽小,五脏俱全
• • • • DirectSound简介 声音的播放过程 DirectSound的编程步骤 3D音效的实现
Copyright 2008 By Neusoft Group. All rights reserved
typedef struct sWaveHeader_tag { char RiffID[4]; //'RIFF'块 long WaveformChunkSize; //4个字节 char WaveID[4]; //.wav文件应为'WAVE'类型 char FormatID[4]; //'fmt '块(末尾有一个空格) long FormatChunkSize; //16个字节 short FormatTag; //.wav文件应为 WAVE_FORMAT_PCM short Channels; //声道数 long SampleRate; //采样频率 long BytesPerSec; //每秒采样的字节数 short BlockAlign; //块对齐大小 short BitsPerSample; //bit位数(8bit或16bit) char DataID[4]; //'data'块 long DataSize; //data块的大小(实际的声音数据) }sWaveHeader;
Copyright 2008 By Neusoft Group. All rights reserved
设置设备的协调级别
• 在建立了IDirectSound8对象之后,需要设 置声卡设备的协调级别,告诉Windows使 用硬件的权限,其他应用软件与游戏如何 共享声卡设备。
if(FAILED(m_pDirectSound->SetCooperativeLevel( hwnd, dwCoopLevel))) return false; HRESULT SetCooperativeLevel( HWND hwnd, //窗口句柄 DWORD dwLevel //协调级别 );
if(FAILED(pDirectSoundBuf->SetFormat(&waveFormat))) return false;
Copyright 2008 By Neusoft Group. All rights reserved
建立次缓冲区
• 次缓冲区用来装入实际的 声音数据,因此,必须根 据实际的声音文件大小, 创建一个相应大小的次缓 冲区。 • .wav文件依据称为RIFF的 资源互换文件格式来存放 声音数据。文件头包括3 个块,分别是RIFF块、 fmt块和data块。 • 每个块由块名称、块的大 小以及块的数据构成。
Copyright 2008 By Neusoft Group. All rights reserved
dwLevel有如下几个取值:
• DSSCL_EXCLUSIVE :对于DirectX8.0以上版本,此 标志与DSSCL_PRIORITY 具有相同的作用。对于以 前的版本,此标志设置声卡设备为当前程序独占。 • DSSCL_NORMAL :正常模式,其他程序可共享设备。 此标志下,主缓冲区的播放格式不允许修改。 • DSSCL_PRIORITY :具有优先设置DirectSound设备 的权限。如:可调用SetFormat 函数设置主次缓冲区 的播放格式。 • DSSCL_WRITEPRIMARY :可写主缓冲区,此时次 缓冲区就不可进行播放处理,即不能将次缓冲区的数 据送进混声器,再输出到主缓冲区上。
Copyright 2008 By Neusoft Group. All rights reserved
CreateSoundBuffer函数原型:
HRESULT CreateSoundBuffer( LPCDSBUFFERDESC pcDSBufferDesc, //缓冲区的描述结构 LPDIRECTSOUNDBUFFER * ppDSBuffer, //返回的缓冲区指针 LPUNKNOWN pUnkOuter //必须为NULL );
DSBUFFERDESC结构体的定义:
typedef struct DSBUFFERDESC { DWORD dwSize; //结构体的大小 DWORD dwFlags; //缓冲区的用途标志 DWORD dwBufferBytes; //缓冲区的大小 DWORD dwReserved; //保留未用,必须为0 LPWAVEFORMATEX lpwfxFormat; //声音的格式属性 GUID guid3DAlgorithm; //3D声效算法,一般不必理会 } DSBUFFERDESC;
• 创建一个代表声卡的IDirectSound8对象:
if(FAILED(DirectSoundCreate8(NULL, &m_pDirectSound, NULL))) return false; HRESULT DirectSoundCreate8( //声卡设备全局标志,一般为NULL,表示默认的声卡 LPCGUID lpcGuidDevice, //返回的IDirectSound8接口对象指针 LPDIRECTSOUND8 * ppDS8, LPUNKNOWN pUnkOuter //必须为NULL );
Copyright 2008 By Neusoft Group. All rights reserved
读取.wav文件的声音格式数据:
//打开bird.wav文件 FILE *fp; if((fp = fopen("bird.wav", "rb"))==NULL) return false; //定义文件头结构体变量,存储声音属性信息 sWaveHeader* pWaveHeader=new sWaveHeader(); //读入文件头信息到结构体变量 fread(pWaveHeader,sizeof(sWaveHeader),1,fp); //检查是否为.wav文件 if(memcmp(pWaveHeader->RiffID, "RIFF", 4) || memcmp(pWaveHeader->WaveID, "WAVE", 4) || memcmp(pWaveHeader->FormatID, "fmt ", 4) || memcmp(pWaveHeader->DataID, "data",4)) return false;
Copyright 2008 By Neusoft Group. All rights reserved
声音的播放过程
声卡或系统内存 次缓冲区1 次缓冲区2 次缓冲区3 主缓冲区和次缓冲区 混声器 (混频器) 声卡内存 主缓冲区
声音的播放过程:若干声音文件数据,装入相应的次缓冲区中。次 缓冲区位于声卡或系统内存中,需要事先进行申请。所申请的次缓冲 区大小,一般为对应的声音文件大小。将次缓冲区的声音数据输出到 混声器进行混频处理,输出数字化的声音数据到主缓冲区。主缓冲区 中的声音数据,转换为模拟信号,送入扬声器中进行播放。
DirectSound简介
• DirectSound是DirectX Audio的一个较底层的部件, 提供了丰富的接口函数,实现.wav格式的波形声 音数据的播放控制。
• 与一般的Windows API提供的声音播放函数不同, DirectSound可实现多个声音的混合播放,便于在 游戏的背景声音下实现各种角色发出声音。 DirectSound可充分使用声卡的内存资源,同时也 提供了3D声效算法,模拟出真实的3D立体声。
专题10 游戏音乐与音效
Copyright 2008 By Neusoft Group. All rights reserved
抛砖引玉
• 如果您在玩一种以跳舞为主的游戏时,您只能看 到屏幕上那些上下左右箭头一直在往上跑,但是 却不能听到任何的声音,这时,你只能看着那些 箭头猛踩踏板,而不能跟着音乐的节拍起舞,那 么游戏玩起来还会觉得有趣吗? • 一个好的游戏,除了有真实而具有震撼力的游戏 画面之外,游戏的音乐与音效也是相当重要的部 分。像仙剑奇侠传的中国古典音乐,暗黑破坏神 的欧美风格的音乐,都给玩家留下了深刻的印象。 另外,在很多3D射击游戏中,音效的处理也是相 当重要的一个工作,程序员往往需要设计一个真 实的3D音效,让玩家根据音效来判断所处的环境。
Copyright 2008 By Neusoft Group. All rights reserved
建立主缓冲区
• 如果需要设置主缓冲区的新播放格式,则可调用 CreateSoundBuffer函数,从声卡内存中分配出主缓冲区:
DSBUFFERDESC bufferDesc; ZeroMemory(&bufferDesc, sizeof(DSBUFFERDESC)); bufferDesc.dwSize = sizeof(DSBUFFERDESC); //表示主缓冲区 bufferDesc.dwFlags = DSBCAPS_PRIMARYBUFFER; bufferDesc.dwBufferBytes = 0; //主缓冲区必须设置为0 bufferDesc.lpwfxFormat = NULL; //主缓冲区必须设置为NULL //取得主缓冲区 IDirectSoundBuffer* pDirectSoundBuf = NULL; if(FAILED(m_pDirectSound->CreateSoundBuffer(&bufferDesc, &pDirectSoundBuf, NULL))) return false;
ຫໍສະໝຸດ Baidu
Copyright 2008 By Neusoft Group. All rights reserved
声音的播放过程
• 主缓冲区:可以看做是一个DirectSound,是用来播放 声音、产生混音效果的区域,它有一个预设的播放格 式(8bit、22kHz),而声音文件在播放时便按照这种 格式输出。主缓冲区在建立DirectSound对象时自动生 成,不过如果需要比默认值更好的播放品质,就必须 建立主缓冲区并设定其播放的格式,并且在设定协调 级别时,标志位必须设定为DSSCL_PRIORITY或 DSSCL_EXCLUSIVE。 • 次缓冲区:存储播放声音的文件,可以建立多个次缓 冲区来存放多个要播放的声音文件。
RIFF块的名称 RIFF块的大小 RIFF块的数据 fmt块的名称 fmt块的大小 fmt块的数据 data块的名称 data块的大小 data块的数据
RIFF块
fmt块
data块
Copyright 2008 By Neusoft Group. All rights reserved
• 为了读取.wav文件的声音格式数据,并将实际声音数据装 入次缓冲区,定义如下的一个对应于.wav文件头的结构体 sWaveHeader。
Copyright 2008 By Neusoft Group. All rights reserved

创建了主缓冲区后,可以通过调用SetFormat函数来设 定主缓冲区的播放格式,以改变声音播放的品质与效果。
WAVEFORMATEX waveFormat; ZeroMemory(&waveFormat, sizeof(WAVEFORMATEX)); waveFormat.wFormatTag = WAVE_FORMAT_PCM; waveFormat.nChannels = 1; //单声道 waveFormat.nSamplesPerSec = 22050; //22.05kHz waveFormat.wBitsPerSample = 16; //16bit waveFormat.nBlockAlign = (waveFormat.wBitsPerSample / 8) * waveFormat.nChannels; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
Copyright 2008 By Neusoft Group. All rights reserved
DirectSound的编程步骤
• • • • • • 创建DirectSound对象 设置设备的协调级别 建立主缓冲区 建立次缓冲区 装入声音数据到次缓冲区 声音的播放与控制
创建DirectSound对象
相关文档
最新文档