diff --git a/src/lyrics.cpp b/src/lyrics.cpp index 7733294d..248d4f4e 100644 --- a/src/lyrics.cpp +++ b/src/lyrics.cpp @@ -18,6 +18,7 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include #include #include #include @@ -121,6 +122,7 @@ bool saveLyrics(const std::string &filename, const std::string &lyrics) boost::optional downloadLyrics( const MPD::Song &s, std::shared_ptr> shared_buffer, + std::shared_ptr> download_stopper, LyricsFetcher *current_fetcher) { std::string s_artist = Curl::escape(s.getArtist()); @@ -170,6 +172,8 @@ boost::optional downloadLyrics( { for (auto &fetcher : Config.lyrics_fetchers) { + if (download_stopper && download_stopper->load()) + return boost::none; fetcher_result = fetch_lyrics(fetcher); if (fetcher_result.first) break; @@ -270,6 +274,7 @@ void Lyrics::fetch(const MPD::Song &s) { if (!m_worker.valid() || s != m_song) { + stopDownload(); w.clear(); m_song = s; if (loadLyrics(w, lyricsFilename(m_song))) @@ -279,10 +284,12 @@ void Lyrics::fetch(const MPD::Song &s) } else { + m_download_stopper = std::make_shared>(false); m_shared_buffer = std::make_shared>(); m_worker = boost::async( boost::launch::async, - std::bind(downloadLyrics, m_song, m_shared_buffer, m_fetcher)); + std::bind(downloadLyrics, + m_song, m_shared_buffer, m_download_stopper, m_fetcher)); } } } @@ -390,7 +397,7 @@ void Lyrics::fetchInBackground(const MPD::Song &s, bool notify_) } if (!cs.song().empty()) { - auto lyrics = downloadLyrics(cs.song(), nullptr, m_fetcher); + auto lyrics = downloadLyrics(cs.song(), nullptr, nullptr, m_fetcher); if (lyrics) saveLyrics(lyrics_file, *lyrics); } @@ -425,3 +432,9 @@ void Lyrics::clearWorker() m_shared_buffer.reset(); m_worker = boost::BOOST_THREAD_FUTURE>(); } + +void Lyrics::stopDownload() +{ + if (m_download_stopper) + m_download_stopper->store(true); +} diff --git a/src/lyrics.h b/src/lyrics.h index 090f678a..b007acf8 100644 --- a/src/lyrics.h +++ b/src/lyrics.h @@ -88,11 +88,13 @@ private: }; void clearWorker(); + void stopDownload(); bool m_refresh_window; size_t m_scroll_begin; std::shared_ptr> m_shared_buffer; + std::shared_ptr> m_download_stopper; MPD::Song m_song; LyricsFetcher *m_fetcher;