mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-09-14 07:52:05 +02:00
Compare commits
5 Commits
scriptolle
...
vlc-meta-r
Author | SHA1 | Date | |
---|---|---|---|
|
f2ab6fdc33 | ||
|
81e9c9eb64 | ||
|
8da198eea2 | ||
|
a65492edd3 | ||
|
b59bedae6e |
@@ -22,15 +22,6 @@ find_library(LIBVLCCORE_LIBRARY NAMES vlccore libvlccore
|
|||||||
|
|
||||||
set(LIBVLC_VERSION ${PC_LIBVLC_VERSION})
|
set(LIBVLC_VERSION ${PC_LIBVLC_VERSION})
|
||||||
|
|
||||||
include(CheckCXXSourceCompiles)
|
|
||||||
check_cxx_source_compiles("
|
|
||||||
#include <vlc/libvlc.h>
|
|
||||||
#include <vlc/libvlc_media.h>
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
libvlc_meta_t meta = libvlc_meta_AlbumArtist;
|
|
||||||
}"
|
|
||||||
HAVE_VLC_ALBUMARTIST)
|
|
||||||
|
|
||||||
find_package_handle_standard_args(LibVLC
|
find_package_handle_standard_args(LibVLC
|
||||||
REQUIRED_VARS LIBVLC_LIBRARY LIBVLCCORE_LIBRARY LIBVLC_INCLUDE_DIR
|
REQUIRED_VARS LIBVLC_LIBRARY LIBVLCCORE_LIBRARY LIBVLC_INCLUDE_DIR
|
||||||
VERSION_VAR LIBVLC_VERSION
|
VERSION_VAR LIBVLC_VERSION
|
||||||
|
@@ -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() )
|
||||||
|
@@ -35,6 +35,10 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <vlc/libvlc.h>
|
||||||
|
#include <vlc/libvlc_media.h>
|
||||||
|
#include <vlc/libvlc_version.h>
|
||||||
|
|
||||||
using namespace Tomahawk;
|
using namespace Tomahawk;
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -131,7 +135,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 +144,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 +164,8 @@ MusicScanner::~MusicScanner()
|
|||||||
delete m_dirListerThreadController;
|
delete m_dirListerThreadController;
|
||||||
m_dirListerThreadController = 0;
|
m_dirListerThreadController = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libvlc_release( m_vlcInstance );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -384,13 +393,68 @@ MusicScanner::scanFile( const QFileInfo& fi )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString
|
||||||
|
vlcMetaToQString( libvlc_media_t* media, libvlc_meta_t meta )
|
||||||
|
{
|
||||||
|
char *str = libvlc_media_get_meta(media, meta);
|
||||||
|
if ( str )
|
||||||
|
{
|
||||||
|
QString qstr = QString::fromUtf8( str );
|
||||||
|
libvlc_free( str );
|
||||||
|
return qstr;
|
||||||
|
}
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
QVariant
|
QVariant
|
||||||
MusicScanner::readTags( const QFileInfo& fi )
|
MusicScanner::readTags( const QFileInfo& fi, libvlc_instance_t* vlcInstance )
|
||||||
{
|
{
|
||||||
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Parsing tags for file:" << fi.absoluteFilePath();
|
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Parsing tags for file:" << fi.absoluteFilePath();
|
||||||
|
|
||||||
const QString suffix = fi.suffix().toLower();
|
const QString suffix = fi.suffix().toLower();
|
||||||
|
const QString mimetype = TomahawkUtils::extensionToMimetype( suffix );
|
||||||
|
const QString url( "file://%1" );
|
||||||
|
|
||||||
|
QVariantMap m;
|
||||||
|
m["url"] = url.arg( fi.canonicalFilePath() );
|
||||||
|
m["mtime"] = fi.lastModified().toUTC().toTime_t();
|
||||||
|
m["size"] = (unsigned int)fi.size();
|
||||||
|
m["mimetype"] = mimetype;
|
||||||
|
|
||||||
|
#if (LIBVLC_VERSION_INT >= LIBVLC_VERSION(3, 0, 0, 0))
|
||||||
|
libvlc_media_t* media = libvlc_media_new_path( vlcInstance, fi.canonicalFilePath().toUtf8().constData() );
|
||||||
|
libvlc_media_parse( media );
|
||||||
|
|
||||||
|
m["duration"] = (qlonglong)( libvlc_media_get_duration( media ) / 1000 );
|
||||||
|
libvlc_media_track_t **tracks;
|
||||||
|
uint track_count;
|
||||||
|
if ( ( track_count = libvlc_media_tracks_get( media, &tracks ) ) > 0 )
|
||||||
|
{
|
||||||
|
// FIXME: Should we count all or just one track?
|
||||||
|
// Or only the first audio tracks?
|
||||||
|
// For most audio files we only have a single audio track.
|
||||||
|
m["bitrate"] = tracks[0]->i_bitrate / 1000;
|
||||||
|
libvlc_media_tracks_release(tracks, track_count);
|
||||||
|
}
|
||||||
|
m["artist"] = vlcMetaToQString( media, libvlc_meta_Artist );
|
||||||
|
m["album"] = vlcMetaToQString( media, libvlc_meta_Album );
|
||||||
|
m["albumartist"] = vlcMetaToQString( media, libvlc_meta_AlbumArtist );
|
||||||
|
m["track"] = vlcMetaToQString( media, libvlc_meta_Title );
|
||||||
|
m["albumpos"] = vlcMetaToQString( media, libvlc_meta_TrackNumber );
|
||||||
|
m["year"] = vlcMetaToQString( media, libvlc_meta_Date );
|
||||||
|
// m["composer"] = tag->composer();
|
||||||
|
m["discnumber"] = vlcMetaToQString( media, libvlc_meta_DiscNumber );
|
||||||
|
|
||||||
|
if ( m["artist"].toString().isEmpty() || m["track"].toString().isEmpty() )
|
||||||
|
{
|
||||||
|
// Artist and track name are required.
|
||||||
|
return QVariantMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
libvlc_media_release( media );
|
||||||
|
#else
|
||||||
|
Q_UNUSED( vlcInstance );
|
||||||
|
|
||||||
if ( !TomahawkUtils::supportedExtensions().contains( suffix ) )
|
if ( !TomahawkUtils::supportedExtensions().contains( suffix ) )
|
||||||
return QVariantMap(); // invalid extension
|
return QVariantMap(); // invalid extension
|
||||||
|
|
||||||
@@ -424,14 +488,6 @@ MusicScanner::readTags( const QFileInfo& fi )
|
|||||||
if ( artist.isEmpty() || track.isEmpty() )
|
if ( artist.isEmpty() || track.isEmpty() )
|
||||||
return QVariantMap();
|
return QVariantMap();
|
||||||
|
|
||||||
const QString mimetype = TomahawkUtils::extensionToMimetype( suffix );
|
|
||||||
const QString url( "file://%1" );
|
|
||||||
|
|
||||||
QVariantMap m;
|
|
||||||
m["url"] = url.arg( fi.canonicalFilePath() );
|
|
||||||
m["mtime"] = fi.lastModified().toUTC().toTime_t();
|
|
||||||
m["size"] = (unsigned int)fi.size();
|
|
||||||
m["mimetype"] = mimetype;
|
|
||||||
m["duration"] = duration;
|
m["duration"] = duration;
|
||||||
m["bitrate"] = bitrate;
|
m["bitrate"] = bitrate;
|
||||||
m["artist"] = artist;
|
m["artist"] = artist;
|
||||||
@@ -443,6 +499,7 @@ MusicScanner::readTags( const QFileInfo& fi )
|
|||||||
m["composer"] = tag->composer();
|
m["composer"] = tag->composer();
|
||||||
m["discnumber"] = tag->discNumber();
|
m["discnumber"] = tag->discNumber();
|
||||||
m["hash"] = ""; // TODO
|
m["hash"] = ""; // TODO
|
||||||
|
#endif
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
@@ -451,7 +508,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 )
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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.";
|
||||||
|
@@ -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
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user