--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/audioplayer/camaudioplayerwrapper.cpp Thu Jan 07 16:18:56 2010 +0200
@@ -0,0 +1,403 @@
+/*
+* Copyright (c) 2007 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: Implementation of Wrapper for Audio Player Utility
+*
+*/
+
+
+// ===========================================================================
+// includes
+#include <mdaaudiosampleplayer.h>
+#include <AudioPreference.h>
+
+#include "Cam.hrh"
+#include "CamPanic.h"
+#include "camlogging.h"
+#include "CamUtility.h" // for resource id's of sounds
+#include "mcamplayerobserver.h"
+#include "camaudioplayerwrapper.h"
+#include "CamPerformance.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "camaudioplayerwrapperTraces.h"
+#endif
+
+
+
+// ===========================================================================
+// Constants
+
+// Migrated directly from old sound player.
+#ifndef __WINSCW__
+ static const TUint KAudioPriority = KAudioPriorityCameraTone;
+#else
+ static const TUint KAudioPriority = KAudioPriorityVideoRecording;
+#endif // __WINSCW__
+
+
+// ===========================================================================
+// public constructors and destructor
+
+// ---------------------------------------------------------------------------
+// NewL <<static>>
+// ---------------------------------------------------------------------------
+//
+CCamAudioPlayerWrapper*
+CCamAudioPlayerWrapper::NewL( MCamPlayerObserver& aObserver,
+ TInt aSoundId )
+ {
+ PRINT( _L("Camera => CCamAudioPlayerWrapper::NewL()") );
+ CCamAudioPlayerWrapper* self =
+ new (ELeave) CCamAudioPlayerWrapper( aObserver, aSoundId );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ PRINT( _L("Camera <= CCamAudioPlayerWrapper::NewL()") );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// destructor <<virtual>>
+// ---------------------------------------------------------------------------
+//
+CCamAudioPlayerWrapper::~CCamAudioPlayerWrapper()
+ {
+ if( iPlayer )
+ {
+ iPlayer->Stop();
+ iPlayer->Close();
+ delete iPlayer;
+ iPlayer = NULL;
+ }
+ }
+
+
+
+// ===========================================================================
+// from CCamPlayerWrapperBase
+
+// ---------------------------------------------------------------------------
+// Id <<virtual>><<const>>
+// ---------------------------------------------------------------------------
+//
+TInt
+CCamAudioPlayerWrapper::Id() const
+ {
+ return iSoundId;
+ }
+
+// ---------------------------------------------------------------------------
+// IsEqualSound <<virtual>><<const>>
+//
+// Compare if two sounds are equal.
+// If the ids or filenames match, the sounds are considered to be equal.
+// ---------------------------------------------------------------------------
+//
+TBool
+CCamAudioPlayerWrapper::IsEqualSound( TInt aSoundId ) const
+ {
+ TInt eq( EFalse );
+ TRAP_IGNORE(
+ {
+ eq = aSoundId == iSoundId
+ || MapSoundId2FilenameL( aSoundId ) == MapSoundId2FilenameL( iSoundId );
+ });
+ return eq;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Play <<virtual>>
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerWrapper::Play( TBool aCallback )
+ {
+ PRINT2( _L("Camera => CCamAudioPlayerWrapper::Play, callback:%d iState[%s]"),
+ aCallback,
+ KCamAudioPlayerWrapperStateNames[iState] );
+
+ switch( iState )
+ {
+ case CCamAudioPlayerWrapper::EReady:
+ iPlayRequested = EFalse;
+ iState = CCamAudioPlayerWrapper::EPlaying;
+ iCallback = aCallback;
+ iPlayer->Play();
+ break;
+
+ case CCamAudioPlayerWrapper::EInitializing:
+ iPlayRequested = ETrue;
+ iCallback = aCallback;
+ break;
+
+ case CCamAudioPlayerWrapper::ECorrupt:
+ // Notify observer rigth away as init has failed.
+ iCallback = aCallback;
+ NotifyPlayComplete( KErrCorrupt );
+ break;
+
+ case CCamAudioPlayerWrapper::EPlaying:
+ PRINT( _L("Camera <> WARNING: Still playing old sound, need to stop early") );
+ iPlayer->Stop();
+ // Notify observer that playing was interrupted (if callback was requested for previous play).
+ // Sets state to idle so that we are ready to play again.
+ NotifyPlayComplete( KErrAbort );
+ // Now we can repeat the call as the state is right.
+ Play( aCallback );
+ break;
+ case CCamAudioPlayerWrapper::EIdle:
+ default:
+ //Set state and ignore otherwise...
+ PRINT( _L("Camera <> CCamAudioPlayerWrapper::Play invalid state") );
+ iState = CCamAudioPlayerWrapper::ECorrupt;
+ break;
+ }
+
+ PRINT( _L("Camera <= CCamAudioPlayerWrapper::Play") );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CancelPlay <<virtual>>
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerWrapper::CancelPlay()
+ {
+ PRINT1( _L("Camera => CCamAudioPlayerWrapper::CancelPlay, id:%d"), iSoundId );
+ switch( iState )
+ {
+ case CCamAudioPlayerWrapper::EPlaying:
+ PRINT( _L("Camera <> CCamAudioPlayerWrapper::CancelPlay .. iState == EPlaying, call Stop()..") );
+ iPlayer->Stop();
+ NotifyPlayComplete( KErrAbort );
+ break;
+ default:
+ break;
+ }
+
+ // Make sure pending Play() is cancelled.
+ iPlayRequested = EFalse;
+ PRINT( _L("Camera <= CCamAudioPlayerWrapper::CancelPlay") );
+ }
+
+
+// ===========================================================================
+// from MMdaAudioPlayerCallback
+
+// ---------------------------------------------------------------------------
+// MapcInitComplete <<virtual>>
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerWrapper
+::MapcInitComplete( TInt aStatus,
+ const TTimeIntervalMicroSeconds& /*aDuration*/ )
+ {
+ PRINT2( _L("Camera => CCamAudioPlayerWrapper::MapcInitComplete, id:%d status:%d"), iSoundId, aStatus );
+ if( KErrNone != aStatus )
+ {
+ // If we encounter an error in init phase,
+ // we'll notify observer once Play gets called.
+ iState = CCamAudioPlayerWrapper::ECorrupt;
+ }
+ else
+ {
+ iState = CCamAudioPlayerWrapper::EReady;
+ }
+
+ // If play has been called before init has finished
+ // try to play now. If we had an error in init,
+ // Play() will handle this based on iState.
+ if( iPlayRequested )
+ {
+ Play( iCallback );
+ }
+ PRINT( _L("Camera <= CCamAudioPlayerWrapper::MapcInitComplete") );
+ }
+
+// ---------------------------------------------------------------------------
+// MapcPlayComplete <<virtual>>
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerWrapper::MapcPlayComplete( TInt aStatus )
+ {
+ NotifyPlayComplete( aStatus );
+ }
+
+
+
+
+// ===========================================================================
+// other public
+
+// ---------------------------------------------------------------------------
+// MapSoundId2FilenameL <<static>>
+// ---------------------------------------------------------------------------
+//
+TPtrC
+CCamAudioPlayerWrapper::MapSoundId2FilenameL( TInt aSoundId )
+ {
+ PRINT1( _L("Camera => CCamAudioPlayerWrapper::MapSoundId2FilenameL, id:%d"), aSoundId );
+
+ TPtrC filename( KNullDesC );
+
+ switch( aSoundId )
+ {
+ case ECamVideoStartSoundId: filename.Set( KCamVideoStartTone ); break;
+ case ECamVideoStopSoundId: filename.Set( KCamVideoStopTone ); break;
+ case ECamVideoPauseSoundId: filename.Set( KCamVideoPauseTone ); break;
+ case ECamVideoResumeSoundId: filename.Set( KCamVideoStartTone ); break;
+ case ECamAutoFocusFailed: User::Leave( KErrNotSupported ); break;
+ case ECamAutoFocusComplete: filename.Set( KCamAutoFocusComplete ); break;
+ case ECamStillCaptureSoundId1: filename.Set( KCamCaptureTone1 ); break;
+ case ECamStillCaptureSoundId2: filename.Set( KCamCaptureTone2 ); break;
+ case ECamStillCaptureSoundId3: filename.Set( KCamCaptureTone3 ); break;
+ case ECamStillCaptureSoundId4: filename.Set( KCamCaptureTone4 ); break;
+ case ECamBurstCaptureSoundId1: filename.Set( KCamBurstCaptureTone1 ); break;
+ case ECamBurstCaptureSoundId2: filename.Set( KCamBurstCaptureTone2 ); break;
+ case ECamBurstCaptureSoundId3: filename.Set( KCamBurstCaptureTone3 ); break;
+ case ECamBurstCaptureSoundId4: filename.Set( KCamBurstCaptureTone4 ); break;
+
+ case ECamSelfTimerSoundId: User::Leave( KErrNotSupported ); break;
+ case ECamInCallToneId: User::Leave( KErrNotSupported ); break;
+
+ default:
+ __ASSERT_DEBUG( EFalse, CamPanic( ECamPanicNotSupported ) );
+ break;
+ }
+
+ PRINT1( _L("Camera <= CCamAudioPlayerWrapper::MapSoundId2FilenameL, return [%S]"), &filename );
+ return filename;
+ }
+
+
+
+// ===========================================================================
+// other private
+
+// ---------------------------------------------------------------------------
+// InitL
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerWrapper::InitL()
+ {
+ PRINT( _L("Camera => CCamAudioPlayerWrapper::InitL") );
+ if( CCamAudioPlayerWrapper::EIdle == iState )
+ {
+ iState = CCamAudioPlayerWrapper::EInitializing;
+ // Our process uses multiple players. Ensure they
+ // (or their internal controllers) share the same
+ // heap so we don't run out of memory chunks.
+ iPlayer->UseSharedHeap();
+ iPlayer->OpenFileL( MapSoundId2FilenameL( iSoundId ) );
+ }
+ else
+ {
+ CamPanic( ECamPanicInvalidState );
+ PRINT( _L("Camera <> CCamAudioPlayerWrapper::InitL invalid state") );
+ iState = CCamAudioPlayerWrapper::ECorrupt;
+ User::Leave(KErrCorrupt);
+ }
+ PRINT( _L("Camera <= CCamAudioPlayerWrapper::InitL") );
+ }
+
+
+// ---------------------------------------------------------------------------
+// NotifyPlayComplete
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerWrapper::NotifyPlayComplete( TInt aStatus )
+ {
+ PRINT1( _L("Camera => CCamAudioPlayerWrapper::NotifyPlayComplete, status:%d"), aStatus );
+ switch( iState )
+ {
+ // Problem initializing.
+ // Init is not tried again as it could slow down the capturing.
+ case CCamAudioPlayerWrapper::ECorrupt:
+ break;
+
+ // Normal case where the playing has completed.
+ // Set state to EReady to indicate we are ready
+ // for new play request.
+ case CCamAudioPlayerWrapper::EPlaying:
+ iState = CCamAudioPlayerWrapper::EReady;
+ break;
+
+ // Other states not allowed here.
+ default:
+ // Make this player ready that we can play new sound.
+ PRINT( _L("Camera <> CCamAudioPlayerWrapper::NotifyPlayComplete invalid state") );
+ iState = CCamAudioPlayerWrapper::EReady;
+ break;
+ }
+
+ // Clear flag just in case.
+ iPlayRequested = EFalse;
+
+ OstTrace0( CAMERAAPP_PERFORMANCE, CCAMAUDIOPLAYERWRAPPER_NOTIFYPLAYCOMPLETE, "e_CAM_APP_CAPTURE_SOUND_PLAY 0" ); //CCORAPP_CAPTURE_SOUND_PLAY_END
+
+ // Notify observer with our sound id and received status.
+ if( iCallback )
+ iObserver.PlayComplete( aStatus, iSoundId );
+
+ PRINT( _L("Camera <= CCamAudioPlayerWrapper::NotifyPlayComplete") );
+ }
+
+// ===========================================================================
+// private constructors
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void
+CCamAudioPlayerWrapper::ConstructL()
+ {
+ PRINT( _L("Camera => CCamAudioPlayerWrapper::ConstructL()") );
+ iPlayer = CMdaAudioPlayerUtility::NewL(
+ *this,
+ KAudioPriority ,
+ TMdaPriorityPreference( KAudioPrefCamera ) );
+
+ InitL();
+ PRINT( _L("Camera <= CCamAudioPlayerWrapper::ConstructL()") );
+ }
+
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CCamAudioPlayerWrapper
+::CCamAudioPlayerWrapper( MCamPlayerObserver& aObserver,
+ TInt aSoundId )
+ : iObserver ( aObserver ),
+ iSoundId ( aSoundId ),
+ iPlayer ( NULL ),
+ iState ( CCamAudioPlayerWrapper::EIdle ),
+ iPlayRequested( EFalse ),
+ iCallback ( EFalse )
+ {
+ }
+
+// ===========================================================================
+// end of file
+