|
Проигрывание 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 для симулятора).
|