aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-01-13 17:38:52 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-01-13 17:38:52 +0000
commit9783fa786d3c7b0da869bd09747483ea149b6e91 (patch)
tree6b76966022d2c26b47d7e803337f476520f5ee61
parent261ba82130d9c624a3212ff0a6059bb97a4c2b51 (diff)
downloadqmmp-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.cpp114
-rw-r--r--src/qmmpui/fileloader_p.h15
-rw-r--r--src/qmmpui/playlistmodel.cpp19
-rw-r--r--src/qmmpui/playlistmodel.h2
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.