首 页 | 新 闻 | Symbian | Android| Windows Mobile | J2ME | 下载中心 | 游戏策划招聘与求职 | 购书指南 | 视频教程
您现在的位置: 开发视界 >> Symbian >> 多媒体 >> 文章正文
播放WAV文件
作者:Lee 译    文章来源:newlc    更新时间:2007-4-2 10:50:24
播放一个wav文件要比想象中容易很多,因为很多事情都交给了系统。在这个工程中CSoundPlayer实现了播放wav文件的必要步骤
 
CODE:
#include <MdaAudioSamplePlayer.h>
class CSoundPlayer: public CBase, public MMdaAudioPlayerCallback
{
public:
   static CSoundPlayer* NewL(const TDesC& aFile);
   static CSoundPlayer* NewLC(const TDesC& aFile);
   ~CSoundPlayer();
   void PlayL();
   void StopL();

   //
   // 来自 MMdaAudioPlayerCallback
   //
   void MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& aDuration);
   void MapcPlayComplete(TInt aError);

private:
   CSoundPlayer();
   void ConstructL(const TDesC& aFile);

private:
   enum TState
   {
       ENotReady,
       EReady,
       EPlaying
   };

   TState iState;
   CMdaAudioPlayerUtility* iMdaPlayer;
};

关键类:
CMdaAudioPlayerUtility : 实现了解码,CSoundPlayer有一个私有的CMdaAudioPlayerUtility类型的成员iMdaPlayer.
MMdaAudioPlayerCallback: 是iMdaPlayer的观察者(用于观察播放器中发生的时间,比如初始化结束和播放结束等)。这个类最少要实现MapcInitComplete() 和MapcPlayComplete() ,我们下面讲要讲到。

初始化播放器
CSoundPlayer::NewL() 或者 CSoundPlayer::NewLC()用于来初始化播放器,二阶构造函数将调用CMdaAudioPlayerUtility::NewFilePlayerL()来初始化iMdaPlayer .
 
CODE:
void CSoundPlayer::ConstructL(const TDesC& aFile)
{
//
// Create a file audio player utility instance
//
iMdaPlayer=CMdaAudioPlayerUtility::NewFilePlayerL(aFile,*this);
}

还有一种构造函数,CMdaAudioPlayerUtility::NewDesPlayerL() 用于wav已经在ram内存中的情况

到现在为止,播放器还不能开始播放。实际上,如果你尝试在NewFilePlayerL()后立刻调用iMdaPlayer->PlayL() ,可能你会听不到任何东西,因为只有播放器实例构造完全结束以后才可以播放。
播放器初始话结束以后,框架会调用MapcInitComplete()。两种常见的实现方式如下:
 
CODE:
//
// 方法 1: 设置iState设置为准备状态,通知播放器已经准备好了
//
void CSoundPlayer::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/)
{
   iState = aError ? ENotReady : EReady;
}
 
CODE:
//
// 方法 2: 立刻播放文件
//
void CSoundPlayer::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/)
{
   if (!aError)
       iMdaPlayer->PlayL();
}

播放文件
一旦初始化结束,就像上面的例子一样,回调函数中调用了CMdaAudioPlayerUtility::PlayL()。在Sound1 例子中,这里使用的是CSoundPlayer::PlayL()
 
CODE:
void CSoundPlayer::Play()
{
   if(iState==EReady)
   {
       iState=EPlaying;
       iMdaPlayer->Play();
   }
}

播放结束后,框架将调用MapcPlayComplete(),下面Sound1的实现部分
 
CODE:
void CSoundPlayer::MapcPlayComplete(TInt aError)
{
   iState = aError ? ENotReady : EReady;
}

如果要想运行这个例子,你必须把一个play.wav放在C:\System\Apps\Sound\下  (模拟器放在C:\Symbian\6.1\Series60\Epoc32\Wins\c\system\apps\Sound )

下载源码

译文地址:http://www.symbianx.cn/viewthread.php?tid=65&extra=page%3D1
相关文章:
在没有ui的程序中捕获所有的key事件
Symbian类里的extension和reserved
Symbian应用程序中如何备份和载入
通过Tuny Engine Lite 使你的手机游戏更加负有激情
Symbian程序中的观察者模式
S60平台:Bluetooth API开发伙伴指南——搜索和发布
如何在SYMBIAN60中编写DLL
C++ 基类和派生类