mmfenh/enhancedaudioplayerutility/AudioPlayer/src/S60AudioPlayer.cpp
changeset 0 71ca22bcf22a
--- /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);
+	}
+