diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-01-13 17:38:52 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-01-13 17:38:52 +0000 |
| commit | 9783fa786d3c7b0da869bd09747483ea149b6e91 (patch) | |
| tree | 6b76966022d2c26b47d7e803337f476520f5ee61 | |
| parent | 261ba82130d9c624a3212ff0a6059bb97a4c2b51 (diff) | |
| download | qmmp-9783fa786d3c7b0da869bd09747483ea149b6e91.tar.gz qmmp-9783fa786d3c7b0da869bd09747483ea149b6e91.tar.bz2 qmmp-9783fa786d3c7b0da869bd09747483ea149b6e91.zip | |
added file loader optimization
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@4691 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/qmmpui/fileloader.cpp | 114 | ||||
| -rw-r--r-- | src/qmmpui/fileloader_p.h | 15 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.cpp | 19 | ||||
| -rw-r--r-- | src/qmmpui/playlistmodel.h | 2 |
4 files changed, 101 insertions, 49 deletions
diff --git a/src/qmmpui/fileloader.cpp b/src/qmmpui/fileloader.cpp index 1199cb4cf..ec5be6138 100644 --- a/src/qmmpui/fileloader.cpp +++ b/src/qmmpui/fileloader.cpp @@ -20,6 +20,7 @@ #include <qmmp/metadatamanager.h> #include <QRegExp> +#include <QMetaType> #include "fileloader_p.h" #include "qmmpuisettings.h" #include "playlistitem.h" @@ -27,32 +28,31 @@ FileLoader::FileLoader(QObject *parent) : QThread(parent) { + qRegisterMetaType<QList<PlayListTrack*> >("QList<PlayListTrack*>"); m_settings = QmmpUiSettings::instance(); m_finished = false; + m_use_meta = false; } FileLoader::~FileLoader() {} -void FileLoader::addFile(const QString &path, PlayListItem *before) +QList<PlayListTrack *> FileLoader::processFile(const QString &path) { - bool use_meta = m_settings->useMetadata(); - QList <FileInfo *> playList = MetaDataManager::instance()->createPlayList(path, use_meta); - if(before) - { - foreach(FileInfo *info, playList) - emit newTrackToInsert(before, new PlayListTrack(info)); - } - else + QList<PlayListTrack *> tracks; + QList <FileInfo *> infoList = MetaDataManager::instance()->createPlayList(path, m_use_meta); + + foreach (FileInfo *info, infoList) { - foreach(FileInfo *info, playList) - emit newTrackToAdd(new PlayListTrack(info)); + tracks.append(new PlayListTrack(info)); } - qDeleteAll(playList); + qDeleteAll(infoList); + return tracks; } void FileLoader::addDirectory(const QString& s, PlayListItem *before) { + QList<PlayListTrack *> tracks; QDir dir(s); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Name); @@ -60,28 +60,57 @@ void FileLoader::addDirectory(const QString& s, PlayListItem *before) foreach(QFileInfo info, l) { if(checkRestrictFilters(info) && checkExcludeFilters(info)) - addFile(info.absoluteFilePath (), before); - if (m_finished) return; + tracks.append(processFile(info.absoluteFilePath ())); + + if (m_finished) + { + qDeleteAll(tracks); + tracks.clear(); + return; + } + + if(tracks.count() > 20) //do not send more then 20 tracks at once + { + emit newTracksToInsert(before, tracks); + tracks.clear(); + } } + + if(!tracks.isEmpty()) + { + emit newTracksToInsert(before, tracks); + } + dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); dir.setSorting(QDir::Name); l.clear(); l = dir.entryInfoList(); - if (l.size() > 0) - for (int i = 0; i < l.size(); ++i) - { - QFileInfo fileInfo = l.at(i); - addDirectory(fileInfo.absoluteFilePath (), before); - if (m_finished) return; - } + + for (int i = 0; i < l.size(); ++i) + { + QFileInfo fileInfo = l.at(i); + addDirectory(fileInfo.absoluteFilePath (), before); + if (m_finished) + return; + } } void FileLoader::run() { m_finished = false; - while(!m_tasks.isEmpty() && !m_finished) + m_mutex.lock(); + if(m_tasks.isEmpty()) { + m_mutex.unlock(); + return; + } + m_mutex.unlock(); + + while(!m_finished) + { + m_mutex.lock(); LoaderTask i = m_tasks.dequeue(); + m_mutex.unlock(); PlayListItem *before = i.before; QString path = i.path; @@ -90,33 +119,35 @@ void FileLoader::run() if(info.isDir()) { addDirectory(path, before); - continue; + } else if(info.isFile() || path.contains("://")) { - addFile(path, before); - continue; + QList<PlayListTrack *> tracks = processFile(path); + if(!tracks.isEmpty()) + { + emit newTracksToInsert(before, tracks); + } } + + m_mutex.lock(); + if(m_tasks.isEmpty()) + { + m_mutex.unlock(); + break; + } + m_mutex.unlock(); } } void FileLoader::add(const QString &path) { - add(QStringList() << path); + insert(0, QStringList() << path); } void FileLoader::add(const QStringList &paths) { - foreach (QString path, paths) - { - LoaderTask task; - task.before = 0; - task.path = path; - m_tasks.append(task); - } - MetaDataManager::instance()->prepareForAnotherThread(); - m_filters = MetaDataManager::instance()->nameFilters(); - start(QThread::IdlePriority); + insert(0, paths); } void FileLoader::insert(PlayListItem *before, const QString &path) @@ -126,6 +157,7 @@ void FileLoader::insert(PlayListItem *before, const QString &path) void FileLoader::insert(PlayListItem *before, const QStringList &paths) { + m_mutex.lock(); foreach (QString path, paths) { LoaderTask task; @@ -133,8 +165,14 @@ void FileLoader::insert(PlayListItem *before, const QStringList &paths) task.path = path; m_tasks.append(task); } - MetaDataManager::instance()->prepareForAnotherThread(); - m_filters = MetaDataManager::instance()->nameFilters(); + m_mutex.unlock(); + + if(!isRunning()) + { + MetaDataManager::instance()->prepareForAnotherThread(); + m_filters = MetaDataManager::instance()->nameFilters(); + m_use_meta = m_settings->useMetadata(); + } start(QThread::IdlePriority); } diff --git a/src/qmmpui/fileloader_p.h b/src/qmmpui/fileloader_p.h index 11bc1a0bd..d38163e03 100644 --- a/src/qmmpui/fileloader_p.h +++ b/src/qmmpui/fileloader_p.h @@ -24,6 +24,7 @@ #include <QDir> #include <QQueue> #include <QFileInfo> +#include <QMutex> #include <QThread> class PlayListTrack; @@ -70,15 +71,14 @@ public: signals: /*! - * Emitted when new playlist track is available. - * @param item Pointer of the new PlayListTrack object. + * Emitted when new playlist tracks are available. + * @param tracks List of the pointers to the \b PlayListTrack objects. */ - void newTrackToAdd(PlayListTrack *track); - void newTrackToInsert(PlayListItem *before, PlayListTrack *track); + void newTracksToInsert(PlayListItem *before, QList<PlayListTrack *> tracks); private: - virtual void run(); - void addFile(const QString &path, PlayListItem *before = 0); + void run(); + QList<PlayListTrack*> processFile(const QString &path); void addDirectory(const QString &s, PlayListItem *before = 0); bool checkRestrictFilters(const QFileInfo &info); bool checkExcludeFilters(const QFileInfo &info); @@ -91,6 +91,9 @@ private: QStringList m_filters; QmmpUiSettings *m_settings; bool m_finished; + bool m_use_meta; + QMutex m_mutex; + }; #endif diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp index 41297b0a3..660924175 100644 --- a/src/qmmpui/playlistmodel.cpp +++ b/src/qmmpui/playlistmodel.cpp @@ -58,10 +58,8 @@ PlayListModel::PlayListModel(const QString &name, QObject *parent) m_play_state = new NormalPlayState(this); connect(m_ui_settings, SIGNAL(groupsChanged(bool)), SLOT(prepareGroups(bool))); connect(m_ui_settings, SIGNAL(shuffleChanged(bool)), SLOT(prepareForShufflePlaying(bool))); - connect(m_loader, SIGNAL(newTrackToAdd(PlayListTrack*)), - SLOT(add(PlayListTrack*)), Qt::QueuedConnection); - connect(m_loader, SIGNAL(newTrackToInsert(PlayListItem*, PlayListTrack*)), - SLOT(insert(PlayListItem*, PlayListTrack*)), Qt::QueuedConnection); + connect(m_loader, SIGNAL(newTracksToInsert(PlayListItem*, QList<PlayListTrack*>)), + SLOT(insert(PlayListItem*, QList<PlayListTrack*>)), Qt::QueuedConnection); connect(m_loader, SIGNAL(finished()), SLOT(preparePlayState())); connect(m_loader, SIGNAL(finished()), SIGNAL(loaderFinished())); connect(m_task, SIGNAL(finished()), SLOT(onTaskFinished())); @@ -191,7 +189,10 @@ void PlayListModel::insert(int index, PlayListTrack *track) void PlayListModel::insert(PlayListItem *before, PlayListTrack *track) { - insert(m_container->indexOf(before), track); + if(before) + insert(m_container->indexOf(before), track); + else + add(track); } void PlayListModel::insert(int index, QList<PlayListTrack *> tracks) @@ -223,6 +224,14 @@ void PlayListModel::insert(int index, QList<PlayListTrack *> tracks) emit listChanged(flags); } +void PlayListModel::insert(PlayListItem *before, QList<PlayListTrack *> tracks) +{ + if(before) + insert(m_container->indexOf(before), tracks); + else + add(tracks); +} + void PlayListModel::insert(int index, const QString &path) { insert(index, QStringList() << path); diff --git a/src/qmmpui/playlistmodel.h b/src/qmmpui/playlistmodel.h index 20f29977b..71debbe93 100644 --- a/src/qmmpui/playlistmodel.h +++ b/src/qmmpui/playlistmodel.h @@ -367,6 +367,8 @@ public slots: * Inserts \b tracks at index position \b index in the playlist. */ void insert(int index, QList <PlayListTrack *> tracks); + + void insert(PlayListItem *before, QList <PlayListTrack *> tracks); /*! * Inserts file or directory at index position \b index in the playlist. * @param path Full path of file or directory. |
