mpxplugins/viewplugins/views/equalizerview/src/mpxequalizerhelper.cpp
changeset 0 ff3acec5bc43
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpxplugins/viewplugins/views/equalizerview/src/mpxequalizerhelper.cpp	Thu Dec 17 08:45:05 2009 +0200
@@ -0,0 +1,550 @@
+/*
+* Copyright (c) 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:  Helper class for managing equalizer utility instances.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <AudioEqualizerUtility.h>
+#include <mdaaudiosampleplayer.h>
+#include <centralrepository.h>
+#include <textresolver.h>
+#include <aknnotewrappers.h>
+#include <akntoolbar.h>
+#include <layoutmetadata.cdl.h>
+#include <mpxplaybackutility.h>
+#include <mpxplaybackmessage.h>
+#include <mpxprivatecrkeys.h>
+#include <mpxmessagegeneraldefs.h>
+#include <mpxuser.h>
+#include "mpxequalizerhelper.h"
+#include "mpxlog.h"
+#include <aknclearer.h>
+
+
+// CONSTANTS
+// Null file path
+_LIT( KMPXNullSoundPath, "\\system\\data\\nullsound.mp3" );
+const TInt KEqualizerID = 0x101FFC76;
+// Music setting
+const TUid KCRUidMPXMPSettings = {0x101FFCDC};
+const TUint32 KMPXMPEqPresetId = 0x00000001;
+
+const TUid KCRUidOldMPSettings = {0x101F880C};
+const TUint32 KOldMPEqPresetId = 0x00000009;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------
+//
+CMPXEqualizerHelper::CMPXEqualizerHelper()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::ConstructL()
+    {
+    // Get the playback utility instance from engine.
+    iPlaybackUtility = MMPXPlaybackUtility::UtilityL( KPbModeDefault );
+    iPlaybackUtility->AddObserverL( *this );
+    iWait = new( ELeave )CActiveSchedulerWait;
+    InitializeBackupEqualizerUtilityL();
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CMPXEqualizerHelper* CMPXEqualizerHelper::NewL()
+    {
+    CMPXEqualizerHelper* self =
+        new ( ELeave ) CMPXEqualizerHelper();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMPXEqualizerHelper::~CMPXEqualizerHelper()
+    {
+    delete iAudioEqualizerUtility;
+    delete iBackupEqualizerUtility;
+    iEqualizerUtility = NULL;
+    iEqDialog = NULL;
+
+    if ( iPlayUtility )
+        {
+        if ( iPlaybackUtility )
+            {
+            TRAP_IGNORE( iPlaybackUtility->RemoveObserverL( *this ) );
+            }
+        iPlayUtility->Close();
+        }
+    delete iPlayUtility;
+
+    if ( iPlaybackUtility )
+        {
+        iPlaybackUtility->Close();
+        }
+   	delete iWait;
+    iWait = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// Initialize audio equalizer utility for current active playing track.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::InitializeEqualizerUtilityL()
+    {
+    MPX_FUNC( "CMPXEqualizerHelper::InitializeEqualizerUtilityL" );
+
+    ReleaseEqualizerUtility();
+
+    //CCustomCommandUtility* customCmdUtility =
+    //    CMPXPlaybackCCustomCommandUtility::NewCustomCommandUtilityL(
+    //        *iPlaybackUtility );
+    //CleanupStack::PushL( customCmdUtility );
+
+    //iAudioEqualizerUtility =
+    //    CAudioEqualizerUtility::NewL( customCmdUtility );
+    //MPX_DEBUG2( "--> CAudioEqualizerUtility created ok (0x%08x)",
+    //    iAudioEqualizerUtility );
+
+    //CleanupStack::Pop( customCmdUtility );  // ownership is transferred
+
+    SetupActiveEqualizerUtility();
+
+    TInt ignore( KEqualizerPresetNone );
+    TInt index = GetPresetId( ignore );
+    if ( KErrNotFound != index )
+        {
+        iEqualizerUtility->ApplyPresetL( index );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Release audio equalizer utility.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::ReleaseEqualizerUtility()
+    {
+    MPX_FUNC( "CMPXEqualizerHelper::ReleaseEqualizerUtility" );
+
+    if ( iEqDialog )
+        {
+        // Recreate Backup Equalizer Utility to make sure it can get the
+        // latest presets.
+        if ( !iBackupEqualizerUtility )
+            {
+            CreateBackupEqualizerUtility();
+            }
+
+        MPX_DEBUG2( "--> iEqDialog->SetAudioEqualizerL(0x%08x)",
+            iBackupEqualizerUtility );
+
+        TRAP_IGNORE(
+            iEqDialog->SetAudioEqualizerL( iBackupEqualizerUtility ) );
+        }
+
+    iEqualizerUtility = iBackupEqualizerUtility;
+
+    if ( iAudioEqualizerUtility )
+        {
+        delete iAudioEqualizerUtility;
+        iAudioEqualizerUtility = NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Get current preset ID.
+// ---------------------------------------------------------------------------
+//
+TInt CMPXEqualizerHelper::GetPresetId( TInt& aPresetId )
+    {
+    MPX_FUNC( "CMPXEqualizerHelper::GetPresetId" );
+
+    // Get preset id from cenrep
+    TInt presetId( KEqualizerPresetNone );
+    TRAP_IGNORE(
+        {
+        CRepository* repository = CRepository::NewL( KCRUidMPXMPSettings );
+        repository->Get( KMPXMPEqPresetId, presetId );
+        delete repository;
+        repository = NULL;
+        } );
+
+    TInt index( KErrNotFound );
+    if ( iEqualizerUtility && presetId != KEqualizerPresetNone )
+        {
+        TArray<TEfAudioEqualizerUtilityPreset> presetArray =
+            iEqualizerUtility->Presets();
+
+        TBool found( EFalse );
+        for ( TInt i = 0; i < presetArray.Count() && found == EFalse; i++ )
+            {
+            if ( presetArray[i].iPresetNameKey ==
+                static_cast<TUint32>( presetId ) )
+                {
+                found = ETrue;
+                index = i;
+                aPresetId = presetId;
+                }
+            }
+        }
+    else
+        {
+        aPresetId = KEqualizerPresetNone;
+        }
+
+    MPX_DEBUG2( "--> Preset id get: %d", presetId );
+    return index;
+    }
+
+// ---------------------------------------------------------------------------
+// Initialize secondary audio equalizer utility for situations when the
+// engine cannot provide one.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::InitializeBackupEqualizerUtilityL()
+    {
+    MPX_FUNC( "CMPXEqualizerHelper::InitializeBackupEqualizerUtilityL()" );
+
+    if ( iOpenInProgress )
+        {
+        // OpenFileL already called
+        return;
+        }
+
+    if ( !iPlayUtility )
+        {
+        iPlayUtility = CMdaAudioPlayerUtility::NewL(
+            *this,
+            EMdaPriorityMin,
+            EMdaPriorityPreferenceNone );
+        }
+
+    TFileName nullSoundPath( KMPXNullSoundPath );
+    User::LeaveIfError( MPXUser::CompleteWithDllPath( nullSoundPath ) );
+    iPlayUtility->OpenFileL( nullSoundPath );
+    iOpenInProgress = ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// Create secondary audio equalizer utility based on latest preset settings.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::CreateBackupEqualizerUtility()
+    {
+    if ( iPlayUtility )
+        {
+        delete iBackupEqualizerUtility;
+        iBackupEqualizerUtility = NULL;
+        TRAP_IGNORE( iBackupEqualizerUtility =
+            CAudioEqualizerUtility::NewL( *iPlayUtility ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Setup active equalizer utility for equalizer dialog.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::SetupActiveEqualizerUtility()
+    {
+    CAudioEqualizerUtility* oldUtility( iEqualizerUtility );
+
+    // Try to use the real equalizer utility first
+    if ( !iAudioEqualizerUtility && iBackupEqualizerUtility )
+        {
+        iEqualizerUtility = iBackupEqualizerUtility;
+        }
+    else
+        {
+        iEqualizerUtility = iAudioEqualizerUtility;
+        }
+
+    if ( iEqDialog && oldUtility != iEqualizerUtility )
+        {
+        MPX_DEBUG2( "--> iEqDialog->SetAudioEqualizerL(0x%08x)", iEqualizerUtility );
+        TRAP_IGNORE( iEqDialog->SetAudioEqualizerL( iEqualizerUtility ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Launch equalizer dialog.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::DoLaunchEqualizerDialogL()
+    {
+    MPX_FUNC( "CMPXEqualizerHelper::DoLaunchEqualizerDialogL()" );
+
+    __ASSERT_DEBUG(
+        iEqualizerUtility,
+        User::Panic( _L( "CMPXEqualizerHelper" ), KErrArgument ) );
+
+    TInt presetId( KEqualizerPresetNone );
+    GetPresetId( presetId );
+
+    CEqualizerPresetsDialog* dlg = CEqualizerPresetsDialog::NewL(
+        iEqualizerUtility, presetId, *this );
+    iEqDialog = dlg;
+    
+    CAknToolbar* toolbar =
+        static_cast< CAknAppUi* >(CEikonEnv::Static()->AppUi())->CurrentFixedToolbar();
+                     
+    TBool wasToolbarVisible = toolbar->IsVisible();            
+
+    if ( toolbar ) 
+        {
+        toolbar->HideItemsAndDrawOnlyBackground( ETrue );
+        }       
+
+    MPX_TRAPD( err, dlg->ExecuteLD() );
+    iEqDialog = NULL;
+
+    if ( toolbar && wasToolbarVisible ) 
+        {
+        toolbar->HideItemsAndDrawOnlyBackground( EFalse );
+        }
+
+    if ( err )
+        {
+        MPX_DEBUG2( "--> dlg->ExecuteLD() left with %d", err );
+        User::Leave( err );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Handle playback message.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::DoHandlePlaybackMessageL(
+    const CMPXMessage& aMessage )
+    {
+    MPX_FUNC( "CMPXEqualizerHelper::DoHandlePlaybackMessageL" );
+    TMPXMessageId id( aMessage.ValueTObjectL<TMPXMessageId>( KMPXMessageGeneralId ) );
+    if ( KMPXMessageGeneral == id )
+        {
+        switch ( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralEvent ) )
+            {
+            case TMPXPlaybackMessage::EStateChanged:
+                {
+                TMPXPlaybackState state(
+                    static_cast<TMPXPlaybackState>(
+                        aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ) ) );
+                DoHandleStateChangedL( state );
+                break;
+                }
+            default:
+                {
+                // pass
+                break;
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Handle playback state changed.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::DoHandleStateChangedL(
+    TMPXPlaybackState aState )
+    {
+    switch ( aState )
+        {
+        case EPbStateNotInitialised:
+        case EPbStateStopped:
+        case EPbStatePaused:
+        case EPbStateShuttingDown:
+            {
+            // Need to release Equalizer utility when audio is stopped.
+            // It's because of the limitation in adaptation layer.
+            ReleaseEqualizerUtility();
+            break;
+            }
+        case EPbStatePlaying:
+            {
+            // Need to initialize Equalizer utility when audio is started
+            // playing. It's because of the limitation in adaptation layer.
+            InitializeEqualizerUtilityL();
+            break;
+            }
+        default:
+            {
+            // pass
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From CMPXEqualizerView
+// Launch equalizer dialog.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::LaunchEqualizerL()
+    {
+    MPX_FUNC( "CMPXEqualizerHelper::LaunchEqualizerL" );
+
+    if ( iLaunchEqualizerOnOpenComplete )
+        {
+        // Waiting for open complete callback, cannot do anything now
+        return;
+        }
+
+    if ( !iPlayUtility || !iBackupEqualizerUtility )
+        {
+        // Backup equalizer does not exist, must initialize first
+        iLaunchEqualizerOnOpenComplete = ETrue;
+        InitializeBackupEqualizerUtilityL();
+        if( iWait )
+        	{
+        	iWait->Start();
+        	}
+        }
+    else
+        {
+        // Recreate Backup Equalizer Utility to make sure it can get the
+        // latest presets.
+        CreateBackupEqualizerUtility();
+
+        // Setup active equalizer utility and launch the dialog
+        SetupActiveEqualizerUtility();
+        DoLaunchEqualizerDialogL();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackObserver
+// Handle playback message.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::HandlePlaybackMessage(
+    CMPXMessage* aMessage, TInt aError )
+    {
+    if ( aError == KErrNone && aMessage )
+        {
+        TRAP_IGNORE( DoHandlePlaybackMessageL( *aMessage ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MEqualizerPresetActivationObserver
+// Handle preset id activation from Equalizer dialog.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::HandlePresetActivation(
+    TInt aActivatedPreset )
+    {
+    MPX_DEBUG2("CMPXEqualizerHelper::HandlePresetActivation %i", aActivatedPreset);
+    MPX_FUNC( "CMPXEqualizerHelper::HandlePresetActivation" );
+
+    // Store in CenRep file
+    TRAP_IGNORE(
+        {
+        CRepository* repository = CRepository::NewL( KCRUidMPXMPSettings );
+        TInt err = repository->Set( KMPXMPEqPresetId, aActivatedPreset );
+        delete repository;
+        repository = NULL;
+
+        repository = CRepository::NewL( KCRUidOldMPSettings );
+        err = repository->Set( KOldMPEqPresetId, aActivatedPreset );
+        delete repository;
+        repository = NULL;
+
+        } );
+
+    // Notify playback framework of the change.
+    //
+    TRAP_IGNORE( iPlaybackUtility->CommandL( EPbApplyEffect, KEqualizerID ) );
+    }
+
+// ---------------------------------------------------------------------------
+// From MMdaAudioPlayerCallback
+// Callback when an attempt to open and initialise an audio sample
+// has completed.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::MapcInitComplete(
+    TInt aError,
+    const TTimeIntervalMicroSeconds& /* aDuration */ )
+    {
+    MPX_DEBUG3( "CMPXEqualizerHelper::MapcInitComplete(%d) -- iLaunchEqualizerOnOpenComplete=%d", aError, iLaunchEqualizerOnOpenComplete );
+
+    iOpenInProgress = EFalse;
+    if ( !aError )
+        {
+        // Recreate Backup Equalizer Utility to make sure it can get the
+        // latest presets.
+        CreateBackupEqualizerUtility();
+
+        if ( iBackupEqualizerUtility )
+            {
+            MPX_DEBUG2( "--> iBackupEqualizerUtility=0x%08x, NewL ok", iBackupEqualizerUtility );
+
+            // Setup active equalizer utility
+            SetupActiveEqualizerUtility();
+
+            if ( iLaunchEqualizerOnOpenComplete )
+                {
+                TRAP_IGNORE( DoLaunchEqualizerDialogL() );
+                }
+            }
+        }
+    else
+        {
+        TRAP_IGNORE(
+            {
+            // TextResolver instance for error resolving.
+            CTextResolver* textresolver = CTextResolver::NewLC();
+            // Resolve the error text
+            const TDesC& text =
+                textresolver->ResolveErrorString( aError );
+
+            CAknErrorNote* dlg = new ( ELeave ) CAknErrorNote( ETrue );
+            dlg->ExecuteLD( text );
+            CleanupStack::PopAndDestroy( textresolver );
+            } );
+        }
+    iLaunchEqualizerOnOpenComplete = EFalse;
+    if( iWait && iWait->IsStarted() )
+		{
+    	iWait->AsyncStop();
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// From MMdaAudioPlayerCallback
+// Callback when an attempt to playback an audio sample has completed.
+// ---------------------------------------------------------------------------
+//
+void CMPXEqualizerHelper::MapcPlayComplete(
+    TInt /* aError */ )
+    {
+    // Do nothing
+    }
+
+//  End of File