Проигрывание WAV-файла более просто, чем это может показаться на первый взгляд, так как ОС делает большинство работы. В этом проекте класс CSoundPlayer осуществляет все необходимое для этого:
#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(); // // from 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; }; </mdaaudiosampleplayer.h>
Ключевые классы:
CMdaAudioPlayerUtilityкоторый осуществляет декодер. КлассCSoundPlayerимеет частный член, называемыйiMdaPlayer.
MMdaAudioPlayerCallback является своего рода обозревателем в iMdaPlayer. В основном этот смешанный класс требует выполнения MapcInitComplete() иMapcPlayComplete() (будут описаны ниже).
Проигрыватель инициализируется вызовомCSoundPlayer::NewL() или CSoundPlayer::NewLC(). Конструктор второй стадии объектаCSoundPlayerинициализирует объектiMdaPlayer, использующийCMdaAudioPlayerUtility::NewFilePlayerL():
void CSoundPlayer::ConstructL(const TDesC& aFile) { // // Create a file audio player utility instance // iMdaPlayer=CMdaAudioPlayerUtility::NewFilePlayerL(aFile,*this); }
Второй тип конструктора,CMdaAudioPlayerUtility::NewDesPlayerL() доступен? если Ваш WAV-сэмпл уже загружен в RAM.
Но проигрыватель пока не готов. Фактически, если вы попробуете вызвать iMdaPlayer->PlayL() сразу после вызоваNewFilePlayerL() , вы, вероятно ничего не услышите: вы должны дождаться, пока образец будет готов к проигрыванию. Это будет сообщено к Вам, когда метод повторного вызоваMapcInitComplete() вызовет структура. Два типичных примера выполнения этой функции показаны ниже:
// // Implementation 1: set a iState flag to ready // to reflect the fact that the player is ready // void CSoundPlayer::MapcInitComplete(TInt aError,const TTimeIntervalMicroSeconds&/*aDuration*/) { iState= aError ? ENotReady: EReady; } // // Implementation 2: play the file immediately // void CSoundPlayer::MapcInitComplete(TInt aError,const TTimeIntervalMicroSeconds&/*aDuration*/) { if(!aError) iMdaPlayer->PlayL(); }
Как только инициализация закончена, как показано выше, воспроизведение файла делает запрос кCMdaAudioPlayerUtility:: PlayL (). В проектеSound1, это сделано посредством вызоваCSoundPlayer:: PlayL():
void CSoundPlayer::Play() { if(iState==EReady) { iState=EPlaying; iMdaPlayer->Play(); } }
Система уведомит Вас об окночании воспроизведения вызовом MapcPlayComplete(). Это пример выполнения для Sound1:
void CSoundPlayer::MapcPlayComplete(TInt aError) { iState= aError ? ENotReady: EReady; }
Чтобы выполнить этот пример, Вы должны поместить WAV-файл, названный play.wav в каталоге C:\System\Apps\Sound\ вашего устройства (C:\Symbian\6.1\Series60\Epoc32\Wins\c\system\apps\Sound для симулятора).