diff --git a/server/control_session_http.cpp b/server/control_session_http.cpp index 1d7ba5bd..080f26e1 100644 --- a/server/control_session_http.cpp +++ b/server/control_session_http.cpp @@ -24,6 +24,7 @@ #include "common/aixlog.hpp" #include "common/utils/file_utils.hpp" #include "control_session_ws.hpp" +#include "image_cache.hpp" #include "stream_session_ws.hpp" // 3rd party headers @@ -288,7 +289,7 @@ void ControlSessionHttp::handle_request(http::request +/// Image cache, used to store current album art per stream class ImageCache { public: - ImageCache() = default; - virtual ~ImageCache() = default; + /// @return singleton to the image cache + static ImageCache& instance() + { + static ImageCache instance_; + return instance_; + } + /// Store the base64 encoded @p image for @p key (the session that stores the image) in the cache + /// @return url of the cached image (md5 of key + image data) appended with @p extension std::string setImage(const std::string& key, std::string image, const std::string& extension) { if (image.empty()) @@ -51,7 +58,7 @@ public: hash.process_bytes(image.data(), image.size()); hash.get_digest(digest); std::string filename; - const auto intDigest = reinterpret_cast(&digest); + const auto* intDigest = reinterpret_cast(&digest); boost::algorithm::hex_lower(intDigest, intDigest + (sizeof(md5::digest_type) / sizeof(int)), std::back_inserter(filename)); auto ext = extension; if (ext.find('.') == 0) @@ -63,6 +70,7 @@ public: return filename; }; + /// Clear image for @p key (the stream session's name) void clear(const std::string& key) { std::lock_guard lock(mutex_); @@ -77,6 +85,7 @@ public: } } + /// @return base64 encoded image for url (the one returned by "setImage") std::optional getImage(const std::string& url) { std::lock_guard lock(mutex_); @@ -88,6 +97,9 @@ public: } private: + ImageCache() = default; + ~ImageCache() = default; + std::map key_to_url_; std::map url_to_data_; std::mutex mutex_; diff --git a/server/server_settings.hpp b/server/server_settings.hpp index 33d88ade..66f458fa 100644 --- a/server/server_settings.hpp +++ b/server/server_settings.hpp @@ -21,7 +21,6 @@ // local headers #include "common/utils/string_utils.hpp" -#include "image_cache.hpp" // standard headers #include @@ -73,7 +72,6 @@ struct ServerSettings std::vector ssl_bind_to_address{{"0.0.0.0"}}; std::string doc_root{""}; std::string host{""}; - inline static ImageCache image_cache; }; struct Tcp diff --git a/server/streamreader/jack_stream.cpp b/server/streamreader/jack_stream.cpp index 8fb76d0d..549625f7 100644 --- a/server/streamreader/jack_stream.cpp +++ b/server/streamreader/jack_stream.cpp @@ -20,8 +20,6 @@ // prototype/interface header file #include "jack_stream.hpp" -#include - // local headers #include "common/aixlog.hpp" #include "common/snap_exception.hpp" @@ -59,7 +57,6 @@ void float_to_s24(char* dst, jack_default_audio_sample_t* src, unsigned long nsa while (nsamples--) { - // float to S24 conversion if (*src <= -1.0f) { diff --git a/server/streamreader/jack_stream.hpp b/server/streamreader/jack_stream.hpp index dad1cf7b..bbb451e9 100644 --- a/server/streamreader/jack_stream.hpp +++ b/server/streamreader/jack_stream.hpp @@ -22,7 +22,6 @@ // local headers #include "pcm_stream.hpp" -#include // 3rd party headers #include diff --git a/server/streamreader/pcm_stream.cpp b/server/streamreader/pcm_stream.cpp index cd846cad..bb2169aa 100644 --- a/server/streamreader/pcm_stream.cpp +++ b/server/streamreader/pcm_stream.cpp @@ -28,6 +28,7 @@ #include "common/utils/string_utils.hpp" #include "control_error.hpp" #include "encoder/encoder_factory.hpp" +#include "image_cache.hpp" // 3rd party headers #include @@ -537,7 +538,7 @@ void PcmStream::setProperties(const Properties& properties) if (props.metadata.has_value() && props.metadata->art_data.has_value() && !props.metadata->art_url.has_value()) { auto data = base64_decode(props.metadata->art_data->data); - auto md5 = ServerSettings::Http::image_cache.setImage(getName(), std::move(data), props.metadata->art_data->extension); + auto md5 = ImageCache::instance().setImage(getName(), std::move(data), props.metadata->art_data->extension); std::stringstream url; url << "http://" << server_settings_.http.host << ":" << server_settings_.http.port << "/__image_cache?name=" << md5; @@ -545,7 +546,7 @@ void PcmStream::setProperties(const Properties& properties) } else if (!props.metadata.has_value() || !props.metadata->art_data.has_value()) { - ServerSettings::Http::image_cache.clear(getName()); + ImageCache::instance().clear(getName()); } if (props == properties_)