From 5ccf78855d3708107cd15d83f6911548524efe3c Mon Sep 17 00:00:00 2001 From: Nicolai Syvertsen Date: Tue, 19 Oct 2021 14:31:40 +0200 Subject: [PATCH] Implement SendTag for PipeWire output plugin --- src/output/plugins/PipeWireOutputPlugin.cxx | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/output/plugins/PipeWireOutputPlugin.cxx b/src/output/plugins/PipeWireOutputPlugin.cxx index ab9ecea4e..7cac7b2df 100644 --- a/src/output/plugins/PipeWireOutputPlugin.cxx +++ b/src/output/plugins/PipeWireOutputPlugin.cxx @@ -28,6 +28,7 @@ #include "util/StringCompare.hxx" #include "util/WritableBuffer.hxx" #include "Log.hxx" +#include "tag/Format.hxx" #ifdef __GNUC__ #pragma GCC diagnostic push @@ -240,6 +241,8 @@ private: void Drain() override; void Cancel() noexcept override; bool Pause() noexcept override; + + void SendTag(const Tag &tag) noexcept override; }; static constexpr auto stream_events = PipeWireOutput::MakeStreamEvents(); @@ -652,6 +655,36 @@ PipeWireOutput::SetMixer(PipeWireMixer &_mixer) noexcept // TODO: Check if context and stream is ready and trigger a volume update... } +void PipeWireOutput::SendTag(const Tag &tag) noexcept { + + CheckThrowError(); + + struct spa_dict_item items[3]; + uint32_t n_items=0; + + const char *artist, *title; + + const char *medianame = FormatTag(tag, "%artist% - %title%"); + items[n_items++] = SPA_DICT_ITEM_INIT(PW_KEY_MEDIA_NAME, medianame); + + artist = tag.GetValue(TAG_ARTIST); + title = tag.GetValue(TAG_TITLE); + + if (artist != nullptr) { + items[n_items++] = SPA_DICT_ITEM_INIT(PW_KEY_MEDIA_ARTIST, artist); + } + + if (title != nullptr) { + items[n_items++] = SPA_DICT_ITEM_INIT(PW_KEY_MEDIA_TITLE, title); + } + + struct spa_dict dict = SPA_DICT_INIT(items, n_items); + + auto rc = pw_stream_update_properties(stream, &dict); + if (rc < 0) + LogWarning(pipewire_output_domain, "PipeWire: Error updating properties!\n"); +} + void pipewire_output_set_mixer(PipeWireOutput &po, PipeWireMixer &pm) noexcept {