1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-05 21:57:41 +02:00

Do HTTP(s) streaming by ourselves instead of passing the URL to phonon

This commit is contained in:
Uwe L. Korn
2013-08-31 18:07:47 +02:00
parent f9005f58c5
commit aa740b191f
4 changed files with 29 additions and 13 deletions

View File

@@ -639,8 +639,7 @@ AudioEngine::loadTrack( const Tomahawk::result_ptr& result )
setCurrentTrack( result );
if ( !TomahawkUtils::isHttpResult( d->currentTrack->url() ) &&
!TomahawkUtils::isLocalResult( d->currentTrack->url() ) )
if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) )
{
boost::function< void ( QSharedPointer< QIODevice >& ) > callback =
boost::bind( &AudioEngine::performLoadTrack, this, result, _1 );
@@ -661,9 +660,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe
bool err = false;
{
if ( !TomahawkUtils::isHttpResult( d->currentTrack->url() ) &&
!TomahawkUtils::isLocalResult( d->currentTrack->url() ) &&
( !io || io.isNull() ) )
if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) && ( !io || io.isNull() ) )
{
tLog() << "Error getting iodevice for" << result->url();
err = true;
@@ -675,8 +672,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe
d->state = Loading;
emit loading( d->currentTrack );
if ( !TomahawkUtils::isHttpResult( d->currentTrack->url() ) &&
!TomahawkUtils::isLocalResult( d->currentTrack->url() ) )
if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) )
{
if ( QNetworkReply* qnr_io = qobject_cast< QNetworkReply* >( io.data() ) )
d->mediaObject->setCurrentSource( new QNR_IODeviceStream( qnr_io, this ) );
@@ -686,6 +682,9 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe
}
else
{
/*
* TODO: Do we need this anymore as we now do HTTP streaming ourselves?
* Maybe this can be useful for letting phonon do other protocols?
if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) )
{
QUrl furl = d->currentTrack->url();
@@ -698,7 +697,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe
tLog( LOGVERBOSE ) << "Passing to Phonon:" << furl;
d->mediaObject->setCurrentSource( furl );
}
else
else*/
{
QString furl = d->currentTrack->url();
if ( furl.startsWith( "file://" ) )

View File

@@ -35,6 +35,7 @@
#include "utils/TomahawkUtils.h"
#include "utils/Logger.h"
#include "utils/NetworkAccessManager.h"
#include "utils/NetworkReply.h"
#include "Connection.h"
#include "ControlConnection.h"
@@ -62,6 +63,7 @@ Q_DECLARE_METATYPE( QList< SipInfo > )
Q_DECLARE_METATYPE( Connection* )
Q_DECLARE_METATYPE( QTcpSocketExtra* )
Q_DECLARE_METATYPE( Tomahawk::peerinfo_ptr )
Q_DECLARE_METATYPE( IODeviceCallback )
using namespace Tomahawk;
@@ -1402,10 +1404,20 @@ Servent::httpIODeviceFactory( const Tomahawk::result_ptr& result,
boost::function< void ( QSharedPointer< QIODevice >& ) > callback )
{
QNetworkRequest req( result->url() );
QNetworkReply* reply = Tomahawk::Utils::nam()->get( req );
// Follow HTTP Redirects
NetworkReply* reply = new NetworkReply( Tomahawk::Utils::nam()->get( req ) );
qRegisterMetaType<NetworkReply*>("NetworkReply*");
qRegisterMetaType<IODeviceCallback>("IODeviceCallback");
NewClosure( reply, SIGNAL( finished() ),
this, SLOT( httpIODeviceReady( NetworkReply*, IODeviceCallback ) ),
reply, callback );
}
void
Servent::httpIODeviceReady( NetworkReply* reply, IODeviceCallback callback )
{
//boost::functions cannot accept temporaries as parameters
QSharedPointer< QIODevice > sp = QSharedPointer< QIODevice >( reply, &QObject::deleteLater );
QSharedPointer< QIODevice > sp = QSharedPointer< QIODevice >( reply->reply(), &QObject::deleteLater );
callback( sp );
}

View File

@@ -36,13 +36,14 @@
class Connection;
class Connector;
class ControlConnection;
class StreamConnection;
class NetworkReply;
class PeerInfo;
class PortFwdThread;
class ProxyConnection;
class QTcpSocketExtra;
class RemoteCollectionConnection;
class PortFwdThread;
class PeerInfo;
class SipInfo;
class StreamConnection;
namespace boost
{
@@ -51,6 +52,7 @@ namespace boost
typedef boost::function< void( const Tomahawk::result_ptr&,
boost::function< void( QSharedPointer< QIODevice >& ) > )> IODeviceFactoryFunc;
typedef boost::function< void ( QSharedPointer< QIODevice >& ) > IODeviceCallback;
class ServentPrivate;
@@ -162,6 +164,7 @@ public slots:
void triggerDBSync();
void onSipInfoChanged();
void httpIODeviceReady( NetworkReply* reply, IODeviceCallback callback );
private slots:
void deleteLazyOffer( const QString& key );

View File

@@ -61,4 +61,6 @@ private:
QUrl m_url;
};
Q_DECLARE_METATYPE( QSharedPointer<NetworkReply> )
#endif // NETWORKREPLY_H