diff -r ebe688cedc25 -r 7fdbb852d323 mobilemessaging/audiomsg/src/audiomessagerecorder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/audiomsg/src/audiomessagerecorder.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,475 @@ +/* +* 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 +#include +#include +#include +#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 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 ) ); + } + } + } +