mobilemessaging/audiomsg/src/audiomessagerecorder.cpp
changeset 0 72b543305e3a
child 19 7e4e4bcc75b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/audiomsg/src/audiomessagerecorder.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,479 @@
+/*
+* Copyright (c) 2005-2006 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:   This class acts as a high level wrapper around the 
+*                CMdaAudioRecorderUtility playback and recording 
+*                functionalities. Functons for output route handling.
+*
+*/
+
+
+
+#include <AudioPreference.h>
+#include <AudioOutput.h>
+#include <AudioInput.h>
+#include <avkon.hrh>
+#include "audiomessagebeep.h"
+#include "audiomessagerecorder.h"
+#include "amsvoiceobserver.h"
+#include "AudioMessageLogging.h"
+
+const TInt KAmsVolumeSteps = 10;
+
+const TUint KAmsDefaultAmrBitrate( 12200 );  //Voice Recorder uses this value for MMS
+                                             //optimized voice
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::NewL
+// ---------------------------------------------------------
+//
+CAudioMessageRecorder* CAudioMessageRecorder::NewL( const RFile& aFile,  const TBool aAudioOutput )
+	{
+	CAudioMessageRecorder * recorder = new( ELeave ) CAudioMessageRecorder( );
+	CleanupStack::PushL( recorder );
+	recorder->ConstructL( aFile, aAudioOutput );
+	CleanupStack::Pop( recorder );
+	return recorder;	
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::ConstructL
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::ConstructL( const RFile& aFile, const TBool aAudioOutput )
+	{
+AMSLOGGER_WRITE( "CAudioMessageRecorder::ConstructL" );	
+    iRecUtility = CMdaAudioRecorderUtility::NewL(
+       	*this,
+        NULL,
+        KAudioPriorityRecording,
+        TMdaPriorityPreference( KAudioPrefRealOneLocalPlayback ) );
+
+	iRecUtility->OpenFileL( aFile );
+	iBeepPlayer = CAudioMessageBeep::NewL();
+	iBeepPlayer->PrepareToneL( EAvkonSIDVoiceRecordingStartTone );
+	iPause = EFalse;
+	iSupportAudioOutput = aAudioOutput;
+	iTimer = CPeriodic::NewL( EPriorityNormal + 1 ); 
+	
+   	if ( !iActiveWait.IsStarted() )
+		{
+		iActiveWait.Start();
+		}
+AMSLOGGER_WRITE( "CAudioMessageRecorder::ConstructL DONE!" );		
+	}
+
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::MoscoStateChangeEvent
+// ---------------------------------------------------------
+void CAudioMessageRecorder::MoscoStateChangeEvent( CBase* /*aObject*/, TInt aPreviousState, 
+	TInt aCurrentState, TInt  aErrorCode)
+	{
+	AMSLOGGER_WRITEF( _L( "CAudioMessageRecorder: MoscoStateChangeEvent() prev: %d, current: %d, error: %d" ), aPreviousState,
+			aCurrentState, aErrorCode );
+
+			
+	if ( iActiveWait.IsStarted() )
+		{
+		iActiveWait.AsyncStop();
+		}
+
+    iErrorCode = aErrorCode;
+    
+    //Let's not go here in case there has been an error in opening the file.
+    //That's why the error code has been checked here
+    if( aCurrentState == CMdaAudioClipUtility::EOpen 
+         && aPreviousState == CMdaAudioClipUtility::ENotReady 
+         && !iAudioInput
+         && iErrorCode == KErrNone )
+        {
+        TRAPD(error, iAudioInput = CAudioInput::NewL( *iRecUtility ); 
+            ResetAudioInputL();
+            iRecUtility->SetDestinationBitRateL( KAmsDefaultAmrBitrate ));
+        
+        //KErrNotSupported is allowed because it works OK even if CAudioOutput
+        //is not supported
+        if( error != KErrNone && error != KErrNotSupported )
+            {
+            iErrorCode = error;
+            }
+        
+        }
+    else if ( aCurrentState == CMdaAudioClipUtility::EOpen && aPreviousState ==
+    	CMdaAudioClipUtility::EPlaying )
+   		{ 
+   		iObserver->PlayingStops();   
+ 		}   
+    else if ( aCurrentState == CMdaAudioClipUtility::EOpen && aPreviousState == 
+    	CMdaAudioClipUtility::ERecording )
+   		{ 
+   		if ( !iPause )
+	   		{
+	   		iObserver->PlayingStops();   
+	   		}
+   		}
+ 	 else if ( aCurrentState == CMdaAudioClipUtility::ERecording && 
+ 	    aPreviousState == CMdaAudioClipUtility::EOpen )
+ 	    {
+ 	    iBeepPlayer->PrepareTone( EAvkonSIDVoiceRecordingStopTone );    
+ 	    }	  
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::SetVol
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::SetVol( TInt aVal )
+	{
+	TInt max = iRecUtility->MaxVolume();
+	TInt step = max / KAmsVolumeSteps;
+	iCurrentVolume = aVal * step;
+	
+    if ( iCurrentVolume >= max )
+        iRecUtility->SetVolume( max );
+    else if ( iCurrentVolume <= 0)
+        iRecUtility->SetVolume( 0 );
+    else
+        iRecUtility->SetVolume( iCurrentVolume );
+
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::StartPlayingL
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::StartPlayingL()
+	{  
+	if( iErrorCode != KErrNone )
+	    {
+AMSLOGGER_WRITEF( _L( "CAudioMessageRecorder: StartPlayingL(): Leave ( %d ) occured." ), iErrorCode );
+	    User::Leave( iErrorCode);
+	    return;
+	    }	 
+	iRecUtility->SetPlaybackBalance( KMMFBalanceCenter );
+	iRecUtility->SetVolume( iCurrentVolume ) ;
+    iRecUtility->PlayL();
+ 	if ( !iActiveWait.IsStarted() )
+		{
+		iActiveWait.Start();
+		}
+	StartTimer();
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::StartRecordingL
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::StartRecordingL()
+	{ 
+	if( iErrorCode != KErrNone )
+	    {
+AMSLOGGER_WRITEF( _L( "CAudioMessageRecorder: StartRecordingL(): Leave ( %d ) occured." ), iErrorCode );
+	    User::Leave( iErrorCode);
+	    return;
+	    }
+	
+    iRecUtility->SetAudioDeviceMode( CMdaAudioRecorderUtility::ELocal );
+    iRecUtility->SetPriority( KAudioPriorityRecording, 
+        TMdaPriorityPreference( KAudioPrefVoiceRec ) );	
+    iRecUtility->SetGain( iRecUtility->MaxGain() );
+    iRecUtility->SetPosition( TTimeIntervalMicroSeconds( 0 ) );
+
+	iBeepPlayer->PlayTone( EAvkonSIDVoiceRecordingStartTone );
+	//iBeepPlayer->PrepareToneL( EAvkonSIDVoiceRecordingStopTone );    
+
+    iRecUtility->RecordL();
+ 	if ( !iActiveWait.IsStarted() )
+		{
+		iActiveWait.Start();
+		}
+	StartTimer();
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::Pause
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::Pause()
+	{
+	iPause = ETrue;
+    iRecUtility->Stop();
+    StopTimer();
+	iRecUtility->SetPosition( TTimeIntervalMicroSeconds( 0 ) );
+    iRecUtility->SetPriority( KAudioPriorityRecording, 
+    	TMdaPriorityPreference( KAudioPrefRealOneLocalPlayback ) );	
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::Stop
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::StopL()
+	{
+	iPause = EFalse;
+    iRecUtility->Stop();
+    StopTimer();
+	iRecUtility->SetPosition( TTimeIntervalMicroSeconds( 0 ) );
+    iRecUtility->SetPriority( KAudioPriorityRecording, 
+    	TMdaPriorityPreference( KAudioPrefRealOneLocalPlayback) );	
+	iBeepPlayer->PlayTone( EAvkonSIDVoiceRecordingStopTone );
+	//iBeepPlayer->PrepareToneL( EAvkonSIDVoiceRecordingStartTone );		
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::ContinueL
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::ContinueL()
+	{
+	if( iErrorCode != KErrNone )
+	    {
+AMSLOGGER_WRITEF( _L( "CAudioMessageRecorder: ContinueL(): Leave ( %d ) occured." ), iErrorCode );
+	    User::Leave( iErrorCode);
+	    return;
+	    }
+	
+	iPause = EFalse;
+	iRecUtility->SetPriority( KAudioPriorityRecording, TMdaPriorityPreference( KAudioPrefVoiceRec ) );
+        iRecUtility->RecordL(); 
+ 	if ( !iActiveWait.IsStarted() )
+		{
+		iActiveWait.Start();
+		}
+	StartTimer();
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::Constructor
+// ---------------------------------------------------------
+//
+CAudioMessageRecorder::CAudioMessageRecorder() 
+	{
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::Destructor
+// ---------------------------------------------------------
+//
+CAudioMessageRecorder::~CAudioMessageRecorder()
+	{ 
+	delete iAudioOutput;
+  	delete iAudioInput;
+    delete iRecUtility;
+	delete iTimer;
+   	delete iBeepPlayer;
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::SetObserver
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::SetObserver(MAmsVoiceObserver* aObserver )
+	{
+	iObserver = aObserver;
+	}
+	
+// ---------------------------------------------------------
+// CAudioMessageRecorder::StartTimer
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::StartTimer()
+	{
+	StopTimer();	// stop if already running
+	TCallBack cb( TimerCallBack, this );
+	iTimer->Start( 0, KAmsDisplayUpdateDelay, cb );
+	}
+
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::StopTimer
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::StopTimer()
+	{
+	iTimer->Cancel();
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::TimerCallBack
+// ---------------------------------------------------------
+//
+TInt CAudioMessageRecorder::TimerCallBack( TAny* aRecorder )
+	{
+	CAudioMessageRecorder* recorder = reinterpret_cast< CAudioMessageRecorder* >( aRecorder );
+	recorder->HandleTick();
+	return ETrue;
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::HandleTick
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::HandleTick()
+	{	
+	TRAPD( error, iObserver->UpdateL( iRecUtility->Position(), iErrorCode ) );
+	if ( error != KErrNone )
+	    {
+	    iErrorCode = error;
+	    }
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::GetPosition
+// ---------------------------------------------------------
+//
+TTimeIntervalMicroSeconds CAudioMessageRecorder::GetPosition()
+	{
+	return iRecUtility->Position();
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::GetDuration
+// ---------------------------------------------------------
+//
+TTimeIntervalMicroSeconds CAudioMessageRecorder::GetDuration()
+	{
+	return iRecUtility->Duration();
+	}
+	
+// ---------------------------------------------------------
+// CAudioMessageRecorder::SetAudioOutput
+// ---------------------------------------------------------
+//
+TInt CAudioMessageRecorder::SetAudioOutput( TBool aOutputPublic )
+	{ 
+	TInt err ( KErrNone );
+	CAudioOutput::TAudioOutputPreference outputPckg;
+
+	if ( iAudioOutput )
+		{
+		if ( aOutputPublic )
+			{
+			outputPckg = CAudioOutput::EPublic;
+			}
+		else
+			{
+			outputPckg = CAudioOutput::EPrivate;
+			}
+		TRAP( err, iAudioOutput->SetAudioOutputL( outputPckg ) );
+		}
+	return err;
+	}
+	
+// ---------------------------------------------------------
+// CAudioMessageRecorder::ResetAudioInputL
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::ResetAudioInputL(  )
+	{ 
+    if( iAudioInput )
+        {
+AMSLOGGER_WRITE( "CAudioMessageRecorder::ResetAudioInput, iAudioInput EXISTS" );        
+        RArray<CAudioInput::TAudioInputPreference> inputArray(4);
+        CleanupClosePushL( inputArray );
+        inputArray.Append( CAudioInput::EDefaultMic );
+        iAudioInput->SetAudioInputL( inputArray.Array() );   
+        CleanupStack::PopAndDestroy( &inputArray );
+        }
+#ifdef _DEBUG	
+    else
+        {
+AMSLOGGER_WRITE( "CAudioMessageRecorder::ResetAudioInput, iAudioInput == NULL!" );
+        }
+#endif
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::GetCurrentVolume
+// ---------------------------------------------------------
+//
+TInt CAudioMessageRecorder::GetCurrentVolume()
+	{
+	TInt current;
+	iRecUtility->GetVolume( current );
+	TInt stepsize = iRecUtility->MaxVolume() / KAmsVolumeSteps;
+	return ( current / stepsize );	
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::GetBitRateL
+// ---------------------------------------------------------
+//
+TUint CAudioMessageRecorder::GetBitRateL()
+	{
+	if( iErrorCode != KErrNone )
+	    {
+AMSLOGGER_WRITEF( _L( "CAudioMessageRecorder::GetBitRateL(): Leave ( %d ) occured." ), iErrorCode );
+	    User::Leave( iErrorCode);
+	    return 0;
+	    }	
+	return iRecUtility->DestinationBitRateL();
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::IncrementVol
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::IncrementVol()
+    {
+    TInt maxVolume ( iRecUtility->MaxVolume() );
+    TInt currentVolume ( 0 );
+    iRecUtility->GetVolume( currentVolume );
+    TInt volumeValue = currentVolume + (maxVolume /KAmsVolumeSteps);
+    
+    if ( volumeValue >= maxVolume )
+        iRecUtility->SetVolume( maxVolume );
+    else
+        iRecUtility->SetVolume( volumeValue );
+    
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageRecorder::DecrementVol
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::DecrementVol()
+    {
+    TInt maxVolume ( iRecUtility->MaxVolume() );
+    TInt currentVolume ( 0 );
+    iRecUtility->GetVolume( currentVolume );
+    TInt volumeValue = currentVolume - (maxVolume/KAmsVolumeSteps);
+    
+    if ( volumeValue <= 0 )
+        iRecUtility->SetVolume( 0 );
+    else
+        iRecUtility->SetVolume( volumeValue );
+    }
+    
+// ---------------------------------------------------------
+// CAudioMessageRecorder::InitializeAudioRoutingL
+// ---------------------------------------------------------
+//
+void CAudioMessageRecorder::InitializeAudioRoutingL()
+	{
+	if ( iSupportAudioOutput )
+		{
+		if ( !iAudioOutput )
+			{
+		    TRAPD( err, iAudioOutput = CAudioOutput::NewL( *iRecUtility, EFalse ) );
+			if (err == KErrNone)
+				{
+				iAudioOutput->SetSecureOutputL( EFalse );//DRM
+				}
+			}
+		}
+	}
+