1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-18 03:41:27 +02:00

Pass libvlc instance to MusicScanner

This commit is contained in:
Uwe L. Korn
2014-11-30 18:09:11 +01:00
parent bebacfad91
commit b59bedae6e
7 changed files with 51 additions and 15 deletions

View File

@@ -840,9 +840,11 @@ AudioEngine::loadNextTrack()
void void
AudioEngine::play( const QUrl& url ) AudioEngine::play( const QUrl& url )
{ {
Q_D( AudioEngine );
tDebug() << Q_FUNC_INFO << url; 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; track_ptr t;
if ( !tags.isEmpty() ) if ( !tags.isEmpty() )

View File

@@ -35,6 +35,9 @@
#include "config.h" #include "config.h"
#include <vlc/libvlc.h>
#include <vlc/libvlc_media.h>
using namespace Tomahawk; using namespace Tomahawk;
void 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() : QObject()
, m_scanMode( scanMode ) , m_scanMode( scanMode )
, m_paths( paths ) , m_paths( paths )
@@ -140,8 +143,11 @@ MusicScanner::MusicScanner( MusicScanner::ScanMode scanMode, const QStringList&
, m_verbose( false ) , m_verbose( false )
, m_cmdQueue( 0 ) , m_cmdQueue( 0 )
, m_batchsize( bs ) , m_batchsize( bs )
, m_vlcInstance( pVlcInstance )
, m_dirListerThreadController( 0 ) , 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; delete m_dirListerThreadController;
m_dirListerThreadController = 0; m_dirListerThreadController = 0;
} }
libvlc_release( m_vlcInstance );
} }
@@ -451,7 +459,7 @@ MusicScanner::readTags( const QFileInfo& fi )
QVariant QVariant
MusicScanner::readFile( const QFileInfo& fi ) MusicScanner::readFile( const QFileInfo& fi )
{ {
const QVariant m = readTags( fi ); const QVariant m = readTags( fi, m_vlcInstance );
if ( m_scanned ) if ( m_scanned )
if ( m_scanned % 3 == 0 ) if ( m_scanned % 3 == 0 )

View File

@@ -39,6 +39,8 @@
#include <QTimer> #include <QTimer>
#include <QVariantMap> #include <QVariantMap>
struct libvlc_instance_t;
// descend dir tree comparing dir mtimes to last known mtime // descend dir tree comparing dir mtimes to last known mtime
// emit signal for any dir with new content, so we can scan it. // emit signal for any dir with new content, so we can scan it.
// finally, emit the list of new mtimes we observed. // finally, emit the list of new mtimes we observed.
@@ -103,9 +105,9 @@ public:
enum ScanMode { DirScan, FileScan }; enum ScanMode { DirScan, FileScan };
enum ScanType { None, Full, Normal, File }; 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(); ~MusicScanner();
/** /**
@@ -163,6 +165,7 @@ private:
QVariantList m_scannedfiles; QVariantList m_scannedfiles;
QVariantList m_filesToDelete; QVariantList m_filesToDelete;
quint32 m_batchsize; quint32 m_batchsize;
libvlc_instance_t* m_vlcInstance;
DirListerThreadController* m_dirListerThreadController; DirListerThreadController* m_dirListerThreadController;
}; };

View File

@@ -35,11 +35,14 @@
#include <QTimer> #include <QTimer>
#include <QSet> #include <QSet>
#include <vlc/libvlc.h>
using namespace Tomahawk; using namespace Tomahawk;
MusicScannerThreadController::MusicScannerThreadController( QObject* parent ) MusicScannerThreadController::MusicScannerThreadController( libvlc_instance_t* vlcInstance, QObject* parent )
: QThread( parent ) : QThread( parent )
, m_bs( 0 ) , m_bs( 0 )
, m_vlcInstance( vlcInstance )
{ {
tDebug() << Q_FUNC_INFO; tDebug() << Q_FUNC_INFO;
} }
@@ -54,7 +57,7 @@ MusicScannerThreadController::~MusicScannerThreadController()
void void
MusicScannerThreadController::run() 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( finished() ), parent(), SLOT( scannerFinished() ), Qt::QueuedConnection );
connect( m_musicScanner.data(), SIGNAL( progress( unsigned int ) ), parent(), SIGNAL( progress( unsigned int ) ), 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 ); 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 ) : QObject( parent )
, m_musicScannerThreadController( 0 ) , m_musicScannerThreadController( 0 )
, m_currScannerPaths() , m_currScannerPaths()
, m_cachedScannerDirs() , m_cachedScannerDirs()
, m_vlcInstance( pVlcInstance )
, m_queuedScanType( MusicScanner::None ) , m_queuedScanType( MusicScanner::None )
, m_updateGUI( true ) , m_updateGUI( true )
{ {
@@ -201,7 +205,7 @@ ScanManager::runNormalScan( bool manualFull )
} }
m_scanTimer->stop(); m_scanTimer->stop();
m_musicScannerThreadController = new MusicScannerThreadController( this ); m_musicScannerThreadController = new MusicScannerThreadController( m_vlcInstance, this );
m_currScanMode = MusicScanner::DirScan; m_currScanMode = MusicScanner::DirScan;
if ( manualFull ) if ( manualFull )
@@ -248,7 +252,7 @@ ScanManager::runFileScan( const QStringList& paths, bool updateGUI )
} }
m_scanTimer->stop(); m_scanTimer->stop();
m_musicScannerThreadController = new MusicScannerThreadController( this ); m_musicScannerThreadController = new MusicScannerThreadController( m_vlcInstance, this );
m_currScanMode = MusicScanner::FileScan; m_currScanMode = MusicScanner::FileScan;
m_updateGUI = updateGUI; m_updateGUI = updateGUI;

View File

@@ -33,6 +33,8 @@
#include <QSet> #include <QSet>
#include <QThread> #include <QThread>
struct libvlc_instance_t;
class QFileSystemWatcher; class QFileSystemWatcher;
class QTimer; class QTimer;
@@ -41,7 +43,7 @@ class MusicScannerThreadController : public QThread
Q_OBJECT Q_OBJECT
public: public:
MusicScannerThreadController( QObject* parent ); MusicScannerThreadController( libvlc_instance_t* vlcInstance, QObject* parent );
virtual ~MusicScannerThreadController(); virtual ~MusicScannerThreadController();
void setScanMode( MusicScanner::ScanMode mode ) { m_mode = mode; } void setScanMode( MusicScanner::ScanMode mode ) { m_mode = mode; }
@@ -53,6 +55,7 @@ private:
MusicScanner::ScanMode m_mode; MusicScanner::ScanMode m_mode;
QStringList m_paths; QStringList m_paths;
quint32 m_bs; quint32 m_bs;
libvlc_instance_t* m_vlcInstance;
}; };
@@ -63,7 +66,7 @@ Q_OBJECT
public: public:
static ScanManager* instance(); static ScanManager* instance();
explicit ScanManager( QObject* parent = 0 ); explicit ScanManager( QObject* parent, libvlc_instance_t* vlcInstance );
virtual ~ScanManager(); virtual ~ScanManager();
void init(); void init();
@@ -97,6 +100,7 @@ private:
MusicScannerThreadController* m_musicScannerThreadController; MusicScannerThreadController* m_musicScannerThreadController;
QSet< QString > m_currScannerPaths; QSet< QString > m_currScannerPaths;
QStringList m_cachedScannerDirs; QStringList m_cachedScannerDirs;
libvlc_instance_t* m_vlcInstance;
QTimer* m_scanTimer; QTimer* m_scanTimer;
MusicScanner::ScanType m_queuedScanType; MusicScanner::ScanType m_queuedScanType;

View File

@@ -54,6 +54,7 @@
//#include "accounts/spotify/SpotifyPlaylistUpdater.h" //#include "accounts/spotify/SpotifyPlaylistUpdater.h"
#include "accounts/AccountManager.h" #include "accounts/AccountManager.h"
#include "audio/AudioEngine.h" #include "audio/AudioEngine.h"
#include "audio/AudioOutput.h"
#include "database/Database.h" #include "database/Database.h"
#include "database/DatabaseCollection.h" #include "database/DatabaseCollection.h"
#include "database/DatabaseCommand_CollectionStats.h" #include "database/DatabaseCommand_CollectionStats.h"
@@ -630,7 +631,7 @@ TomahawkApp::onInfoSystemReady()
Echonest::Config::instance()->setNetworkAccessManager( Tomahawk::Utils::nam() ); Echonest::Config::instance()->setNetworkAccessManager( Tomahawk::Utils::nam() );
EchonestGenerator::setupCatalogs(); EchonestGenerator::setupCatalogs();
m_scanManager = QPointer<ScanManager>( new ScanManager( this ) ); m_scanManager = QPointer<ScanManager>( new ScanManager( this, AudioOutput::instance()->vlcInstance() ) );
if ( !m_headless ) if ( !m_headless )
{ {
tDebug() << "Init MainWindow."; tDebug() << "Init MainWindow.";

View File

@@ -5,6 +5,8 @@
#include <iostream> #include <iostream>
#include "libtomahawk/audio/AudioOutput.h"
void void
usage() usage()
{ {
@@ -33,7 +35,13 @@ main( int argc, char* argv[] )
if ( pathInfo.isFile() ) 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() ) else if ( pathInfo.isDir() )
{ {
@@ -41,10 +49,13 @@ main( int argc, char* argv[] )
qRegisterMetaType< QDir >( "QDir" ); qRegisterMetaType< QDir >( "QDir" );
qRegisterMetaType< QFileInfo >( "QFileInfo" ); qRegisterMetaType< QFileInfo >( "QFileInfo" );
// Start VLC instance
AudioOutput* ao = new AudioOutput();
// Create the MusicScanner instance // Create the MusicScanner instance
QStringList paths; QStringList paths;
paths << pathInfo.canonicalFilePath(); 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. // We want a dry-run of the scanner and not update any internal data.
scanner.setDryRun( true ); scanner.setDryRun( true );
@@ -61,6 +72,9 @@ main( int argc, char* argv[] )
// Wait until the scanner has done its work. // Wait until the scanner has done its work.
scannerThread.wait(); scannerThread.wait();
// Close AudioOutput again
delete ao;
} }
else else
{ {