diff -r 000000000000 -r 71ca22bcf22a mmfenh/enhancedaudioplayerutility/AudioPlayer/src/S60AudioPlayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmfenh/enhancedaudioplayerutility/AudioPlayer/src/S60AudioPlayer.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,528 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Base class definition of the S60 Audio Stream Player +* +*/ + + +#include "S60AudioPlayer.h" +#include "S60AudioSource.h" +#include "S60PlayerEventDispatcher.h" + +CS60AudioPlayer::~CS60AudioPlayer() + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioPlayer::~CS60AudioPlayer")); +#endif + + delete iRepeatTrailingSilenceTimer; + if (iFindAndOpenController) + iFindAndOpenController->Close(); + delete iFindAndOpenController; + delete iControllerEventMonitor; + delete iDispatcher; + iController.Close(); + + } + +CS60AudioPlayer::CS60AudioPlayer( + MS60AudioPlayerObserver& aObserver, + TInt aPriority, + TMdaPriorityPreference aPref ) : + iObserver(aObserver), + iSource(NULL), + iAudioPlayDeviceCommands(iController) + { + iPrioritySettings.iPriority = aPriority; + iPrioritySettings.iPref = aPref; + } + +EXPORT_C CS60AudioPlayer* CS60AudioPlayer::NewL( + MS60AudioPlayerObserver& aObserver, + TInt aPriority, + TMdaPriorityPreference aPref ) + { + +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioPlayer::NewL")); +#endif + + CS60AudioPlayer* self = new(ELeave) CS60AudioPlayer(aObserver, aPriority, aPref); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CS60AudioPlayer::ConstructL() + { + +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioPlayer::ConstructL")); +#endif + iDispatcher = CPlayerEventDispatcher::NewL(iObserver); + iControllerEventMonitor = CMMFControllerEventMonitor::NewL(*this, iController); + RDebug::Print(_L("CS60AudioPlayer::ConstructL [%x]"),iControllerEventMonitor); + iFindAndOpenController = CMMFFindAndOpenController::NewL(*this); + RDebug::Print(_L("CS60AudioPlayer::ConstructL [%x]"),iFindAndOpenController); + iRepeatTrailingSilenceTimer = CRepeatTrailingSilenceTimer::NewL(*this); + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::AddDataSource +// Adds the DataSource +// ----------------------------------------------------------------------------- +// +void CS60AudioPlayer::AddDataSource( + CS60AudioBaseSource& aDataSource ) + { + +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioPlayer::AddDataSource")); +#endif + + iSource = &aDataSource; + + iFindAndOpenController->Configure(KUidMediaTypeAudio, iPrioritySettings); + iFindAndOpenController->ConfigureController(iController, *iControllerEventMonitor, + CMMFFindAndOpenController::EPlayback); + iFindAndOpenController->ConfigureSourceSink(CMMFFindAndOpenController::TSourceSink(TUid::Uid(0x10207AF3)), + CMMFFindAndOpenController::TSourceSink(KUidMmfAudioOutput)); + + TBuf8<20> mimeType; + iSource->GetMimeType(mimeType); + iFindAndOpenController->OpenByMimeType(mimeType); + } + +/** +Begins playback of the initialised audio sample at the current volume +and priority levels. + +When playing of the audio sample is complete, successfully or +otherwise, the callback function +MMdaAudioPlayerCallback::MapcPlayComplete() is +called. This function raises a CMdaAudioPlayerUtility 1 panic if the +audio player utility is not initialised. +*/ +EXPORT_C TInt CS60AudioPlayer::Play() + { + TInt err = KErrNone; + if(iState == EPlayerPlaying) + { + + err = KErrNotReady; + + } + else + + { + + err = DoPlay(); + } + return err; + } + +TInt CS60AudioPlayer::DoPlay() + { + + TInt err = KErrNone; + if (iState != EPlayerPaused) + { + if (err==KErrNone) + err = iController.SetPosition(iPosition); + } + + if (err==KErrNone) + { + err = iController.Play(); + + if(!err) + { + iState = EPlayerPlaying; + iDispatcher->StateChanged(iState, KErrNone); + } + + } + return err; + } + +/** +Stops playback of the audio sample as soon as possible. + +If the audio sample is playing, playback is stopped as soon as +possible. If playback is already complete, nothing further happens as +a result of calling this function. The callback function +MMdaAudioPlayerCallback::MapcPlayComplete() is not +called. The function raises a CMdaAudioPlayerUtility 1 panic if the +audio player utility is not initialised. + +*/ +EXPORT_C TInt CS60AudioPlayer::Stop() + { +TInt err = KErrNone; + + // cancel the repeat timer in case the client has called Stop() + // during the trailing silence period + //iRepeatTrailingSilenceTimer->Cancel(); + + err = iController.Stop(); + + //tpoon + iPosition = 0; + + TPlayerState iOldState = iState; + iState = EPlayerStopped; + + if (iOldState==EPlayerPlaying || iOldState==EPlayerPaused) + iDispatcher->StateChanged(iState, KErrNone); + + iController.Prime(); + return err; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::Pause +// Pauses the Audio Playback +// ----------------------------------------------------------------------------- +// + +EXPORT_C TInt CS60AudioPlayer::Pause() + { +TInt err = KErrNone; + if (iState==EPlayerPlaying) + { + // cancel the repeat timer in case the client has called Stop() + // during the trailing silence period + //iRepeatTrailingSilenceTimer->Cancel(); + + err = iController.Pause(); + iState = EPlayerPaused; + iDispatcher->StateChanged(iState, KErrNone); + } + return err; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::SetPriority +// Sets the Priority of the the Audio +// returns One of the Standard Error Codes +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioPlayer::SetPriority(TInt aPriority, TMdaPriorityPreference aPref) + { + iPrioritySettings.iPref = aPref; + iPrioritySettings.iPriority = aPriority; + iFindAndOpenController->Configure(KUidMediaTypeAudio, iPrioritySettings); + return iController.SetPrioritySettings(iPrioritySettings); + } + + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::FastForward +// FastForwards the Current the the Audio by aStep +// returns One of the Standard Error Codes +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioPlayer::FastForward(TTimeIntervalMicroSeconds& /*aStep*/) + { + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::Rewind +// Rewinds the Current the the Audio by aStep +// returns One of the Standard Error Codes +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioPlayer::Rewind(TTimeIntervalMicroSeconds& /*aStep*/) + { + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::GetMaxVolume +// Gets the maximum volume supported +// returns One of the Standard Error Codes +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioPlayer::GetMaxVolume() + { + TInt maxVolume = 0; + #ifdef _DEBUG + TInt error = + #endif + iAudioPlayDeviceCommands.GetMaxVolume(maxVolume); + return maxVolume; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::SetVolume +// Sets the volume with aVolume +// returns One of the Standard Error Codes +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioPlayer::SetVolume(TInt aVolume) + { + TInt err = iAudioPlayDeviceCommands.SetVolume(aVolume); + return err; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::GetVolume +// Gets the current volume +// returns One of the Standard Error Codes +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioPlayer::GetVolume(TInt& aVolume) + { + TInt error = iAudioPlayDeviceCommands.GetVolume(aVolume); + return error; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::GetDuration +// Gets the current duration +// returns Duration in Microseconds +// ----------------------------------------------------------------------------- +// +EXPORT_C TTimeIntervalMicroSeconds CS60AudioPlayer::GetDuration() + { + TTimeIntervalMicroSeconds duration = 0; + return duration; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::GetBitRate +// Gets the Bitrate +// returns bitrate +// ----------------------------------------------------------------------------- +// +EXPORT_C TUint CS60AudioPlayer::GetBitRate() + { + TUint bitRate; + RMMFAudioControllerCustomCommands controller(iController); + TInt err = controller.GetSourceBitRate(bitRate); + return bitRate; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::GetPosition +// Gets the current Position +// returns position in Microseconds +// ----------------------------------------------------------------------------- +// +EXPORT_C TTimeIntervalMicroSeconds CS60AudioPlayer::GetPosition() + { + // if (iState==EPlayerPlaying) + iController.GetPosition(iPosition); + return iPosition; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::SetPosition +// Sets the current Position +// ----------------------------------------------------------------------------- +// +EXPORT_C void CS60AudioPlayer::SetPosition(TTimeIntervalMicroSeconds& aPosition) + { + const TTimeIntervalMicroSeconds maxPosition(GetDuration()); + const TTimeIntervalMicroSeconds minPosition(0); + + if (aPosition > maxPosition) + iPosition = maxPosition; + else if (aPosition < minPosition) + iPosition = minPosition; + else + iPosition = aPosition; + + if (iState==EPlayerPlaying || iState==EPlayerPaused) + { + iController.SetPosition(iPosition); + } + + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::SetPlayWindow +// Sets the current Playwindow Position +// ----------------------------------------------------------------------------- +// +EXPORT_C void CS60AudioPlayer::SetPlayWindow(TTimeIntervalMicroSeconds& /*aStart*/, TTimeIntervalMicroSeconds& /*aEnd*/) + { + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::GetPlayWindow +// Gets the current Playwindow Position +// ----------------------------------------------------------------------------- +// +EXPORT_C void CS60AudioPlayer::GetPlayWindow(TTimeIntervalMicroSeconds& /*aStart*/, TTimeIntervalMicroSeconds& /*aEnd*/) + { + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::ResetPlayWindow +// Resets the Playwindow +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioPlayer::ResetPlayWindow() + { + return KErrNotSupported; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::SetRepeats +// Sets the number of times the Audio should be played +// ----------------------------------------------------------------------------- +// +EXPORT_C void CS60AudioPlayer::SetRepeats(TInt /*aNumber*/, const TTimeIntervalMicroSeconds& /*aTrailingSilence*/) + { + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::GetBalance +// Gets the current Balance +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioPlayer::GetBalance() + { + TInt balance; + TInt err = iAudioPlayDeviceCommands.GetBalance(balance); + return balance; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::SetBalance +// Sets the current Balance +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioPlayer::SetBalance(TInt& aBalance) + { + TInt err = iAudioPlayDeviceCommands.SetBalance(aBalance); + return err; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::IsSeekingSupported +// Gets the current Seeking Support +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CS60AudioPlayer::IsSeekingSupported() + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::IsRandomSeekingSupported +// Gets the current RandomSeeking Support +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CS60AudioPlayer::IsRandomSeekingSupported() + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CS60AudioPlayer::CustomInterface +// Gets the CustomInterface +// ----------------------------------------------------------------------------- + +EXPORT_C TAny* CS60AudioPlayer::CustomInterface(TUid /*aInterfaceId*/) + { + TAny* result = NULL; + return result; + } + +/**************************************************************************************************** + MRepeatTrailingSilenceTimerObs implementation +****************************************************************************************************/ +void CS60AudioPlayer::RepeatTrailingSilenceTimerComplete() + { + } + +/**************************************************************************************************** + MMMFFindAndOpenControllerObserver implementation +****************************************************************************************************/ + +void CS60AudioPlayer::MfaocComplete( + TInt& aError, + RMMFController* aController, + TUid aControllerUid, + TMMFMessageDestination* aSourceHandle, + TMMFMessageDestination* /*aSinkHandle*/) + { + +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioPlayer::MfaocComplete")); +#endif + + if (aError == KErrNone) + { + iSource->iSourceHandle = *aSourceHandle; + iSource->iControllerUid = aControllerUid; + iSource->iController = *aController; + } + iDispatcher->AddSourceComplete(aError); + iController.Prime(); + } + +/**************************************************************************************************** + MMMFControllerEventMonitorObserver implementation +****************************************************************************************************/ + +void CS60AudioPlayer::HandleEvent(const TMMFEvent& aEvent) + { + +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioPlayer::HandleEvent")); +#endif + + // handle loading started/complete messages first, as the later code does not explicitly check the event type + + if (aEvent.iEventType == KMMFEventCategoryPlaybackComplete) + { + //we've repeated enough times now + iState = EPlayerStopped; + iPosition = 0; + iDispatcher->StateChanged(iState, aEvent.iErrorCode); + iController.Prime(); + } + // else we have an unexpected event that cannot be dealt with by the client. + // We will simply ignore this. + } + + +/**************************************************************************************************/ + +CRepeatTrailingSilenceTimer* CRepeatTrailingSilenceTimer::NewL(MRepeatTrailingSilenceTimerObs& aObs) + { + CRepeatTrailingSilenceTimer* s = new(ELeave) CRepeatTrailingSilenceTimer(aObs); + CleanupStack::PushL(s); + s->ConstructL(); + CleanupStack::Pop(s); + return s; + } + +void CRepeatTrailingSilenceTimer::RunL() + { + iObs.RepeatTrailingSilenceTimerComplete(); + } + +CRepeatTrailingSilenceTimer::CRepeatTrailingSilenceTimer(MRepeatTrailingSilenceTimerObs& aObs) : + CTimer(EPriorityHigh), + iObs(aObs) + { + CActiveScheduler::Add(this); + } +