mpengine/src/mpengine.cpp
changeset 48 af3740e3753f
parent 42 79c49924ae23
child 54 c5b304f4d89b
--- a/mpengine/src/mpengine.cpp	Tue Jul 06 14:13:36 2010 +0300
+++ b/mpengine/src/mpengine.cpp	Wed Aug 18 09:46:20 2010 +0300
@@ -22,13 +22,12 @@
 #include "mpmpxharvesterframeworkwrapper.h"
 #include "mpmpxcollectionframeworkwrapper.h"
 #include "mpmpxplaybackframeworkwrapper.h"
-#include "mpmpxdetailsframeworkwrapper.h"
 #include "mpaudioeffectsframeworkwrapper.h"
 #include "mpequalizerframeworkwrapper.h"
-#include "mpmediakeyhandler.h"
 #include "mptrace.h"
 #include "mpsettingsmanager.h"
 #include "mpsongscanner.h"
+#include "mpsongdata.h"
 
 /*!
     \class MpEngine
@@ -96,13 +95,6 @@
 
  */
 
-/*!
-    \fn void libraryRefreshNeeded()
-
-    This signal is emitted when usb in MassStorage mode is disconnected.
-
- */
-
 
 /*!
 -------------------------------------------------------------------------------
@@ -184,20 +176,34 @@
  */
 
 /*!
+-------------------------------------------------------------------------------
+    Playback related signals
+-------------------------------------------------------------------------------
+*/
+
+/*!
+    \fn void volumePropertyChanged( MpCommon::MpVolumeProperty, int value );
+
+    This signal is emitted when framework receives a volume related property notification,
+    such as EPbPropertyVolume, EPbPropertyMaxVolume, EPbPropertyMute.
+ */
+
+
+/*!
  Constructs music player engine.
  */
 MpEngine::MpEngine()
     : mMpxHarvesterWrapper(0),
       mSongScanner(0),
-      mMediaKeyHandler(0),
       mMpxCollectionWrapper(0),
       mMpxPlaybackWrapper(0),
-      mMpxDetailsWrapper(0),
       mAudioEffectsWrapper(0),
       mEqualizerWrapper(0),
       mCurrentPresetIndex(KEqualizerPresetNone),
+      mSongData(0),
       mUsbBlockingState(USB_NotConnected),
-      mPreviousUsbState(USB_NotConnected)
+      mPreviousUsbState(USB_NotConnected),
+      mHandleMediaCommands(true)
 {
     TX_LOG
 }
@@ -208,14 +214,13 @@
 MpEngine::~MpEngine()
 {
     TX_ENTRY
-    delete mMediaKeyHandler;
     delete mMpxPlaybackWrapper;
-    delete mMpxDetailsWrapper;
     delete mMpxHarvesterWrapper;
     delete mMpxCollectionWrapper;
     delete mAudioEffectsWrapper;
     delete mEqualizerWrapper;
     delete mSongScanner;
+    delete mSongData;
     TX_EXIT
 }
 
@@ -224,80 +229,125 @@
  */
 void MpEngine::initialize( TUid hostUid, EngineMode mode )
 {
-    TX_ENTRY
+    TX_ENTRY_ARGS("hostUid=" << hostUid.iUid << ", mode=" << mode);
     mHostUid = hostUid;
 
-    if( mode == StandAlone || mode == Fetch ){
+    if ( StandAlone == mode ) {
+        mSongData = new MpSongData();
+
         // Harvesting Wrapper
         mMpxHarvesterWrapper = new MpMpxHarvesterFrameworkWrapper( mHostUid );
-        connect( mMpxHarvesterWrapper, SIGNAL( scanStarted() ), 
-                 this, SLOT( handleScanStarted() ), Qt::QueuedConnection );
-        connect( mMpxHarvesterWrapper, SIGNAL( scanEnded(int, int) ), 
-                 this, SLOT( handleScanEnded(int, int) ), Qt::QueuedConnection );
+        connect( mMpxHarvesterWrapper, SIGNAL( scanStarted() ),
+                 this, SLOT( handleScanStarted() ), 
+				 Qt::QueuedConnection );
+        connect( mMpxHarvesterWrapper, SIGNAL( scanEnded(int, int) ),
+                 this, SLOT( handleScanEnded(int, int) ), 
+				 Qt::QueuedConnection );
         qRegisterMetaType<MpxDiskEvents>("MpxDiskEvents");
-        connect( mMpxHarvesterWrapper, SIGNAL( diskEvent(MpxDiskEvents) ), 
-                 this, SLOT( handleDiskEvent(MpxDiskEvents) ), Qt::QueuedConnection );
+        connect( mMpxHarvesterWrapper, SIGNAL( diskEvent(MpxDiskEvents) ),
+                 this, SLOT( handleDiskEvent(MpxDiskEvents) ), 
+				 Qt::QueuedConnection );
         qRegisterMetaType<MpxUsbEvents>("MpxUsbEvents");
-        connect( mMpxHarvesterWrapper, SIGNAL( usbEvent(MpxUsbEvents) ), 
-                 this, SLOT( handleUsbEvent(MpxUsbEvents) ), Qt::QueuedConnection );
-        mMediaKeyHandler = new MpMediaKeyHandler();
-    }
+        connect( mMpxHarvesterWrapper, SIGNAL( usbEvent(MpxUsbEvents) ),
+                 this, SLOT( handleUsbEvent(MpxUsbEvents) ), 
+				 Qt::QueuedConnection );
 
-    if ( mode == StandAlone || mode == Fetch || mode == MediaBrowsing) {
-        
         // Collection Wrapper
-        mMpxCollectionWrapper = new MpMpxCollectionFrameworkWrapper( mHostUid );
-        
-        //disabling these since fetch mode plays only one song at a time.
-        mMpxCollectionWrapper->setRepeatFeatureEnabled( mode != Fetch );
-        mMpxCollectionWrapper->setShuffleFeatureEnabled( mode != Fetch );
-        
+        mMpxCollectionWrapper = new MpMpxCollectionFrameworkWrapper( mHostUid, mSongData );
         connect( mMpxCollectionWrapper, SIGNAL( collectionPlaylistOpened() ),
-                this, SIGNAL( collectionPlaylistOpened() ),
-                Qt::QueuedConnection );
-        connect( mMpxCollectionWrapper, SIGNAL( aboutToAddSongs( int ) ),
-                this, SIGNAL( aboutToAddSongs( int ) ) );
-        connect( mMpxCollectionWrapper, SIGNAL( playlistSaved( bool ) ),
-                this, SIGNAL( playlistSaved( bool ) ),
-                Qt::QueuedConnection );
-        connect( mMpxCollectionWrapper, SIGNAL( playlistsRenamed( bool ) ),
-                this, SIGNAL( playlistsRenamed( bool ) ),
-                Qt::QueuedConnection );
-        connect( mMpxCollectionWrapper, SIGNAL( isolatedCollectionOpened( MpMpxCollectionData* ) ),
-                this, SIGNAL( isolatedCollectionOpened( MpMpxCollectionData* ) ),
-                Qt::QueuedConnection );
+                 this, SIGNAL( collectionPlaylistOpened() ), 
+				 Qt::QueuedConnection );
+        connect( mMpxCollectionWrapper, SIGNAL( aboutToAddSongs(int) ),
+                 this, SIGNAL( aboutToAddSongs(int) ) );
+        connect( mMpxCollectionWrapper, SIGNAL( playlistSaved(bool) ),
+                 this, SIGNAL( playlistSaved(bool) ), 
+				 Qt::QueuedConnection );
+        connect( mMpxCollectionWrapper, SIGNAL( playlistsRenamed(bool) ),
+                 this, SIGNAL( playlistsRenamed(bool) ), 
+				 Qt::QueuedConnection );
+        connect( mMpxCollectionWrapper, SIGNAL( isolatedCollectionOpened(MpMpxCollectionData*) ),
+                 this, SIGNAL( isolatedCollectionOpened(MpMpxCollectionData*) ), 
+				 Qt::QueuedConnection );
         connect( mMpxCollectionWrapper, SIGNAL( containerContentsChanged() ),
-                this, SIGNAL( containerContentsChanged() ),
-                Qt::QueuedConnection );
-        connect( mMpxCollectionWrapper, SIGNAL( deleteStarted( TCollectionContext, int ) ),
-                this, SLOT( handleDeleteStarted( TCollectionContext, int ) ) );
-        connect( mMpxCollectionWrapper, SIGNAL( songsDeleted( bool ) ),
-                this, SLOT( handleDeleteEnded( bool ) ),
-                Qt::QueuedConnection );
+                 this, SIGNAL( containerContentsChanged() ), 
+				 Qt::QueuedConnection );
+        connect( mMpxCollectionWrapper, SIGNAL( deleteStarted(TCollectionContext, int) ),
+                 this, SLOT( handleDeleteStarted(TCollectionContext, int) ) );
+        connect( mMpxCollectionWrapper, SIGNAL( songsDeleted(bool) ),
+                 this, SLOT( handleDeleteEnded(bool) ), 
+				 Qt::QueuedConnection );
         connect( mMpxCollectionWrapper, SIGNAL( restorePathFailed() ),
-                this, SIGNAL( restorePathFailed() ),
-                Qt::QueuedConnection );
-    }
+                 this, SIGNAL( restorePathFailed() ),
+                 Qt::QueuedConnection );
+        // Equalizer wrapper; this needs to be created before playback wrapper.
+        mEqualizerWrapper = new MpEqualizerFrameworkWrapper();
+        connect( mEqualizerWrapper, SIGNAL( equalizerReady() ),
+                 this, SLOT( handleEqualizerReady() ), 
+				 Qt::QueuedConnection );
 
-    if( mode == StandAlone ){
-        // Equalizer wrapper , this needs to be created before playback wrapper.
-        mEqualizerWrapper = new MpEqualizerFrameworkWrapper();
-        connect( mEqualizerWrapper, SIGNAL( equalizerReady() ), 
-                 this, SLOT( handleEqualizerReady() ), Qt::QueuedConnection );
-    }
-    
-    if ( mode == StandAlone || mode == Fetch || mode == Embedded ) {
-        // Playback Wrapper 
-        mMpxPlaybackWrapper = new MpMpxPlaybackFrameworkWrapper( mHostUid );
-        
-        // Details Wrapper
-        mMpxDetailsWrapper = new MpMpxDetailsFrameworkWrapper( mHostUid );
-    }
+        // Playback Wrapper
+        mMpxPlaybackWrapper = new MpMpxPlaybackFrameworkWrapper( mHostUid, mSongData );
+        connect( this, SIGNAL( libraryUpdated() ),
+                 mMpxPlaybackWrapper, SLOT( closeCurrentPlayback() ) );
+        connect( mMpxPlaybackWrapper, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ),
+                 this, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ) );
 
-    if( mode == StandAlone ){
         // AudioEffects wrapper
         mAudioEffectsWrapper = new MpAudioEffectsFrameworkWrapper();
     }
+    else if ( Fetch == mode ) {
+        // Harvesting Wrapper
+        mMpxHarvesterWrapper = new MpMpxHarvesterFrameworkWrapper( mHostUid );
+        connect( mMpxHarvesterWrapper, SIGNAL( scanStarted() ),
+                 this, SLOT( handleScanStarted() ), 
+				 Qt::QueuedConnection );
+        connect( mMpxHarvesterWrapper, SIGNAL( scanEnded(int, int) ),
+                 this, SLOT( handleScanEnded(int, int) ), 
+				 Qt::QueuedConnection );
+        qRegisterMetaType<MpxDiskEvents>("MpxDiskEvents");
+        connect( mMpxHarvesterWrapper, SIGNAL( diskEvent(MpxDiskEvents) ),
+                 this, SLOT( handleDiskEvent(MpxDiskEvents) ), 
+				 Qt::QueuedConnection );
+        qRegisterMetaType<MpxUsbEvents>("MpxUsbEvents");
+        connect( mMpxHarvesterWrapper, SIGNAL( usbEvent(MpxUsbEvents) ),
+                 this, SLOT( handleUsbEvent(MpxUsbEvents) ), 
+				 Qt::QueuedConnection );
+
+        // Collection Wrapper
+        mMpxCollectionWrapper = new MpMpxCollectionFrameworkWrapper( mHostUid, 0 );
+        connect( mMpxCollectionWrapper, SIGNAL( collectionPlaylistOpened() ),
+                 this, SIGNAL( collectionPlaylistOpened() ), 
+				 Qt::QueuedConnection );
+        // Disabling these since fetch mode plays only one song at a time.
+        mMpxCollectionWrapper->setRepeatFeatureEnabled( false );
+        mMpxCollectionWrapper->setShuffleFeatureEnabled( false );
+
+        // Playback Wrapper
+        mMpxPlaybackWrapper = new MpMpxPlaybackFrameworkWrapper( mHostUid, 0 );
+        connect( this, SIGNAL( libraryUpdated() ),
+                 mMpxPlaybackWrapper, SLOT( closeCurrentPlayback() ) );
+        connect( mMpxPlaybackWrapper, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ),
+                 this, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ) );
+
+    }
+    else if ( MediaBrowsing == mode ) {
+        // Collection Wrapper
+        mMpxCollectionWrapper = new MpMpxCollectionFrameworkWrapper( mHostUid, 0 );
+        connect( mMpxCollectionWrapper, SIGNAL( collectionPlaylistOpened() ),
+                 this, SIGNAL( collectionPlaylistOpened() ), 
+				 Qt::QueuedConnection );
+        connect( mMpxCollectionWrapper, SIGNAL( containerContentsChanged() ),
+                 this, SIGNAL( containerContentsChanged() ), 
+				 Qt::QueuedConnection );
+    }
+    else if ( Embedded == mode ) {
+        mSongData = new MpSongData();
+        // Playback Wrapper
+        mMpxPlaybackWrapper = new MpMpxPlaybackFrameworkWrapper( mHostUid, mSongData );
+        connect( mMpxPlaybackWrapper, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ),
+                 this, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ) );
+
+    }
     TX_EXIT
 }
 
@@ -367,7 +417,7 @@
  */
 void MpEngine::handleScanStarted() {
     TX_ENTRY
-    mMediaKeyHandler->setEnabled(false);
+    mHandleMediaCommands = false;
     TX_EXIT
 }
 
@@ -378,7 +428,7 @@
     TX_ENTRY
     Q_UNUSED( count );
     Q_UNUSED( error );
-    mMediaKeyHandler->setEnabled(true);
+    mHandleMediaCommands = true;
     emit libraryUpdated();
     TX_EXIT
 }
@@ -391,10 +441,10 @@
     TX_ENTRY_ARGS("event=" << event);
     switch ( event ) {
         case DiskFormatStarted:
-            mMediaKeyHandler->setEnabled(false);
+            mHandleMediaCommands = false;
             break;
         case DiskFormatEnded:
-            mMediaKeyHandler->setEnabled(true);
+            mHandleMediaCommands = true;
             break;
         case DiskRemoved:
             if ( mUsbBlockingState != USB_Synchronizing ) {
@@ -448,7 +498,7 @@
 void MpEngine::handleUsbMassStorageStartEvent()
 {
     TX_ENTRY
-    mMediaKeyHandler->setEnabled(false);
+    mHandleMediaCommands = false;
 
     changeUsbBlockingState( USB_Synchronizing );
     emit usbBlocked(true);
@@ -463,12 +513,12 @@
 void MpEngine::handleUsbMassStorageEndEvent()
 {
     TX_ENTRY
-    mMediaKeyHandler->setEnabled(true);
+    mHandleMediaCommands = true;
 
     changeUsbBlockingState( USB_NotConnected );
     emit usbBlocked(false);
     emit usbSynchronizationFinished();
-    emit libraryRefreshNeeded();
+    refreshLibrary();
 
     TX_EXIT
 }
@@ -479,7 +529,7 @@
 void MpEngine::handleUsbMtpStartEvent()
 {
     TX_ENTRY
-    mMediaKeyHandler->setEnabled(false);
+    mHandleMediaCommands = false;
     
     changeUsbBlockingState( USB_Synchronizing );
     emit usbBlocked(true);
@@ -498,7 +548,7 @@
 void MpEngine::handleUsbMtpEndEvent()
 {
     TX_ENTRY
-    mMediaKeyHandler->setEnabled(true);
+    mHandleMediaCommands = true;
 
     changeUsbBlockingState( USB_NotConnected );
     emit usbBlocked(false);
@@ -718,7 +768,7 @@
 void MpEngine::handleDeleteStarted( TCollectionContext context, int count )
 {
     TX_ENTRY
-    mMediaKeyHandler->setEnabled( false );
+    mHandleMediaCommands = false;
     emit deleteStarted( context, count );
     TX_EXIT
 }
@@ -729,7 +779,7 @@
 void MpEngine::handleDeleteEnded( bool success )
 {
     TX_ENTRY
-    mMediaKeyHandler->setEnabled(true);
+    mHandleMediaCommands = true;
     emit songsDeleted( success );
     TX_EXIT
 }
@@ -777,12 +827,36 @@
 {
     mMpxPlaybackWrapper->play( file );
 }
+
+/*!
+ Slot to handle a play command
+ */
+
+void MpEngine::play()
+{
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->play();
+    }
+}
+
+/*!
+ Slot to handle a pause command.
+ */
+void MpEngine::pause()
+{
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->pause();
+    }
+}
+
 /*!
  Slot to handle a play pause.
  */
 void MpEngine::playPause()
 {
-    mMpxPlaybackWrapper->playPause();
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->playPause();
+    }
 }
 
 /*!
@@ -790,7 +864,9 @@
  */
 void MpEngine::stop()
 {
-    mMpxPlaybackWrapper->stop();
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->stop();
+    }
 }
 
 /*!
@@ -798,7 +874,9 @@
  */
 void MpEngine::skipForward()
 {
-    mMpxPlaybackWrapper->skipForward();
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->skipForward();
+    }
 }
 
 /*!
@@ -806,7 +884,9 @@
  */
 void MpEngine::startSeekForward()
 {
-    mMpxPlaybackWrapper->startSeekForward();
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->startSeekForward();
+    }
 }
 
 /*!
@@ -814,7 +894,9 @@
  */
 void MpEngine::stopSeeking()
 {
-    mMpxPlaybackWrapper->stopSeeking();
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->stopSeeking();
+    }
 }
 
 /*!
@@ -822,7 +904,9 @@
  */
 void MpEngine::skipBackward()
 {
-    mMpxPlaybackWrapper->skipBackward();
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->skipBackward();
+    }
 }
 
 /*!
@@ -830,7 +914,9 @@
  */
 void MpEngine::startSeekBackward()
 {
-    mMpxPlaybackWrapper->startSeekBackward();
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->startSeekBackward();
+    }
 }
 /*!
  Slot to handle a request to change \a position.
@@ -857,20 +943,103 @@
 }
 
 /*!
- Returns pointer to MpSongData, which is the song data for detail's view.
+ Slot to handle a request to get the volume level Max.
+ Response will be asynchronously sent through volumePropertyChanged() signal.
+ */
+void MpEngine::getMaxVolume( )
+{
+    mMpxPlaybackWrapper->getMaxVolume();
+}
+
+/*!
+ Slot to handle a request to get the current volume level.
+ Response will be asynchronously sent through volumePropertyChanged() signal.
+ */
+void MpEngine::getVolume( )
+{
+    mMpxPlaybackWrapper->getVolume();
+}
+
+/*!
+ Slot to handle a request to increase volume.
+ */
+void MpEngine::increaseVolume()
+{
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->increaseVolume();
+    }
+}
+
+/*!
+ Slot to handle a request to decrease volume.
+ */
+void MpEngine::decreaseVolume()
+{
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->decreaseVolume();
+    }
+}
+
+/*!
+ Slot to handle a request to set the volume level.
+ */
+void MpEngine::setVolume( int value )
+{
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->setVolume( value );
+    }
+}
+
+/*!
+ Slot to handle a request to get the current mute state.
+ Response will be asynchronously sent through volumePropertyChanged() signal.
+ */
+void MpEngine::getMuteState( )
+{
+    mMpxPlaybackWrapper->getMuteState();
+}
+
+/*!
+ Slot to handle a request to mute.
+ */
+void MpEngine::mute()
+{
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->mute();
+    }
+}
+
+/*!
+ Slot to handle a request to unmute.
+ */
+void MpEngine::unmute()
+{
+    if ( mHandleMediaCommands ) {
+        mMpxPlaybackWrapper->unmute();
+    }
+}
+
+/*!
+ Returns pointer to MpSongData, which is the song data for Details View.
  */
 MpSongData *MpEngine::songData()
 {
-    return mMpxDetailsWrapper->songData();
+    return mSongData;
 }
 
 /*!
- Retrieve song informatioin
+ Retrieves song details for the specified \a index.
  */
-void MpEngine::retrieveSong()
+void MpEngine::retrieveSongDetails( int index )
 {
     TX_ENTRY
-    mMpxDetailsWrapper->retrieveSong();
+    if ( index == -1 ) {
+        // Retrieve song details of currently playing song
+        mMpxPlaybackWrapper->retrieveSongDetails();
+    }
+    else {
+        mMpxCollectionWrapper->retrieveSongDetails(index);
+    }
     TX_EXIT
 }