diff --git a/src/libtomahawk/audio/audioengine.cpp b/src/libtomahawk/audio/audioengine.cpp index c98891d24..90d8bb8e6 100644 --- a/src/libtomahawk/audio/audioengine.cpp +++ b/src/libtomahawk/audio/audioengine.cpp @@ -160,6 +160,8 @@ void AudioEngine::stop() { tDebug( LOGEXTRA ) << Q_FUNC_INFO; + + emit stopped(); if ( isStopped() ) return; @@ -171,7 +173,6 @@ AudioEngine::stop() if ( !m_currentTrack.isNull() ) emit timerPercentage( ( (double)m_timeElapsed / (double)m_currentTrack->duration() ) * 100.0 ); - emit stopped(); setCurrentTrack( Tomahawk::result_ptr() ); Tomahawk::InfoSystem::InfoTypeMap map; @@ -603,6 +604,9 @@ AudioEngine::onStateChanged( Phonon::State newState, Phonon::State oldState ) if ( newState == Phonon::ErrorState ) { tLog() << "Phonon Error:" << m_mediaObject->errorString() << m_mediaObject->errorType(); + emit error( UnknownError ); + + stop(); return; } if ( newState == Phonon::PlayingState ) diff --git a/src/libtomahawk/audio/audioengine.h b/src/libtomahawk/audio/audioengine.h index 8d803dbfa..d90db5f27 100644 --- a/src/libtomahawk/audio/audioengine.h +++ b/src/libtomahawk/audio/audioengine.h @@ -45,7 +45,7 @@ class DLLEXPORT AudioEngine : public QObject Q_OBJECT public: - enum AudioErrorCode { StreamReadError, AudioDeviceError, DecodeError }; + enum AudioErrorCode { StreamReadError, AudioDeviceError, DecodeError, UnknownError }; enum AudioState { Stopped, Playing, Paused }; static AudioEngine* instance(); @@ -121,7 +121,7 @@ signals: void playlistChanged( Tomahawk::PlaylistInterface* playlist ); - void error( AudioErrorCode errorCode ); + void error( AudioEngine::AudioErrorCode errorCode ); private slots: bool loadTrack( const Tomahawk::result_ptr& result ); diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index d4d9dc5ff..9d61acbb3 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -37,7 +37,6 @@ #include "playlist.h" #include "query.h" #include "artist.h" -#include "audio/audioengine.h" #include "viewmanager.h" #include "sip/SipHandler.h" #include "sourcetree/sourcetreeview.h" @@ -297,8 +296,8 @@ TomahawkWindow::setupSignals() m_audioControls, SLOT( onShuffleModeChanged( bool ) ) ); // - connect( AudioEngine::instance(), SIGNAL( loading( const Tomahawk::result_ptr& ) ), - SLOT( onPlaybackLoading( const Tomahawk::result_ptr& ) ) ); + connect( AudioEngine::instance(), SIGNAL( error( AudioEngine::AudioErrorCode ) ), SLOT( onAudioEngineError( AudioEngine::AudioErrorCode ) ) ); + connect( AudioEngine::instance(), SIGNAL( loading( const Tomahawk::result_ptr& ) ), SLOT( onPlaybackLoading( const Tomahawk::result_ptr& ) ) ); connect( AudioEngine::instance(), SIGNAL( started( Tomahawk::result_ptr ) ), SLOT( audioStarted() ) ); connect( AudioEngine::instance(), SIGNAL( resumed()), SLOT( audioStarted() ) ); connect( AudioEngine::instance(), SIGNAL( paused() ), SLOT( audioStopped() ) ); @@ -487,6 +486,7 @@ TomahawkWindow::pluginMenuRemoved( QMenu* menu ) } } + void TomahawkWindow::showOfflineSources() { @@ -519,6 +519,7 @@ TomahawkWindow::loadSpiff() #endif } + void TomahawkWindow::loadXspfFinished( int ret ) { @@ -537,6 +538,7 @@ TomahawkWindow::loadXspfFinished( int ret ) d->deleteLater(); } + void TomahawkWindow::onXSPFOk( const Tomahawk::playlist_ptr& pl ) { @@ -563,6 +565,17 @@ TomahawkWindow::onXSPFError( XSPFLoader::XSPFErrorCode error ) } +void +TomahawkWindow::onAudioEngineError( AudioEngine::AudioErrorCode /* error */ ) +{ +#ifdef Q_WS_X11 + QMessageBox::warning( this, tr( "Playback Error" ), tr( "Sorry, there is a problem accessing your audio device. Make sure you have a suitable Phonon backend and required plugins installed." ), QMessageBox::Ok ); +#else + QMessageBox::warning( this, tr( "Playback Error" ), tr( "Sorry, there is a problem accessing your audio device." ), QMessageBox::Ok ); +#endif +} + + void TomahawkWindow::createAutomaticPlaylist( QString playlistName ) { @@ -613,7 +626,9 @@ TomahawkWindow::createPlaylist() playlistSelectorDlg->show(); } -void TomahawkWindow::playlistCreateDialogFinished( int ret ) + +void +TomahawkWindow::playlistCreateDialogFinished( int ret ) { PlaylistTypeSelectorDlg* playlistSelectorDlg = qobject_cast< PlaylistTypeSelectorDlg* >( sender() ); Q_ASSERT( playlistSelectorDlg ); @@ -633,6 +648,7 @@ void TomahawkWindow::playlistCreateDialogFinished( int ret ) playlistSelectorDlg->deleteLater(); } + void TomahawkWindow::audioStarted() { @@ -655,6 +671,7 @@ TomahawkWindow::onPlaybackLoading( const Tomahawk::result_ptr& result ) setWindowTitle( m_windowTitle ); } + void TomahawkWindow::onSipConnected() { @@ -672,8 +689,8 @@ TomahawkWindow::onSipDisconnected() void TomahawkWindow::onSipPluginAdded( SipPlugin* p ) { - connect( p, SIGNAL( addMenu( QMenu* ) ), this, SLOT( pluginMenuAdded( QMenu* ) ) ); - connect( p, SIGNAL( removeMenu( QMenu* ) ), this, SLOT( pluginMenuRemoved( QMenu* ) ) ); + connect( p, SIGNAL( addMenu( QMenu* ) ), SLOT( pluginMenuAdded( QMenu* ) ) ); + connect( p, SIGNAL( removeMenu( QMenu* ) ), SLOT( pluginMenuRemoved( QMenu* ) ) ); } diff --git a/src/tomahawkwindow.h b/src/tomahawkwindow.h index 5e0fcaa1d..b1cc66646 100644 --- a/src/tomahawkwindow.h +++ b/src/tomahawkwindow.h @@ -26,6 +26,7 @@ #include #include "result.h" +#include "audio/audioengine.h" #include "utils/xspfloader.h" class JobStatusModel; @@ -84,6 +85,8 @@ private slots: void onSipDisconnected(); void onSipError(); + void onAudioEngineError( AudioEngine::AudioErrorCode error ); + void onXSPFError( XSPFLoader::XSPFErrorCode error ); void onXSPFOk( const Tomahawk::playlist_ptr& );