mmlibs/mmfw/tsrc/mmvalidationsuite/mmvalidationsuiteagents/src/audioplayagent.cpp
changeset 0 b8ed18f6c07b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/tsrc/mmvalidationsuite/mmvalidationsuiteagents/src/audioplayagent.cpp	Thu Oct 07 22:34:12 2010 +0100
@@ -0,0 +1,492 @@
+// Copyright (c) 2005-2009 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:
+// Part of the MVS Agents for TechView
+//
+
+#include "audioplayagent.h"
+#include <e32def.h>
+#include <flogger.h>
+
+
+/**
+Constructs and initialises a new instance of the MVS audio player utility.
+
+The function leaves if the MVS audio player utility object cannot be created.
+
+No callback notification is made upon completion of NewL().
+
+@param  aObserver
+		Class to receive state change events from play agent.
+
+@return     A pointer to the new MVS audio player utility object.
+*/
+
+EXPORT_C CMVSAudioPlayAgent* CMVSAudioPlayAgent::NewL(MMVSClientObserver& aObserver)
+     {
+     CMVSAudioPlayAgent* self = new(ELeave) CMVSAudioPlayAgent(aObserver);
+     CleanupStack::PushL(self);
+     self->ConstructL();
+     CleanupStack::Pop(self);
+     return self;
+     }
+
+
+void CMVSAudioPlayAgent::ConstructL()
+     {
+     iPlayer = CMdaAudioPlayerUtility::NewL(*this);
+     User::LeaveIfError(iFileLogger.Connect());
+     iFileLogger.CreateLog(_L("LogMVSappUi"),_L("LogFile.txt"),EFileLoggingModeAppend);
+     }
+
+
+EXPORT_C CMVSAudioPlayAgent::~CMVSAudioPlayAgent()
+     {
+     delete iPlayer;
+     if(iFileLogger.Handle())
+     	{
+     	iFileLogger.CloseLog();
+	 	iFileLogger.Close();
+     	}
+     }
+
+
+CMVSAudioPlayAgent::CMVSAudioPlayAgent(MMVSClientObserver& aObserver):iObserver(aObserver)
+     {
+     iObserver.UpdateStateChange(ENotReady, KErrNone);
+     }
+
+EXPORT_C void CMVSAudioPlayAgent::OpenFileL(TDesC& aFile)
+     {
+     iPlayer->Close();//Close any existing clip
+     iState = EAudioOpening;
+     iObserver.UpdateStateChange(EAudioOpening, KErrNone);
+     iPlayer->OpenFileL(aFile);
+     }
+
+EXPORT_C void CMVSAudioPlayAgent::OpenFileL(TMMSource& /*aSource*/)
+     {
+     
+     }
+
+/**
+Begins playback of the initialised audio sample at the current volume
+and priority levels.
+
+Sets the current state of the system to EAudioPlaying
+When playing of the audio sample is complete, successfully or
+otherwise, the callback function
+CMVSAudioPlayAgent::MapcPlayComplete() is called, which inturn
+sets the state to EAudioOpened. 
+*/
+EXPORT_C void CMVSAudioPlayAgent::Play()
+     {
+     //must be in open or paused states 
+     if((iState == EAudioOpened)||(iState == EAudioPaused)||(iState == EAudioStopped))
+     	{
+     	iPlayer->Play();
+     	iState = EAudioPlaying;
+     	iObserver.UpdateStateChange(EAudioPlaying, KErrNone);	
+     	}
+     }
+
+
+/**
+Pauses the playback of the audio clip.
+and updates the current state to EAudioPaused.
+*/
+EXPORT_C TInt CMVSAudioPlayAgent::Pause()
+     {
+     if(iState == EAudioPlaying)
+     	{
+     	TInt err = iPlayer->Pause();
+     	if ( err != KErrNone)
+     		{
+     		return err;
+     		}
+     	iState = EAudioPaused;
+     	iObserver.UpdateStateChange(EAudioPaused, KErrNone);
+     	}
+     return KErrNone;	
+     }
+
+
+/**
+Stops playback of the audio sample as soon as possible.
+
+Sets the current state to EAudioStopped
+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.  
+*/
+EXPORT_C void CMVSAudioPlayAgent::Stop()
+	{
+    if(iState == EAudioPlaying || iState == EAudioPaused)
+    	{
+     	iPlayer->Stop();
+     	iState = EAudioStopped;
+     	iObserver.UpdateStateChange(iState, KErrNone);	
+     	}
+    }     
+
+/**
+Added for future implimentation. Currently not supported
+*/
+EXPORT_C void CMVSAudioPlayAgent::Forward()
+    {
+    // future implementation	
+    }  
+     
+
+/**
+Added for future implimentation. Currently not supported
+*/
+EXPORT_C void CMVSAudioPlayAgent::Rewind()
+    {
+    // future implementation
+    }  
+
+     
+/*
+Initialisation completion callback for the MVS play agent
+*/
+void CMVSAudioPlayAgent::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/)
+    {
+    if(aError == KErrNone)
+    	{
+    	iState = EAudioOpened;
+     	iFileLogger.Write(_L("Audio Opened ")) ;
+       	}
+    else
+     	{
+     	iState = ENotReady; //init failed so from opening to NotReady
+     	iFileLogger.Write(_L("MapcInitComplete: Audio Not Ready")) ;
+     	}
+    iObserver.UpdateStateChange(iState, aError);
+    }
+
+
+/*
+Play back completion callback for the MVS play agent
+*/
+void CMVSAudioPlayAgent::MapcPlayComplete(TInt aError)
+	{
+	if(aError == KErrNone)
+		{
+		iState = EAudioOpened;
+		iFileLogger.Write(_L("MapcPlayComplete:Audio Opened Play Complete")) ;
+		}
+	
+	iObserver.UpdateStateChange(iState, aError);
+	}
+
+void CMVSAudioPlayAgent::MarncResourceAvailable(TUid /*aNotificationEventId*/, const TDesC8& /*aNotificationData*/)
+	{
+	}
+
+
+/**
+Returns the current playback volume
+
+@param aVolume
+       A volume value between 0 and the value returned by MaxVolume().
+
+@return One of the global error codes.
+*/
+EXPORT_C TInt CMVSAudioPlayAgent::GetVolume(TInt& aVolume) 
+    {
+    return iPlayer->GetVolume(aVolume);
+    }
+
+
+/**
+Returns an integer representing the maximum volume.
+
+This is the maximum value which can be passed to
+CMdaAudioPlayerUtility::SetVolume(). This value is platform 
+independent, but is always greater than or equal to one.
+
+The function raises a CMdaAudioPlayerUtility 1 panic if the 
+audio player utility is not initialised.
+
+@return The maximum volume setting.
+*/
+EXPORT_C TInt CMVSAudioPlayAgent::MaxVolume() 
+    {
+    return iPlayer->MaxVolume();
+    }
+    
+
+/**
+Returns the duration of the audio sample.
+
+The function raises a CMdaAudioPlayerUtility 1 panic if the audio
+player utility is not initialised.
+
+@return The duration in microseconds.
+*/  
+EXPORT_C TTimeIntervalMicroSeconds CMVSAudioPlayAgent::Duration() 
+    {
+    return iPlayer->Duration();
+    }
+     
+
+/**
+Changes the current playback volume to a specified value.
+
+The volume can be changed before or during playback and is effective
+immediately. The volume can be set to any value between zero (mute) and 
+the maximum permissible volume (determined using MaxVolume()).Also the 
+period over which the volume level is to rise smoothly from nothing to
+the normal volume level,is given by the ramp up time.
+
+
+The function raises a CMdaAudioPlayerUtility 1 panic if
+the audio player utility is not initialised.
+
+@param  aVolume
+        The volume setting. This can be any value from zero to
+        the value returned by a call to
+        CMVSAudioPlayAgent::MaxVolume().
+        Setting a zero value mutes the sound. Setting the
+        maximum value results in the loudest possible sound.
+
+@param  aRampDuration
+        The period over which the volume is to rise. A zero
+        value causes the audio sample to be played at the
+        normal level for the full duration of the playback. A
+        value which is longer than the duration of the audio
+        sample means that the sample never reaches its normal
+        volume level.
+
+*/
+EXPORT_C void CMVSAudioPlayAgent::SetVolume(TInt aVolume, TTimeIntervalMicroSeconds aRamp)
+    {
+    iPlayer->SetVolume(aVolume);
+    iPlayer->SetVolumeRamp(aRamp);
+    }
+
+
+/**
+Returns the current playback position in microseconds from the start of the clip.
+
+@param   aPosition
+         The current time position in microseconds from the start of the clip to the current
+         play position.
+
+@return the current playback position in microseconds.
+*/    
+EXPORT_C TTimeIntervalMicroSeconds CMVSAudioPlayAgent::GetPosition(TTimeIntervalMicroSeconds& aPosition) 
+    {
+    return iPlayer->GetPosition(aPosition);
+    }
+     
+     
+/**
+Sets the current playback position in microseconds from the start of the clip.
+
+@param  aPosition
+        The position to move to in microseconds from the start of the clip.
+*/
+EXPORT_C void CMVSAudioPlayAgent::SetPosition(TTimeIntervalMicroSeconds aPosition)
+    {
+    iPlayer->SetPosition(aPosition);
+    }
+    
+
+/**
+Returns the current playback balance.
+
+@param  aBalance
+        A value between KMMFBalanceMaxLeft
+        and KMMFBalanceMaxRight.
+
+@return An error code indicating if the function call was successful. KErrNone on success, otherwise
+        another of the system-wide error codes.
+*/
+EXPORT_C TInt CMVSAudioPlayAgent::GetBalance(TInt& aBalance) 
+    {
+    return iPlayer->GetBalance(aBalance);
+    }
+
+
+/**
+Sets the current playback balance.
+
+@param  aBalance
+        A value between KMMFBalanceMaxLeft
+        and KMMFBalanceMaxRight. The default value is
+        KMMFBalanceCenter.
+
+@return "TInt" An error code indicating if the function call was successful. KErrNone on success, otherwise
+        another of the system-wide error codes.
+*/
+EXPORT_C TInt CMVSAudioPlayAgent::SetBalance(TInt aBalance)
+    {
+    return iPlayer->SetBalance(aBalance);
+    }
+
+
+/**
+Sets the number of times the audio sample is to be repeated during the
+playback operation.
+
+A period of silence can follow each playing of the sample. The audio
+sample can be repeated indefinitely.
+
+@param  aNoRepeats
+        The number of times the audio sample, together with
+        the trailing silence, is to be repeated. If this is
+        set to KMdaRepeatForever, then the audio
+        sample, together with the trailing silence, is
+        repeated indefinitely or until Stop() is
+        called. If this is set to zero, then the audio sample
+        is not repeated.
+@param  aDelay
+        The time interval of the training silence.
+*/
+EXPORT_C void CMVSAudioPlayAgent::SetRepeats(TInt aNoRepeats, TTimeIntervalMicroSeconds aDelay)
+    {
+    iPlayer->SetRepeats(aNoRepeats, aDelay);
+    }
+
+
+/**
+Set the current playback window
+
+@param	aStart
+		Start time of playback window relative to start of file
+@param	aEnd
+		End time of playback window relative to start of file
+
+@return "TInt" One of the global error codes
+*/
+EXPORT_C TInt CMVSAudioPlayAgent::SetPlayWindow(TTimeIntervalMicroSeconds aStart, TTimeIntervalMicroSeconds aEnd)
+    {
+    return iPlayer->SetPlayWindow(aStart,aEnd);
+    }
+
+
+/**
+Clear the current playback window
+
+@return "TInt" One of the global error codes
+*/   
+EXPORT_C TInt CMVSAudioPlayAgent::ClearPlayWindow()
+    {
+    return iPlayer->ClearPlayWindow();
+    }     
+
+
+/**
+Sets the priority for playback. This is used to arbitrate between multiple
+objects trying to access a single sound device.
+
+@param  aPriority
+        The priority level to apply, EMdaPriorityMin client can be interrupted by any
+        other client, EMdaPriorityNormal client can only be interrupted by a client 
+        with a higher priority or EMdaPriorityMax client cannot be interrupted by other 
+        clients.
+@param  aPreference
+        The quality/time preferences to apply.
+
+@return An error code indicating if the function call was successful. KErrNone on success, otherwise
+        another of the system-wide error codes.
+*/
+EXPORT_C TInt CMVSAudioPlayAgent::SetPriority(TInt aPriority, TMdaPriorityPreference aPreference)
+    {
+    return iPlayer->SetPriority(aPriority,aPreference);
+    }
+
+
+/**
+Closes the current audio clip (allowing another clip to be opened)
+Sets the current state to ENotReady
+*/  
+EXPORT_C void CMVSAudioPlayAgent::Reset()
+    {
+    iPlayer->Close();
+    iState = ENotReady;
+    iObserver.UpdateStateChange(ENotReady, KErrNone);
+    }
+
+     
+EXPORT_C void CMVSAudioPlayAgent::SetAutoPauseResume(TBool /*aEnable*/)
+    {
+    }
+
+
+/**
+Returns an array containing the MetaDataEntry for the given audio clip
+
+@param  aMetaArray
+        The meta data Array
+
+@leave	Leaves with KErrNotFound if the meta data entry does not exist or
+		KErrNotSupported if the controller does not support meta data 
+		information for this format. Other errors indicate more general system
+		failure.
+*/
+EXPORT_C void CMVSAudioPlayAgent::GetMetaArrayL(RPointerArray<CMMFMetaDataEntry>& aMetaArray)
+	{
+	//Reset the meta array
+    aMetaArray.Reset();
+	//Find how many elements there are to obtain
+	TInt noMetaEntries = 0;
+    TInt err = iPlayer->GetNumberOfMetaDataEntries(noMetaEntries);
+    if(err == KErrNone)
+	    {
+	    //Add the elements, one at a time.
+	    for(TInt counter = 0; counter < noMetaEntries; ++counter)
+	         {
+	         aMetaArray.Append(iPlayer->GetMetaDataEntryL(counter));
+	         }	
+	    }
+	User::LeaveIfError(err);	
+	}
+     
+	
+/**
+Returns the bit rate of the audio clip.
+
+@param  aBitRate
+        Bit rate of the audio clip.
+
+@return One of the global error codes.
+*/
+EXPORT_C TInt CMVSAudioPlayAgent::GetBitRate(TUint& aBitRate)
+	{
+	return iPlayer->GetBitRate(aBitRate);
+	}
+
+
+/**
+Returns the controller implementation information associated with the current controller.
+
+@return The controller implementation structure
+*/
+EXPORT_C const CMMFControllerImplementationInformation& CMVSAudioPlayAgent::GetControllerInfoL()
+	{
+	return iPlayer->ControllerImplementationInformationL();	
+	}
+
+
+/**
+Returns the current state of the CMVSAudioPlayAgent.
+
+@return The current state, iState.
+*/
+EXPORT_C TMVSState CMVSAudioPlayAgent::GetState()
+	{
+	return iState;	
+	}