From bf015d241ac73122e148b268299f1bc18350e9ce Mon Sep 17 00:00:00 2001
From: Jeff Mitchell <tomahawk@jefferai.org>
Date: Thu, 23 Jun 2011 16:03:24 -0400
Subject: [PATCH] Rip out retry timer and move to a push solution. Untested,
 will test later.

---
 src/libtomahawk/album.h                     |  2 +
 src/libtomahawk/artist.h                    |  2 +
 src/libtomahawk/audio/audioengine.cpp       | 55 ++++++++++-----------
 src/libtomahawk/audio/audioengine.h         |  4 +-
 src/libtomahawk/playlist.h                  |  2 +
 src/libtomahawk/playlist/albumproxymodel.h  |  2 +
 src/libtomahawk/playlist/trackproxymodel.h  |  2 +
 src/libtomahawk/playlist/treeproxymodel.h   |  2 +
 src/libtomahawk/playlistinterface.h         |  2 +
 src/libtomahawk/sourceplaylistinterface.cpp |  3 +-
 src/libtomahawk/sourceplaylistinterface.h   |  5 +-
 11 files changed, 49 insertions(+), 32 deletions(-)

diff --git a/src/libtomahawk/album.h b/src/libtomahawk/album.h
index 96b901b0e..12b7a41e3 100644
--- a/src/libtomahawk/album.h
+++ b/src/libtomahawk/album.h
@@ -70,6 +70,8 @@ signals:
     void tracksAdded( const QList<Tomahawk::query_ptr>& tracks );
     void trackCountChanged( unsigned int tracks );
     void sourceTrackCountChanged( unsigned int tracks );
+    
+    void nextTrackReady();
 
 private slots:
     void onTracksAdded( const QList<Tomahawk::query_ptr>& tracks );
diff --git a/src/libtomahawk/artist.h b/src/libtomahawk/artist.h
index f1b631d81..d30cc57a9 100644
--- a/src/libtomahawk/artist.h
+++ b/src/libtomahawk/artist.h
@@ -71,6 +71,8 @@ signals:
     void trackCountChanged( unsigned int tracks );
     void sourceTrackCountChanged( unsigned int tracks );
 
+    void nextTrackReady();
+    
 private slots:
     void onTracksAdded( const QList<Tomahawk::query_ptr>& tracks );
 
diff --git a/src/libtomahawk/audio/audioengine.cpp b/src/libtomahawk/audio/audioengine.cpp
index fd3f42de1..b1e0c3b1a 100644
--- a/src/libtomahawk/audio/audioengine.cpp
+++ b/src/libtomahawk/audio/audioengine.cpp
@@ -52,6 +52,7 @@ AudioEngine::AudioEngine()
     , m_queue( 0 )
     , m_timeElapsed( 0 )
     , m_expectStop( false )
+    , m_waitingOnNewTrack( false )
 {
     s_instance = this;
     qDebug() << "Init AudioEngine";
@@ -75,17 +76,12 @@ AudioEngine::AudioEngine()
     // Since it's indendent, we'll set it to 75% since that's nicer
     setVolume( 75 );
 #endif
-
-    m_retryTimer.setInterval( 10000 );
-    m_retryTimer.setSingleShot( false );
-    connect( &m_retryTimer, SIGNAL( timeout() ), SLOT( loadNextTrack() ) );
 }
 
 
 AudioEngine::~AudioEngine()
 {
     qDebug() << Q_FUNC_INFO;
-    m_retryTimer.stop();
     m_mediaObject->stop();
 //    stop();
 
@@ -144,8 +140,7 @@ AudioEngine::stop( bool sendNotification )
     qDebug() << Q_FUNC_INFO;
 
     m_mediaObject->stop();
-    m_retryTimer.stop();
-
+    
     if ( m_playlist )
         m_playlist->reset();
     
@@ -255,8 +250,6 @@ AudioEngine::loadTrack( const Tomahawk::result_ptr& result )
 {
     qDebug() << Q_FUNC_INFO << thread() << result;
 
-    m_retryTimer.stop();
-    
     bool err = false;
 
     {
@@ -344,6 +337,7 @@ AudioEngine::loadTrack( const Tomahawk::result_ptr& result )
         return false;
     }
 
+    m_waitingOnNewTrack = false;
     return true;
 }
 
@@ -352,8 +346,6 @@ AudioEngine::loadPreviousTrack()
 {
     qDebug() << Q_FUNC_INFO;
     
-    m_retryTimer.stop();
-    
     if ( !m_playlist )
     {
         stop();
@@ -373,9 +365,6 @@ AudioEngine::loadNextTrack()
 {
     qDebug() << Q_FUNC_INFO;
 
-    bool wasRetrying = m_retryTimer.isActive();
-    m_retryTimer.stop();
-    
     Tomahawk::result_ptr result;
 
     if ( m_queue && m_queue->trackCount() )
@@ -395,16 +384,12 @@ AudioEngine::loadNextTrack()
         stop( false );
         if ( m_playlist && m_playlist->retryMode() == Tomahawk::PlaylistInterface::Retry )
         {
-            if ( !wasRetrying )
-            {
-                Tomahawk::InfoSystem::InfoCriteriaHash retryInfo;
-                retryInfo["message"] = QString( "The current track could not be resolved. Tomahawk will keep trying..." );
-                Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo(
-                    s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNotifyUser,
-                    QVariant::fromValue< Tomahawk::InfoSystem::InfoCriteriaHash >( retryInfo ) );
-            }
-            m_retryTimer.setInterval( m_playlist->retryInterval() );
-            m_retryTimer.start();
+            m_waitingOnNewTrack = true;
+            Tomahawk::InfoSystem::InfoCriteriaHash retryInfo;
+            retryInfo["message"] = QString( "The current track could not be resolved. Tomahawk will pick back up with the next resolvable track..." );
+            Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo(
+                s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNotifyUser,
+                QVariant::fromValue< Tomahawk::InfoSystem::InfoCriteriaHash >( retryInfo ) );
         }
     }
 }
@@ -417,7 +402,7 @@ AudioEngine::playItem( Tomahawk::PlaylistInterface* playlist, const Tomahawk::re
 
     if ( m_playlist )
         m_playlist->reset();
-    
+
     setPlaylist( playlist );
     m_currentTrackPlaylist = playlist;
 
@@ -425,17 +410,27 @@ AudioEngine::playItem( Tomahawk::PlaylistInterface* playlist, const Tomahawk::re
         loadTrack( result );
     else if ( m_playlist->retryMode() == PlaylistInterface::Retry )
     {
+        m_waitingOnNewTrack = true;
         Tomahawk::InfoSystem::InfoCriteriaHash retryInfo;
-        retryInfo["message"] = QString( "The current track could not be resolved. Tomahawk will keep trying..." );
+        retryInfo["message"] = QString( "The current track could not be resolved. Tomahawk will pick back up with the next resolvable track..." );
         Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo(
             s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNotifyUser,
             QVariant::fromValue< Tomahawk::InfoSystem::InfoCriteriaHash >( retryInfo ) );
-        m_retryTimer.setInterval( playlist->retryInterval() );
-        m_retryTimer.start();
     }
 }
 
 
+void
+AudioEngine::playlistNextTrackReady()
+{
+    if ( !m_waitingOnNewTrack )
+        return;
+
+    m_waitingOnNewTrack = false;
+    next();
+}
+
+
 void
 AudioEngine::onAboutToFinish()
 {
@@ -498,6 +493,10 @@ AudioEngine::setPlaylist( PlaylistInterface* playlist )
     if ( m_playlist )
         m_playlist->reset();
     m_playlist = playlist;
+
+    if ( m_playlist->retryMode() == PlaylistInterface::Retry )
+        connect( m_playlist->object(), SIGNAL( nextTrackReady() ), SLOT( playlistNextTrackReady() ) );
+    
     emit playlistChanged( playlist );
 }
 
diff --git a/src/libtomahawk/audio/audioengine.h b/src/libtomahawk/audio/audioengine.h
index 92f687518..c92b9df70 100644
--- a/src/libtomahawk/audio/audioengine.h
+++ b/src/libtomahawk/audio/audioengine.h
@@ -83,6 +83,8 @@ public slots:
 
     void onTrackAboutToFinish();
 
+    void playlistNextTrackReady();
+
 signals:
     void loading( const Tomahawk::result_ptr& track );
     void started( const Tomahawk::result_ptr& track );
@@ -131,7 +133,7 @@ private:
     unsigned int m_timeElapsed;
     bool m_expectStop;
 
-    QTimer m_retryTimer;
+    bool m_waitingOnNewTrack;
 
     static AudioEngine* s_instance;
 };
diff --git a/src/libtomahawk/playlist.h b/src/libtomahawk/playlist.h
index 76bab9b74..a74729f7d 100644
--- a/src/libtomahawk/playlist.h
+++ b/src/libtomahawk/playlist.h
@@ -208,6 +208,8 @@ signals:
     void trackCountChanged( unsigned int tracks );
     void sourceTrackCountChanged( unsigned int tracks );
 
+    void nextTrackReady();
+
 public slots:
     // want to update the playlist from the model?
     // generate a newrev using uuid() and call this:
diff --git a/src/libtomahawk/playlist/albumproxymodel.h b/src/libtomahawk/playlist/albumproxymodel.h
index 8b9d5e1f6..991ec6b57 100644
--- a/src/libtomahawk/playlist/albumproxymodel.h
+++ b/src/libtomahawk/playlist/albumproxymodel.h
@@ -65,6 +65,8 @@ signals:
 
     void filterChanged( const QString& filter );
 
+    void nextTrackReady();
+
 public slots:
     virtual void setRepeatMode( RepeatMode mode ) { m_repeatMode = mode; emit repeatModeChanged( mode ); }
     virtual void setShuffled( bool enabled ) { m_shuffled = enabled; emit shuffleModeChanged( enabled ); }
diff --git a/src/libtomahawk/playlist/trackproxymodel.h b/src/libtomahawk/playlist/trackproxymodel.h
index 3ddb35779..76381b117 100644
--- a/src/libtomahawk/playlist/trackproxymodel.h
+++ b/src/libtomahawk/playlist/trackproxymodel.h
@@ -74,6 +74,8 @@ signals:
 
     void filterChanged( const QString& filter );
 
+    void nextTrackReady();
+    
 public slots:
     virtual void setRepeatMode( RepeatMode mode ) { m_repeatMode = mode; emit repeatModeChanged( mode ); }
     virtual void setShuffled( bool enabled ) { m_shuffled = enabled; emit shuffleModeChanged( enabled ); }
diff --git a/src/libtomahawk/playlist/treeproxymodel.h b/src/libtomahawk/playlist/treeproxymodel.h
index 66efc7668..5e33ddcb3 100644
--- a/src/libtomahawk/playlist/treeproxymodel.h
+++ b/src/libtomahawk/playlist/treeproxymodel.h
@@ -70,6 +70,8 @@ signals:
 
     void filterChanged( const QString& filter );
 
+    void nextTrackReady();
+
 public slots:
     virtual void setRepeatMode( RepeatMode mode ) { m_repeatMode = mode; emit repeatModeChanged( mode ); }
     virtual void setShuffled( bool enabled ) { m_shuffled = enabled; emit shuffleModeChanged( enabled ); }
diff --git a/src/libtomahawk/playlistinterface.h b/src/libtomahawk/playlistinterface.h
index ad93a8a03..01f9f3126 100644
--- a/src/libtomahawk/playlistinterface.h
+++ b/src/libtomahawk/playlistinterface.h
@@ -32,6 +32,7 @@ namespace Tomahawk
 
 class DLLEXPORT PlaylistInterface
 {
+
 public:
     enum RepeatMode { NoRepeat, RepeatOne, RepeatAll };
     enum ViewMode { Unknown, Tree, Flat, Album };
@@ -78,6 +79,7 @@ signals:
     virtual void shuffleModeChanged( bool enabled ) = 0;
     virtual void trackCountChanged( unsigned int tracks ) = 0;
     virtual void sourceTrackCountChanged( unsigned int tracks ) = 0;
+    virtual void nextTrackReady() = 0;
 
 private:
     QObject* m_object;
diff --git a/src/libtomahawk/sourceplaylistinterface.cpp b/src/libtomahawk/sourceplaylistinterface.cpp
index c8023baf2..a3d794937 100644
--- a/src/libtomahawk/sourceplaylistinterface.cpp
+++ b/src/libtomahawk/sourceplaylistinterface.cpp
@@ -114,7 +114,8 @@ SourcePlaylistInterface::resolveResultsAdded( const QList<Tomahawk::result_ptr>&
 }
 
 void
-SourcePlaylistInterface::resolvingFinished( bool hasResults ) const
+SourcePlaylistInterface::resolvingFinished( bool hasResults )
 {
     qDebug() << Q_FUNC_INFO << " and has results? : " << (hasResults ? "true" : "false");
+    emit nextTrackReady();
 }
\ No newline at end of file
diff --git a/src/libtomahawk/sourceplaylistinterface.h b/src/libtomahawk/sourceplaylistinterface.h
index 56d8bebfa..7eb8d179d 100644
--- a/src/libtomahawk/sourceplaylistinterface.h
+++ b/src/libtomahawk/sourceplaylistinterface.h
@@ -70,11 +70,12 @@ signals:
     void shuffleModeChanged( bool enabled );
     void trackCountChanged( unsigned int tracks );
     void sourceTrackCountChanged( unsigned int tracks );
-
+    void nextTrackReady();
+    
 private slots:
     void onSourcePlaybackStarted( const Tomahawk::query_ptr& query );
     void resolveResultsAdded( const QList<Tomahawk::result_ptr>& results ) const;
-    void resolvingFinished( bool hasResults ) const;
+    void resolvingFinished( bool hasResults );
 
 private:
     Tomahawk::source_ptr m_source;