From 76b247cf7f7a7e14bb0d3fcaebe435db4575ce06 Mon Sep 17 00:00:00 2001 From: "craig.p.drummond" Date: Mon, 3 Mar 2014 19:31:42 +0000 Subject: [PATCH] Start locator and downloader only when needed too... --- gui/covers.cpp | 59 ++++++++++++++++++++++++++++++++++---------------- gui/covers.h | 2 ++ 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/gui/covers.cpp b/gui/covers.cpp index f5c699751..7052a8462 100644 --- a/gui/covers.cpp +++ b/gui/covers.cpp @@ -875,20 +875,12 @@ void CoverLocator::locate() Covers::Covers() : retrieved(0) , cache(300000) + , downloader(0) + , locator(0) , countResetTimer(0) { maxPerLoopIteration=Settings::self()->maxCoverUpdatePerIteration(); maxFindPerLoopIteration=Settings::self()->maxCoverFindPerIteration(); - - qRegisterMetaType("LocatedCover"); - qRegisterMetaType >("QList"); - downloader=new CoverDownloader(); - locator=new CoverLocator(); - connect(this, SIGNAL(download(Song)), downloader, SLOT(download(Song)), Qt::QueuedConnection); - connect(downloader, SIGNAL(artistImage(Song,QImage,QString)), this, SLOT(artistImageDownloaded(Song,QImage,QString)), Qt::QueuedConnection); - connect(downloader, SIGNAL(cover(Song,QImage,QString)), this, SLOT(coverDownloaded(Song,QImage,QString)), Qt::QueuedConnection); - connect(locator, SIGNAL(located(QList)), this, SLOT(located(QList)), Qt::QueuedConnection); - connect(this, SIGNAL(locate(Song)), locator, SLOT(locate(Song)), Qt::QueuedConnection); } void Covers::readConfig() @@ -900,11 +892,17 @@ void Covers::readConfig() void Covers::stop() { - disconnect(downloader, SIGNAL(artistImage(Song,QImage,QString)), this, SLOT(artistImageDownloaded(Song,QImage,QString))); - disconnect(downloader, SIGNAL(cover(Song,QImage,QString)), this, SLOT(coverDownloaded(Song,QImage,QString))); - downloader->stop(); - disconnect(locator, SIGNAL(located(QList)), this, SLOT(located(QList))); - locator->stop(); + if (downloader) { + disconnect(downloader, SIGNAL(artistImage(Song,QImage,QString)), this, SLOT(artistImageDownloaded(Song,QImage,QString))); + disconnect(downloader, SIGNAL(cover(Song,QImage,QString)), this, SLOT(coverDownloaded(Song,QImage,QString))); + downloader->stop(); + downloader=0; + } + if (locator) { + disconnect(locator, SIGNAL(located(QList)), this, SLOT(located(QList))); + locator->stop(); + locator=0; + } #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND cleanCdda(); #endif @@ -947,7 +945,7 @@ QPixmap * Covers::get(const Song &song, int size) } else { // Attempt to download cover... if (Song::OnlineSvrTrack!=song.type) { - emit download(song); + tryToDownload(song); } // Create a dummy pixmap so that we dont keep on stating files that do not exist! pix=new QPixmap(1, 1); @@ -1004,6 +1002,29 @@ void Covers::clearCache(const Song &song, const QImage &img, bool dummyEntriesOn } } +void Covers::tryToLocate(const Song &song) +{ + if (!locator) { + qRegisterMetaType("LocatedCover"); + qRegisterMetaType >("QList"); + locator=new CoverLocator(); + connect(locator, SIGNAL(located(QList)), this, SLOT(located(QList)), Qt::QueuedConnection); + connect(this, SIGNAL(locate(Song)), locator, SLOT(locate(Song)), Qt::QueuedConnection); + } + emit locate(song); +} + +void Covers::tryToDownload(const Song &song) +{ + if (!downloader) { + downloader=new CoverDownloader(); + connect(this, SIGNAL(download(Song)), downloader, SLOT(download(Song)), Qt::QueuedConnection); + connect(downloader, SIGNAL(artistImage(Song,QImage,QString)), this, SLOT(artistImageDownloaded(Song,QImage,QString)), Qt::QueuedConnection); + connect(downloader, SIGNAL(cover(Song,QImage,QString)), this, SLOT(coverDownloaded(Song,QImage,QString)), Qt::QueuedConnection); + } + emit download(song); +} + Covers::Image Covers::findImage(const Song &song, bool emitResult) { Covers::Image i=locateImage(song); @@ -1269,7 +1290,7 @@ Covers::Image Covers::requestImage(const Song &song, bool urgent) if (retrieved>=maxFindPerLoopIteration && !urgent) { currentImageRequests.insert(key); - emit locate(song); + tryToLocate(song); return Covers::Image(); } @@ -1278,7 +1299,7 @@ Covers::Image Covers::requestImage(const Song &song, bool urgent) if (img.img.isNull() && Song::OnlineSvrTrack!=song.type) { DBUG << song.file << song.artist << song.albumartist << song.album << "Need to download"; currentImageRequests.insert(key); - emit download(song); + tryToDownload(song); } // We only want to read X files per QEventLoop iteratation. The above takes care of this, and any @@ -1309,7 +1330,7 @@ void Covers::located(const QList &covers) gotAlbumCover(cvr.song, cvr.img, cvr.fileName); } } else { - emit download(cvr.song); + tryToDownload(cvr.song); } } retrieved-=covers.size(); diff --git a/gui/covers.h b/gui/covers.h index 12dc759e9..8ed14b7c2 100644 --- a/gui/covers.h +++ b/gui/covers.h @@ -216,6 +216,8 @@ private Q_SLOTS: void artistImageDownloaded(const Song &song, const QImage &img, const QString &file); private: + void tryToLocate(const Song &song); + void tryToDownload(const Song &song); Image findImage(const Song &song, bool emitResult); void clearCache(const Song &song, const QImage &img, bool dummyEntriesOnly); void gotAlbumCover(const Song &song, const QImage &img, const QString &fileName, bool emitResult=true);