声音引擎之DirectMusic(1)---重要概念

一、概念

    我在我的引擎使用的是DirectMusic,他是高层的audio API,他比DirectSound方便很多,他可以播放WAV文件与MIDI文件,在这里我主要介绍如何播放WAV文件。

    首先,所有的声音的播放都要依赖于两个COM对象,一个是IDirectMusicLoader8,他负责从磁盘上读取声音文件;还有一个是IDiretMusicPerformace,他负责播放与停止的控制,也可以控制全局的声音。

    而具体到一个声音文件,则需要一个IDirectMusicSegment8对象,当你告诉IDirectMusicLoader8载入一个WAV文件,那么就创造了一个IDirectMusicSegment8对象,它存放所有这个文件的信息。

    这些还不够,在播放一个声音时,你需要一个IDirectMusicSegmentState8,他保存了当前声音的播放状态,也就是说,载入的声音可以由多个实例来播放他,这些实例不需要全部的声音数据,只记录各自的播放状况,这样可以避免为多个播放相同声音文件的实例都分配声音数据节约内存,有点像线程的作用。

   

二、组织

    由此可以发现,我们需要三个抽象:

    1.AudioManager,他负责构造总体的架构,保存IDirectMusicLoader8, IDiretMusicPerformace等这些每个声音都可能用到的东西。

    2.Sound,他负责保管一个载入声音的全部信息,如IDirectMusicSegment8。

    3.SoundInstance,他负责一个当前播放声音的全部信息,如IDirectMusicSegmentState8.

   

    通过以上组织,我们可以得出以下流程,首先,初始化AudioManager,并由它提供载入声音的方法LoadSound,它负责读入文件路径,并产生一个Sound。接着如果你希望播放Sound,你需要从Sound中产生一个SoundInstance,有了SoundInstance,你就可以放心大胆的播放声音了。

 

   Enjoy!!

在沉寂了一段时间之后。我开始开发游戏的音频程序了。今天我要为大家展示的是我写的播放MIDI的程序,其实不要以为MIDI的载入和播放很复杂,其实它是相当的简单、只需要选用合适的解码器就行了。现在又几种解码器可以选择。MCI和DirectMusic。其中MCI是windows特别对多媒体应用程序提供的API集合,它可以播放很多流行的格式。但是对MIDI的控制性比较低。而DirectMusic则对MIDI有着较丰富的支持,最典型的就是可以控制节奏(tempo)。 我的代码没有对DirectMusic进行封装,使用C的风格制作的。所以大家看起来很好理解。下面我就来展示我写的代码吧。 Main.cpp /*--------------------------------------------------------------------------- 蒋轶民制作E-mail:jiangcaiyang123@163.com 最后编辑:年月日:29:06 文件名:main.cpp 作用:头文件的实现 ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ // 头文件 #include #include #include "main.h" using namespace std; int main( int, char** ) { try { cout << "初始化设备\n"; Initialize();// 初始化DirectMusic cout << "载入声音\n"; LoadSound( TEXT( "test.mid" ) ); // 载入声音文件 cout <SetRepeats( NULL ); // 仅仅播放一次 SetVolume( 0, 0 ); Play(); Sleep( 1000 ); SetTempo( 160 ); cout << "当前播放的速率为" << GetCurrentTempo() << '\n'; while ( IsPlaying() ); UnInitialize(); cout << "释放设备\n"; } catch( CError& e ) { e.SaveToFile(); cout << "错误报告已保存。\n"; } catch( ... ) { cout << "遇到了未知的错误。\n"; } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值