From 8f8736c965a62b792d079d54585ab834802a9959 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Mon, 16 Sep 2013 22:54:28 +0200 Subject: [PATCH] Let Phonon delete QNR_IODeviceStream but do all QIODevices still by ourselves --- src/libtomahawk/audio/AudioEngine.cpp | 20 ++++++++++++++++---- src/libtomahawk/utils/Qnr_IoDeviceStream.cpp | 4 ++-- src/libtomahawk/utils/Qnr_IoDeviceStream.h | 7 ++++--- 3 files changed, 22 insertions(+), 9 deletions(-) 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 qnr = io.objectCast(); + 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& 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 #include +#include +#include -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& reply, QObject *parent = 0 ); ~QNR_IODeviceStream(); virtual void enoughData(); @@ -53,7 +54,7 @@ private slots: private: QByteArray m_data; - QNetworkReply *m_networkReply; + QSharedPointer m_networkReply; qint64 m_pos; QTimer* m_timer; };