extragear/multimedia/amarok/src

Dan Meltzer parallelgrapefruit at gmail.com
Tue Feb 3 00:44:38 CET 2009


SVN commit 920478 by dmeltzer:

Fix tracks being counted twice, and track playback in the engine controller.

The enginecontroller is a mess.  This commit fixes things for me (which probably breaks things for at least one other person...)  Remove slotPrefinishMarkReached (which only called slotAboutToFinish) as it resulted in duplicate stat calculation.  Also, Phonon::MediaSource can have remote media enqueued, and in fact needs to to make playback work for http/lastfm streams. Please give this some testing and if it doesn't break anything I'll backport it to stable in a few days

BUG: 180205
CCMAIL: amarok-devel at kde.org

 M  +12 -21    EngineController.cpp  
 M  +0 -1      EngineController.h  
 M  +7 -0      playlist/PlaylistActions.cpp  


--- trunk/extragear/multimedia/amarok/src/EngineController.cpp #920477:920478
@@ -96,7 +96,6 @@
 
     // Get the next track when there is 2 seconds left on the current one.
     m_media->setPrefinishMark( 2000 );
-    connect( m_media, SIGNAL( prefinishMarkReached(qint32) ), SLOT( slotPrefinishMarkReached( qint32 ) ) );
     connect( m_media, SIGNAL( aboutToFinish()), SLOT( slotAboutToFinish() ) );
 
     connect( m_media, SIGNAL( metaDataChanged() ), SLOT( slotMetaDataChanged() ) );
@@ -490,26 +489,28 @@
 void
 EngineController::setNextTrack( Meta::TrackPtr track )
 {
+    DEBUG_BLOCK
     QMutexLocker locker( &m_mutex );
 
     if( !track )
-    {
-        track->prepareToPlay();
-        if( track->playableUrl().isEmpty() )
-            return;
-    }
+        return;
 
+    track->prepareToPlay();
+    if( track->playableUrl().isEmpty() )
+        return;
+
     if( m_media->state() == Phonon::PlayingState ||
         m_media->state() == Phonon::BufferingState )
     {
+        DEBUG_LINE_INFO
         m_media->clearQueue();
-        if( track->playableUrl().isLocalFile() )
-            m_media->enqueue( track->playableUrl() );
+        m_media->enqueue( track->playableUrl() );
         m_nextTrack = track;
         m_nextUrl = track->playableUrl();
     }
     else
     {
+        DEBUG_LINE_INFO
         play( track );
     }
 }
@@ -552,18 +553,7 @@
     trackPositionChangedNotify( static_cast<long>( position ), false ); //it expects milliseconds
 }
 
-
 void
-EngineController::slotPrefinishMarkReached( qint32 msecToEnd )
-{
-    // For some resason, phonon occasionally emits this right when the track starts playing.
-    if( msecToEnd < 0 || m_multi ) //skip for multi tracks as metadata might otehrwise go out of sync
-        return;
-    else
-        slotAboutToFinish();
-}
-
-void
 EngineController::slotAboutToFinish()
 {
     DEBUG_BLOCK
@@ -682,16 +672,17 @@
 
     if( url.isEmpty() )
     {
+        DEBUG_LINE_INFO
         The::playlistActions()->requestNextTrack();
         return;
     }
 
     if( !m_playWhenFetched )
     {
+        DEBUG_LINE_INFO
         m_mutex.lock();
         m_media->clearQueue();
-        if( url.isLocalFile() )
-            m_media->enqueue( url );
+        m_media->enqueue( url );
         m_nextTrack.clear();
         m_nextUrl = url;
         // reset this flag each time
--- trunk/extragear/multimedia/amarok/src/EngineController.h #920477:920478
@@ -119,7 +119,6 @@
 
 private slots:
     void slotTrackEnded();
-    void slotPrefinishMarkReached(qint32);
     void slotAboutToFinish();
     void slotNewTrackPlaying( const Phonon::MediaSource &source);
     void slotStateChanged( Phonon::State newState, Phonon::State oldState);
--- trunk/extragear/multimedia/amarok/src/playlist/PlaylistActions.cpp #920477:920478
@@ -88,22 +88,29 @@
 void
 Playlist::Actions::requestNextTrack()
 {
+    DEBUG_BLOCK
     if ( m_nextTrackCandidate != 0 )
+    {
+        debug() << "Already have a next track, why are we here?";
         return;
+    }
     m_trackError = false;
     m_currentTrack = Model::instance()->activeId();
     if ( stopAfterMode() == StopAfterQueue && m_currentTrack == m_trackToBeLast )
     {
+        DEBUG_LINE_INFO
             setStopAfterMode( StopAfterCurrent );
     }
     m_nextTrackCandidate = m_navigator->requestNextTrack();
     m_currentTrack = m_nextTrackCandidate;
     if ( stopAfterMode() == StopAfterCurrent )  //stop after current / stop after track starts here
     {
+        DEBUG_LINE_INFO
         setStopAfterMode( StopNever );
     }
     else
     {
+        debug() << "Playing next track: " << m_nextTrackCandidate;
         play( m_nextTrackCandidate, false );
     }
 }


More information about the Amarok-devel mailing list