diff --git a/src/libtomahawk/audio/AudioEngine.cpp b/src/libtomahawk/audio/AudioEngine.cpp index 7f4faef75..83ce54f71 100644 --- a/src/libtomahawk/audio/AudioEngine.cpp +++ b/src/libtomahawk/audio/AudioEngine.cpp @@ -840,9 +840,11 @@ AudioEngine::loadNextTrack() void AudioEngine::play( const QUrl& url ) { + Q_D( AudioEngine ); + tDebug() << Q_FUNC_INFO << url; - const QVariantMap tags = MusicScanner::readTags( QFileInfo( url.toLocalFile() ) ).toMap(); + const QVariantMap tags = MusicScanner::readTags( QFileInfo( url.toLocalFile() ), d->audioOutput->vlcInstance() ).toMap(); track_ptr t; if ( !tags.isEmpty() ) diff --git a/src/libtomahawk/filemetadata/MusicScanner.cpp b/src/libtomahawk/filemetadata/MusicScanner.cpp index 6b86ecc2a..7a419a53f 100644 --- a/src/libtomahawk/filemetadata/MusicScanner.cpp +++ b/src/libtomahawk/filemetadata/MusicScanner.cpp @@ -35,6 +35,9 @@ #include "config.h" +#include +#include + using namespace Tomahawk; void @@ -131,7 +134,7 @@ DirListerThreadController::run() } -MusicScanner::MusicScanner( MusicScanner::ScanMode scanMode, const QStringList& paths, quint32 bs ) +MusicScanner::MusicScanner( MusicScanner::ScanMode scanMode, const QStringList& paths, libvlc_instance_t* pVlcInstance, quint32 bs ) : QObject() , m_scanMode( scanMode ) , m_paths( paths ) @@ -140,8 +143,11 @@ MusicScanner::MusicScanner( MusicScanner::ScanMode scanMode, const QStringList& , m_verbose( false ) , m_cmdQueue( 0 ) , m_batchsize( bs ) + , m_vlcInstance( pVlcInstance ) , m_dirListerThreadController( 0 ) { + // We keep a strong reference to the libvlc instance here + libvlc_retain( m_vlcInstance ); } @@ -157,6 +163,8 @@ MusicScanner::~MusicScanner() delete m_dirListerThreadController; m_dirListerThreadController = 0; } + + libvlc_release( m_vlcInstance ); } @@ -451,7 +459,7 @@ MusicScanner::readTags( const QFileInfo& fi ) QVariant MusicScanner::readFile( const QFileInfo& fi ) { - const QVariant m = readTags( fi ); + const QVariant m = readTags( fi, m_vlcInstance ); if ( m_scanned ) if ( m_scanned % 3 == 0 ) diff --git a/src/libtomahawk/filemetadata/MusicScanner.h b/src/libtomahawk/filemetadata/MusicScanner.h index cf3e8c085..a896eca7b 100644 --- a/src/libtomahawk/filemetadata/MusicScanner.h +++ b/src/libtomahawk/filemetadata/MusicScanner.h @@ -39,6 +39,8 @@ #include #include +struct libvlc_instance_t; + // descend dir tree comparing dir mtimes to last known mtime // emit signal for any dir with new content, so we can scan it. // finally, emit the list of new mtimes we observed. @@ -103,9 +105,9 @@ public: enum ScanMode { DirScan, FileScan }; enum ScanType { None, Full, Normal, File }; - static QVariant readTags( const QFileInfo& fi ); + static QVariant readTags( const QFileInfo& fi, libvlc_instance_t* vlcInstance ); - MusicScanner( MusicScanner::ScanMode scanMode, const QStringList& paths, quint32 bs = 0 ); + MusicScanner( MusicScanner::ScanMode scanMode, const QStringList& paths, libvlc_instance_t* pVlcInstance, quint32 bs = 0 ); ~MusicScanner(); /** @@ -163,6 +165,7 @@ private: QVariantList m_scannedfiles; QVariantList m_filesToDelete; quint32 m_batchsize; + libvlc_instance_t* m_vlcInstance; DirListerThreadController* m_dirListerThreadController; }; diff --git a/src/libtomahawk/filemetadata/ScanManager.cpp b/src/libtomahawk/filemetadata/ScanManager.cpp index c75a2ed7e..d1afaa5ba 100644 --- a/src/libtomahawk/filemetadata/ScanManager.cpp +++ b/src/libtomahawk/filemetadata/ScanManager.cpp @@ -35,11 +35,14 @@ #include #include +#include + using namespace Tomahawk; -MusicScannerThreadController::MusicScannerThreadController( QObject* parent ) +MusicScannerThreadController::MusicScannerThreadController( libvlc_instance_t* vlcInstance, QObject* parent ) : QThread( parent ) , m_bs( 0 ) + , m_vlcInstance( vlcInstance ) { tDebug() << Q_FUNC_INFO; } @@ -54,7 +57,7 @@ MusicScannerThreadController::~MusicScannerThreadController() void MusicScannerThreadController::run() { - m_musicScanner = QPointer< MusicScanner >( new MusicScanner( m_mode, m_paths, m_bs ) ); + m_musicScanner = QPointer< MusicScanner >( new MusicScanner( m_mode, m_paths, m_vlcInstance, m_bs ) ); connect( m_musicScanner.data(), SIGNAL( finished() ), parent(), SLOT( scannerFinished() ), Qt::QueuedConnection ); connect( m_musicScanner.data(), SIGNAL( progress( unsigned int ) ), parent(), SIGNAL( progress( unsigned int ) ), Qt::QueuedConnection ); QMetaObject::invokeMethod( m_musicScanner.data(), "startScan", Qt::QueuedConnection ); @@ -76,11 +79,12 @@ ScanManager::instance() } -ScanManager::ScanManager( QObject* parent ) +ScanManager::ScanManager( QObject* parent, libvlc_instance_t* pVlcInstance ) : QObject( parent ) , m_musicScannerThreadController( 0 ) , m_currScannerPaths() , m_cachedScannerDirs() + , m_vlcInstance( pVlcInstance ) , m_queuedScanType( MusicScanner::None ) , m_updateGUI( true ) { @@ -201,7 +205,7 @@ ScanManager::runNormalScan( bool manualFull ) } m_scanTimer->stop(); - m_musicScannerThreadController = new MusicScannerThreadController( this ); + m_musicScannerThreadController = new MusicScannerThreadController( m_vlcInstance, this ); m_currScanMode = MusicScanner::DirScan; if ( manualFull ) @@ -248,7 +252,7 @@ ScanManager::runFileScan( const QStringList& paths, bool updateGUI ) } m_scanTimer->stop(); - m_musicScannerThreadController = new MusicScannerThreadController( this ); + m_musicScannerThreadController = new MusicScannerThreadController( m_vlcInstance, this ); m_currScanMode = MusicScanner::FileScan; m_updateGUI = updateGUI; diff --git a/src/libtomahawk/filemetadata/ScanManager.h b/src/libtomahawk/filemetadata/ScanManager.h index 24c60bb18..fd3bf215c 100644 --- a/src/libtomahawk/filemetadata/ScanManager.h +++ b/src/libtomahawk/filemetadata/ScanManager.h @@ -33,6 +33,8 @@ #include #include +struct libvlc_instance_t; + class QFileSystemWatcher; class QTimer; @@ -41,7 +43,7 @@ class MusicScannerThreadController : public QThread Q_OBJECT public: - MusicScannerThreadController( QObject* parent ); + MusicScannerThreadController( libvlc_instance_t* vlcInstance, QObject* parent ); virtual ~MusicScannerThreadController(); void setScanMode( MusicScanner::ScanMode mode ) { m_mode = mode; } @@ -53,6 +55,7 @@ private: MusicScanner::ScanMode m_mode; QStringList m_paths; quint32 m_bs; + libvlc_instance_t* m_vlcInstance; }; @@ -63,7 +66,7 @@ Q_OBJECT public: static ScanManager* instance(); - explicit ScanManager( QObject* parent = 0 ); + explicit ScanManager( QObject* parent, libvlc_instance_t* vlcInstance ); virtual ~ScanManager(); void init(); @@ -97,6 +100,7 @@ private: MusicScannerThreadController* m_musicScannerThreadController; QSet< QString > m_currScannerPaths; QStringList m_cachedScannerDirs; + libvlc_instance_t* m_vlcInstance; QTimer* m_scanTimer; MusicScanner::ScanType m_queuedScanType; diff --git a/src/tomahawk/TomahawkApp.cpp b/src/tomahawk/TomahawkApp.cpp index 014701908..f10980a95 100644 --- a/src/tomahawk/TomahawkApp.cpp +++ b/src/tomahawk/TomahawkApp.cpp @@ -54,6 +54,7 @@ //#include "accounts/spotify/SpotifyPlaylistUpdater.h" #include "accounts/AccountManager.h" #include "audio/AudioEngine.h" +#include "audio/AudioOutput.h" #include "database/Database.h" #include "database/DatabaseCollection.h" #include "database/DatabaseCommand_CollectionStats.h" @@ -630,7 +631,7 @@ TomahawkApp::onInfoSystemReady() Echonest::Config::instance()->setNetworkAccessManager( Tomahawk::Utils::nam() ); EchonestGenerator::setupCatalogs(); - m_scanManager = QPointer( new ScanManager( this ) ); + m_scanManager = QPointer( new ScanManager( this, AudioOutput::instance()->vlcInstance() ) ); if ( !m_headless ) { tDebug() << "Init MainWindow."; diff --git a/src/tools/tomahawk-test-musicscan/main.cpp b/src/tools/tomahawk-test-musicscan/main.cpp index ccf48f54c..c1481a6d8 100644 --- a/src/tools/tomahawk-test-musicscan/main.cpp +++ b/src/tools/tomahawk-test-musicscan/main.cpp @@ -5,6 +5,8 @@ #include +#include "libtomahawk/audio/AudioOutput.h" + void usage() { @@ -33,7 +35,13 @@ main( int argc, char* argv[] ) if ( pathInfo.isFile() ) { - qDebug() << MusicScanner::readTags( pathInfo ); + // Start VLC instance + AudioOutput* ao = new AudioOutput(); + + qDebug() << MusicScanner::readTags( pathInfo, ao->vlcInstance() ); + + // Close AudioOutput again + delete ao; } else if ( pathInfo.isDir() ) { @@ -41,10 +49,13 @@ main( int argc, char* argv[] ) qRegisterMetaType< QDir >( "QDir" ); qRegisterMetaType< QFileInfo >( "QFileInfo" ); + // Start VLC instance + AudioOutput* ao = new AudioOutput(); + // Create the MusicScanner instance QStringList paths; paths << pathInfo.canonicalFilePath(); - MusicScanner scanner( MusicScanner::DirScan, paths, 0 ); + MusicScanner scanner( MusicScanner::DirScan, paths, ao->vlcInstance() ); // We want a dry-run of the scanner and not update any internal data. scanner.setDryRun( true ); @@ -61,6 +72,9 @@ main( int argc, char* argv[] ) // Wait until the scanner has done its work. scannerThread.wait(); + + // Close AudioOutput again + delete ao; } else {