camerauis/cameraapp/generic/src/audioplayer/camaudioplayerwrapper.cpp
branchRCL_3
changeset 54 bac7acad7cb3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/audioplayer/camaudioplayerwrapper.cpp	Wed Sep 01 12:30:54 2010 +0100
@@ -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
+const TReal32 KCamSoundVol = 0.75f; 
+// 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->SetVolume( static_cast<TInt>( iPlayer->MaxVolume()* KCamSoundVol ) );
+      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:     filename.Set( KCamSelfTimerTone );      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
+