--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/musichomescreen_multiview/mcpmusicplayer/src/aiplayerpluginengine.cpp Thu Dec 17 08:45:05 2009 +0200
@@ -0,0 +1,544 @@
+/*
+* 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: Music Player stautus observer
+*
+*/
+
+
+#include <mpxplaybackutility.h>
+#include <mpxplaybackmessage.h>
+#include <mpxmedia.h>
+#include <mpxmediageneraldefs.h>
+#include <mpxmediamusicdefs.h>
+#include <mpxmessagegeneraldefs.h>
+#include <mpxplaybackmessagedefs.h>
+#include <mpxalbumartutil.h>
+#include <mpxlog.h>
+
+#include "aiplayerpluginengine.h"
+
+const TInt KMPXOneSecInMilliSecs( 1000 );
+const TUid KMusicPlayerAppUid = { 0x102072C3 };
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CAiPlayerPluginEngine::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::ConstructL()
+ {
+ MPX_DEBUG1("CAiPlayerPluginEngine::ConstructL");
+ // Get the playback utility instance from engine.
+ //iPlaybackUtility = MMPXPlaybackUtility::NewL( KPbModeActivePlayer, this );
+ iPlaybackUtility = MMPXPlaybackUtility::NewL( KMusicPlayerAppUid, this );
+ iAlbumArtUtil = CMPXAlbumArtUtil::NewL();
+ if (iPlaybackUtility->StateL() == EPbStatePlaying)
+ {
+ RequestMediaL();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CAiPlayerPluginEngine::NewL
+// ---------------------------------------------------------------------------
+//
+CAiPlayerPluginEngine* CAiPlayerPluginEngine::NewL(
+ MAiPlayerPluginEngineObserver& aObserver )
+ {
+ MPX_DEBUG1("CAiPlayerPluginEngine::NewL");
+ CAiPlayerPluginEngine* self = new ( ELeave )
+ CAiPlayerPluginEngine( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CAiPlayerPluginEngine::CAiPlayerPluginEngine
+// ---------------------------------------------------------------------------
+//
+CAiPlayerPluginEngine::CAiPlayerPluginEngine(
+ MAiPlayerPluginEngineObserver& aObserver )
+ : iObserver( &aObserver ),
+ iPlaybackUtility( NULL ),
+ iTitle( NULL ),
+ iArtist( NULL ),
+ iUri( NULL ),
+ iMedia( NULL ),
+ iPosition( KErrNotFound ),
+ iDuration( KErrNotFound ),
+ iExtractingAlbumArt( EFalse ),
+ iSkipping( EFalse )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CAiPlayerPluginEngine::~CAiPlayerPluginEngine
+// ---------------------------------------------------------------------------
+//
+CAiPlayerPluginEngine::~CAiPlayerPluginEngine()
+ {
+ MPX_DEBUG1("CAiPlayerPluginEngine::~CAiPlayerPluginEngine");
+ if ( iPlaybackUtility )
+ {
+ iPlaybackUtility->Close();
+ }
+ delete iMedia;
+ delete iAlbumArtUtil;
+ delete iTitle;
+ delete iArtist;
+ delete iUri;
+
+ }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackObserver
+// Handle playback message.
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::HandlePlaybackMessage( CMPXMessage* aMessage,
+ TInt aError )
+ {
+ if ( aError == KErrNone && aMessage )
+ {
+ TRAP_IGNORE( DoHandlePlaybackMessageL( *aMessage ) );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackCallback
+// Handle playback property.
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::HandlePropertyL( TMPXPlaybackProperty aProperty,
+ TInt aValue, TInt aError )
+ {
+ DoHandlePropertyL( aProperty, aValue, aError );
+ }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackCallback
+// Method is called continously until aComplete=ETrue, signifying that
+// it is done and there will be no more callbacks
+// Only new items are passed each time
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::HandleSubPlayerNamesL(
+ TUid /* aPlayer */,
+ const MDesCArray* /* aSubPlayers */,
+ TBool /* aComplete */,
+ TInt /* aError */ )
+ {
+ // do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackCallback
+// Handle media
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::HandleMediaL( const CMPXMedia& aMedia,
+ TInt aError )
+ {
+ MPX_DEBUG1("CAiPlayerPluginEngine::HandleMediaL");
+ if ( KErrNone == aError )
+ {
+ delete iUri;
+ iUri = NULL;
+ if (aMedia.IsSupported(KMPXMediaGeneralUri))
+ {
+ TParsePtrC filePath(aMedia.ValueText(KMPXMediaGeneralUri) );
+ iUri = filePath.FullName().AllocL();
+ }
+
+ delete iTitle;
+ iTitle = NULL;
+ if ( aMedia.IsSupported( KMPXMediaGeneralTitle ) )
+ {
+ iTitle = ( aMedia.ValueText( KMPXMediaGeneralTitle ) ).AllocL();
+ }
+ else if ( aMedia.IsSupported( KMPXMediaGeneralUri ) )
+ {
+ TParsePtrC filePath( aMedia.ValueText( KMPXMediaGeneralUri ) );
+ iTitle = (filePath.Name()).AllocL();
+ }
+ delete iArtist;
+ iArtist = NULL;
+ iArtist = ( aMedia.ValueText( KMPXMediaMusicArtist ) ).AllocL();
+
+ iObserver->TrackInfoChanged( *iTitle, *iArtist );
+
+ if (!iSkipping)
+ {
+ if (iExtractingAlbumArt)
+ {
+ iAlbumArtUtil->CancelRequest();
+ iExtractingAlbumArt=EFalse;
+ }
+
+ if ( aMedia.IsSupported( KMPXMediaMusicAlbumArtFileName ) )
+ {
+ delete iMedia;
+ iMedia=NULL;
+ iMedia = CMPXMedia::NewL( aMedia );
+ TRAPD(err,iAlbumArtUtil->ExtractAlbumArtL(
+ *iMedia,
+ *this,
+ TSize(70,70)));
+
+ if (err != KErrNone)
+ {
+ iObserver->AlbumArtChanged(NULL);
+ }
+ }
+ else
+ {
+ iObserver->AlbumArtChanged(NULL);
+ }
+
+ }
+ else
+ {
+ iObserver->AlbumArtChanged(NULL);
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// From MMPXPlaybackCallback
+// Handle completion of a asynchronous command
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::HandlePlaybackCommandComplete(
+ CMPXCommand* /*aCommandResult*/, TInt /*aError*/ )
+ {
+ // do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// From MMPXAlbumArtUtilObserver
+// Notify that extraction of album art started.
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::ExtractAlbumArtStarted()
+ {
+ iExtractingAlbumArt = ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// From MMPXAlbumArtUtilObserver
+// Notify that the extraction of album art has completed.
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::ExtractAlbumArtCompleted(
+ CFbsBitmap* aBitmap,
+ TInt aErr )
+ {
+ if (aErr == KErrNone)
+ {
+ iObserver->AlbumArtChanged(aBitmap);
+ }
+ else
+ {
+ iObserver->AlbumArtChanged(NULL);
+ }
+ iExtractingAlbumArt = EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// Get the current state of the active player
+// ---------------------------------------------------------------------------
+//
+TMPlayerState CAiPlayerPluginEngine::PlayerState()
+ {
+ MPX_DEBUG1( "CAiPlayerPluginEngine::PlayerState" );
+ TMPXPlaybackState state( EPbStateNotInitialised );
+ TRAP_IGNORE( state = iPlaybackUtility->StateL() );
+ return MapState( state );
+ }
+
+// ---------------------------------------------------------------------------
+// CAiPlayerPluginEngine::TitleL
+// ---------------------------------------------------------------------------
+//
+const TDesC& CAiPlayerPluginEngine::TitleL()
+ {
+
+ if ( iTitle )
+ {
+ return *iTitle;
+ }
+ else
+ {
+ RequestMediaL();
+ return KNullDesC;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CAiPlayerPluginEngine::Artist
+// ---------------------------------------------------------------------------
+//
+const TDesC& CAiPlayerPluginEngine::Artist()
+ {
+ if ( iArtist )
+ {
+ return *iArtist;
+ }
+ else
+ {
+ return KNullDesC;
+ }
+ }
+// ---------------------------------------------------------------------------
+// CAiPlayerPluginEngine::Artist
+// ---------------------------------------------------------------------------
+//
+const TDesC& CAiPlayerPluginEngine::Uri()
+ {
+ if ( iUri )
+ {
+ return *iUri;
+ }
+ else
+ {
+ return KNullDesC;
+ }
+ }
+
+// ----------------------------------------------------
+// CAiPlayerPluginEngine::Position
+// ----------------------------------------------------
+//
+TInt CAiPlayerPluginEngine::Position()
+ {
+ return iPosition;
+ }
+
+// ----------------------------------------------------
+// CAiPlayerPluginEngine::Duration
+// ----------------------------------------------------
+//
+TInt CAiPlayerPluginEngine::Duration()
+ {
+ return iDuration;
+ }
+
+// ---------------------------------------------------------------------------
+// Handle playback message.
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::DoHandlePlaybackMessageL(
+ const CMPXMessage& aMessage )
+ {
+ MPX_DEBUG1("CAiPlayerPluginEngine::DoHandlePlaybackMessageL");
+
+ TMPXMessageId id(
+ aMessage.ValueTObjectL<TMPXMessageId>( KMPXMessageGeneralId ) );
+ if ( KMPXMessageGeneral == id )
+ {
+ TInt event( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralEvent ) );
+ MPX_DEBUG2( "CAiPlayerPluginEngine::DoHandlePlaybackMessageL(%d)",
+ event );
+ switch ( event )
+ {
+ case TMPXPlaybackMessage::EPropertyChanged:
+ {
+ TInt error( KErrNone );
+ DoHandlePropertyL(
+ aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ),
+ aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData ),
+ error );
+ break;
+ }
+ case TMPXPlaybackMessage::EStateChanged:
+ {
+ TMPXPlaybackState state(
+ aMessage.ValueTObjectL<TMPXPlaybackState>(
+ KMPXMessageGeneralType ));
+ MPX_DEBUG2("CAiPlayerPluginEngine::HandlePlaybackMessageL - E"
+ "StateChanged(%d)", state);
+
+ DoHandleStateChangedL( state );
+ break;
+ }
+ case TMPXPlaybackMessage::EMediaChanged:
+ case TMPXPlaybackMessage::EPlaylistUpdated:
+ {
+ iPlaybackUtility->PropertyL( *this, EPbPropertyPosition );
+ iPlaybackUtility->PropertyL( *this, EPbPropertyDuration );
+ RequestMediaL();
+ break;
+ }
+ case TMPXPlaybackMessage::ECommandReceived:
+ {
+ MPX_DEBUG2("CAiPlayerPluginEngine::HandlePlaybackMessageL - E"
+ "CommandReceived(%d)",
+ aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ) );
+ break;
+ }
+ case TMPXPlaybackMessage::EActivePlayerChanged:
+ {
+ MPX_DEBUG3("CAiPlayerPluginEngine::HandlePlaybackMessageL - E"
+ "ActivePlayerChanged(%d, %d)",
+ aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ),
+ aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData ) );
+ iPlaybackUtility->PropertyL( *this, EPbPropertyPosition );
+ iPlaybackUtility->PropertyL( *this, EPbPropertyDuration );
+ DoHandleStateChangedL( iPlaybackUtility->StateL() );
+ // refresh media property
+ RequestMediaL();
+ break;
+ }
+ case TMPXPlaybackMessage::ESkipping:
+ {
+ MPX_DEBUG1( "CAiPlayerPluginEngine::DoHandlePlaybackMessageL - ESkipping");
+ iAlbumArtUtil->CancelRequest();
+ iObserver->Opening();
+ iSkipping =ETrue;
+ break;
+ }
+ case TMPXPlaybackMessage::ESkipEnd:
+ {
+ MPX_DEBUG1( "CAiPlayerPluginEngine::DoHandlePlaybackMessageL - ESkipEnd()");
+ iSkipping = EFalse;
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Handle playback property.
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::DoHandlePropertyL( TInt aProperty, TInt aValue,
+ TInt aError )
+ {
+ MPX_DEBUG4("CAiPlayerPluginEngine::DoHandlePropertyL - Property(%d); Valu"
+ "e(%d); Error(%d)", aProperty, aValue, aError );
+ if ( KErrNone == aError )
+ {
+ switch ( aProperty )
+ {
+ case EPbPropertyPosition:
+ {
+ iPosition = aValue / KMPXOneSecInMilliSecs;
+ iObserver->PlaybackPositionChanged( iPosition );
+ break;
+ }
+ case EPbPropertyDuration:
+ {
+ iDuration = aValue / KMPXOneSecInMilliSecs;
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Handle playback state changed.
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::DoHandleStateChangedL( TMPXPlaybackState aState )
+ {
+ TMPlayerState state = MapState( aState );
+ MPX_DEBUG3("CAiPlayerPluginEngine::DoHandleStateChangedL - State mapped "
+ "from (%d) to (%d)", aState, state );
+ if (state != EMPlayerStateStarting)
+ {
+ iObserver->PlayerStateChanged(state);
+ }
+ else
+ {
+ iObserver->Opening();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Displays error notes.
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::HandleErrorL( TInt aError )
+ {
+ MPX_DEBUG2("CAiPlayerPluginEngine::HandleErrorL(%d)", aError );
+ }
+
+// ---------------------------------------------------------------------------
+// Map states from TMPXPlaybackState to TMPlayerState
+// ---------------------------------------------------------------------------
+//
+TMPlayerState CAiPlayerPluginEngine::MapState( TMPXPlaybackState aState )
+ {
+ TMPlayerState state = EMPlayerStateOther;
+ switch ( aState )
+ {
+ case EPbStatePlaying:
+ state = EMPlayerStatePlaying;
+ break;
+ case EPbStatePaused:
+ state = EMPlayerStatePaused;
+ break;
+ case EPbStateSeekingForward:
+ case EPbStateSeekingBackward:
+ state = EMPlayerStateSeeking;
+ break;
+ case EPbStateNotInitialised:
+ case EPbStateInitialising:
+ state = EMPlayerStateStarting;
+ break;
+ case EPbStateStopped:
+ state = EMPlayerStateStopped;
+ break;
+ default:
+ break;
+ }
+ return state;
+ }
+
+// ---------------------------------------------------------------------------
+// Requests Media.
+// ---------------------------------------------------------------------------
+//
+void CAiPlayerPluginEngine::RequestMediaL()
+ {
+ MPX_DEBUG1( "CAiPlayerPluginEngine::RequestMediaL" );
+ MMPXSource* s = iPlaybackUtility->Source();
+ if ( s )
+ {
+ RArray<TMPXAttribute> attrs;
+ CleanupClosePushL(attrs);
+ attrs.Append( KMPXMediaGeneralUri );
+ attrs.Append( KMPXMediaGeneralTitle );
+ attrs.Append( KMPXMediaMusicArtist );
+ attrs.Append( KMPXMediaMusicAlbumArtFileName );
+ s->MediaL( attrs.Array(), *this );
+ CleanupStack::PopAndDestroy( &attrs );
+ }
+ else
+ {
+ iObserver->PlaylisIsEmpty();
+ }
+ }
+// End of File