diff --git a/src/libtomahawk/audio/AudioEngine.cpp b/src/libtomahawk/audio/AudioEngine.cpp index f913f89ba..2eeb49bca 100644 --- a/src/libtomahawk/audio/AudioEngine.cpp +++ b/src/libtomahawk/audio/AudioEngine.cpp @@ -664,6 +664,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe return; } tDebug( LOGEXTRA ) << Q_FUNC_INFO << ( result.isNull() ? QString() : result->url() ); + QSharedPointer< QIODevice > ioToKeep = io; bool err = false; { @@ -681,11 +682,22 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) ) { - if ( QNetworkReply* qnr_io = qobject_cast< QNetworkReply* >( io.data() ) ) - d->mediaObject->setCurrentSource( new QNR_IODeviceStream( qnr_io, this ) ); + QSharedPointer<QNetworkReply> qnr = io.objectCast<QNetworkReply>(); + if ( !qnr.isNull() ) + { + d->mediaObject->setCurrentSource( new QNR_IODeviceStream( qnr, this ) ); + // We keep track of the QNetworkReply in QNR_IODeviceStream + // and Phonon handles the deletion of the + // QNR_IODeviceStream object + ioToKeep.clear(); + d->mediaObject->currentSource().setAutoDelete( true ); + } else + { d->mediaObject->setCurrentSource( io.data() ); - d->mediaObject->currentSource().setAutoDelete( false ); + // We handle the deletion via tracking in d->input + d->mediaObject->currentSource().setAutoDelete( false ); + } } else { @@ -722,7 +734,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe d->input->close(); d->input.clear(); } - d->input = io; + d->input = ioToKeep; queueState( Playing ); if ( TomahawkSettings::instance()->privateListeningMode() != TomahawkSettings::FullyPrivate ) diff --git a/src/libtomahawk/utils/Qnr_IoDeviceStream.cpp b/src/libtomahawk/utils/Qnr_IoDeviceStream.cpp index b46bb5a68..0176f452d 100644 --- a/src/libtomahawk/utils/Qnr_IoDeviceStream.cpp +++ b/src/libtomahawk/utils/Qnr_IoDeviceStream.cpp @@ -32,7 +32,7 @@ using namespace Tomahawk; // Feed Phonon in 1MiB blocks #define BLOCK_SIZE 1048576 -QNR_IODeviceStream::QNR_IODeviceStream( QNetworkReply* reply, QObject* parent ) +QNR_IODeviceStream::QNR_IODeviceStream( const QSharedPointer<QNetworkReply>& reply, QObject* parent ) : Phonon::AbstractMediaStream( parent ) , m_networkReply( reply ) , m_pos( 0 ) @@ -63,7 +63,7 @@ QNR_IODeviceStream::QNR_IODeviceStream( QNetworkReply* reply, QObject* parent ) } // Just consume all data that is already available. m_data = m_networkReply->readAll(); - connect( m_networkReply, SIGNAL( readyRead() ), SLOT( readyRead() ) ); + connect( m_networkReply.data(), SIGNAL( readyRead() ), SLOT( readyRead() ) ); } m_timer->setInterval( 0 ); diff --git a/src/libtomahawk/utils/Qnr_IoDeviceStream.h b/src/libtomahawk/utils/Qnr_IoDeviceStream.h index 9f13db03c..27f5d9ad4 100644 --- a/src/libtomahawk/utils/Qnr_IoDeviceStream.h +++ b/src/libtomahawk/utils/Qnr_IoDeviceStream.h @@ -27,8 +27,9 @@ #include <phonon/abstractmediastream.h> #include <QByteArray> +#include <QNetworkReply> +#include <QSharedPointer> -class QNetworkReply; class QIODevice; class QTimer; @@ -39,7 +40,7 @@ class DLLEXPORT QNR_IODeviceStream : public Phonon::AbstractMediaStream { Q_OBJECT public: - explicit QNR_IODeviceStream( QNetworkReply* reply, QObject *parent = 0 ); + explicit QNR_IODeviceStream( const QSharedPointer<QNetworkReply>& reply, QObject *parent = 0 ); ~QNR_IODeviceStream(); virtual void enoughData(); @@ -53,7 +54,7 @@ private slots: private: QByteArray m_data; - QNetworkReply *m_networkReply; + QSharedPointer<QNetworkReply> m_networkReply; qint64 m_pos; QTimer* m_timer; };