diff -r 79c49924ae23 -r af3740e3753f mpengine/src/mpengine.cpp --- 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"); - connect( mMpxHarvesterWrapper, SIGNAL( diskEvent(MpxDiskEvents) ), - this, SLOT( handleDiskEvent(MpxDiskEvents) ), Qt::QueuedConnection ); + connect( mMpxHarvesterWrapper, SIGNAL( diskEvent(MpxDiskEvents) ), + this, SLOT( handleDiskEvent(MpxDiskEvents) ), + Qt::QueuedConnection ); qRegisterMetaType("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"); + connect( mMpxHarvesterWrapper, SIGNAL( diskEvent(MpxDiskEvents) ), + this, SLOT( handleDiskEvent(MpxDiskEvents) ), + Qt::QueuedConnection ); + qRegisterMetaType("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 }