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_)