Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/helpers/albumArtCache.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/helpers/albumArtCache.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,77 @@ +#pragma once + +#include <functional> +#include <SDK/titleformat.h> +#include <SDK/timer.h> + +namespace fb2k { + class albumArtCache { + public: + albumArtCache( imageSize_t s = imageSizeMake(0,0) ) : m_tfSplit(titleformat_patterns::patternAlbumSplit()), imageSize(s), timeOut(0) { + } + bool isLoading() const { return m_imageLoader.is_valid(); } + bool isLoadingExpired() const { return timeOut > 0 && m_imageLoader.is_valid() && m_timeOutTimer.is_empty(); } + bool isLoadingNonExpired() const { return isLoading() && !isLoadingExpired(); } + pfc::string8 albumIDOfTrack( trackRef trk ) { + pfc::string8 pattern; + if (trk.is_valid()) { + trk->format_title(nullptr, pattern, m_tfSplit, nullptr); + } + + return pattern; + } + + std::function<void () > onLoaded; + imageSize_t imageSize; + double timeOut; + imageRef getImage( trackRef trk, std::function<void (imageRef)> asyncRecv = nullptr ) { + auto key = albumIDOfTrack( trk ); + if (strcmp(key, m_imageKey) != 0) { + m_timeOutTimer.release(); + m_imageKey = key; + m_image.release(); + m_imageLoader.release(); + + imageLocation_t loc; + if (loc.setTrack2( trk ) ) { + auto recv = makeObjReceiver( [this, asyncRecv] (objRef obj) { + m_image ^= obj; + if (m_imageLoader.is_valid()) { + m_imageLoader.release(); + m_timeOutTimer.release(); + if (onLoaded) onLoaded(); + if (asyncRecv) asyncRecv(m_image); + } + } ); + m_imageLoader = imageLoader::get()->beginLoad(loc, this->imageSize, recv); + + if (m_imageLoader.is_valid() && timeOut > 0) { + m_timeOutTimer = fb2k::registerTimer( timeOut, [=, this] { + m_timeOutTimer.release(); + if (onLoaded) onLoaded(); + if (asyncRecv) asyncRecv(nullptr); + } ); + } + } + } + return m_image; + } + void getImage2( trackRef trk, std::function<void (imageRef)> recv ) { + auto img = getImage( trk, recv ); + if (! this->isLoading() ) recv( img ); + } + void reset() { + m_imageKey = ""; + m_image.release(); + m_imageLoader.release(); + m_timeOutTimer.release(); + } + imageRef current() const { return m_image; } + private: + + titleformat_object_cache m_tfSplit; + pfc::string8 m_imageKey; + imageRef m_image; + objRef m_imageLoader, m_timeOutTimer; + }; +}
