Проигрывание WAV-файлов в Symbian
Проигрывание 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; };
Ключевые классы: 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 для симулятора).
Украинская Баннерная Сеть
|