Remove MetadataAdapter

This commit is contained in:
badaix 2025-02-15 22:27:16 +01:00
parent 82d2a189e4
commit b54c2f297d
7 changed files with 38 additions and 123 deletions

View file

@ -44,7 +44,7 @@ class Controller
{
public:
/// c'tor
Controller(boost::asio::io_context& io_context, const ClientSettings& settings); //, std::unique_ptr<MetadataAdapter> meta);
Controller(boost::asio::io_context& io_context, const ClientSettings& settings);
/// Start thw work
void start();
// void stop();
@ -74,7 +74,6 @@ private:
std::shared_ptr<Stream> stream_;
std::unique_ptr<decoder::Decoder> decoder_;
std::unique_ptr<player::Player> player_;
// std::unique_ptr<MetadataAdapter> meta_;
std::unique_ptr<msg::ServerSettings> serverSettings_;
std::unique_ptr<msg::CodecHeader> headerChunk_;
};

View file

@ -1,105 +0,0 @@
/***
This file is part of snapcast
Copyright (C) 2014-2024 Johannes Pohl
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#pragma once
// local headers
#include "common/json.hpp"
// standard headers
#include <iostream>
// Prefix used in output
#define METADATA std::string("metadata")
/*
* Implement a generic metadata output handler
*/
using json = nlohmann::json;
/*
* Base class, prints to stdout
*/
class MetadataAdapter
{
public:
MetadataAdapter()
{
reset();
}
virtual ~MetadataAdapter() = default;
void reset()
{
msg_ = json{};
}
std::string serialize()
{
return METADATA + ":" + msg_.dump();
}
void tag(const std::string& name, const std::string& value)
{
msg_[name] = value;
}
std::string operator[](const std::string& key)
{
try
{
return msg_[key];
}
catch (std::domain_error&)
{
return std::string();
}
}
virtual int push()
{
std::cout << serialize() << "\n";
return 0;
}
int push(const json& jtag)
{
msg_ = jtag;
return push();
}
protected:
json msg_;
};
/*
* Send metadata to stderr as json
*/
class MetaStderrAdapter : public MetadataAdapter
{
public:
using MetadataAdapter::push;
int push() override
{
std::cerr << serialize() << "\n";
return 0;
}
};

View file

@ -1,6 +1,6 @@
/***
This file is part of snapcast
Copyright (C) 2014-2024 Johannes Pohl
Copyright (C) 2014-2025 Johannes Pohl
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -25,6 +25,7 @@
#include <mutex>
/// Queue with "wait for new element" functionality
template <typename T>
class Queue
{
@ -32,8 +33,7 @@ public:
T pop()
{
std::unique_lock<std::mutex> mlock(mutex_);
while (queue_.empty())
cond_.wait(mlock);
cond_.wait(mlock, [this]() { return queue_.empty(); });
// std::lock_guard<std::mutex> lock(mutex_);
auto val = queue_.front();
@ -54,7 +54,7 @@ public:
{
std::unique_lock<std::mutex> mlock(mutex_);
abort_ = false;
if (!cond_.wait_for(mlock, timeout, [this] { return (!queue_.empty() || abort_); }))
if (!cond_.wait_for(mlock, timeout, [this]() { return (!queue_.empty() || abort_); }))
return false;
return !queue_.empty() && !abort_;
@ -66,7 +66,7 @@ public:
abort_ = false;
if (timeout.count() > 0)
{
if (!cond_.wait_for(mlock, timeout, [this] { return (!queue_.empty() || abort_); }))
if (!cond_.wait_for(mlock, timeout, [this]() { return (!queue_.empty() || abort_); }))
return false;
}

View file

@ -1,6 +1,6 @@
/***
This file is part of snapcast
Copyright (C) 2014-2024 Johannes Pohl
Copyright (C) 2014-2025 Johannes Pohl
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -32,20 +32,24 @@
#include <vector>
/// Resampler
class Resampler
{
public:
/// c'tor to resample from @p in_format to @p out_format
Resampler(const SampleFormat& in_format, const SampleFormat& out_format);
/// d'tor
virtual ~Resampler();
// std::shared_ptr<msg::PcmChunk> resample(std::shared_ptr<msg::PcmChunk> chunk, chronos::usec duration);
/// @return resampled @p chunk
std::shared_ptr<msg::PcmChunk> resample(std::shared_ptr<msg::PcmChunk> chunk);
/// @return resampled @p chunk
std::shared_ptr<msg::PcmChunk> resample(const msg::PcmChunk& chunk);
/// @return if resampling is needed (in_format != out_format)
bool resamplingNeeded() const;
private:
std::vector<char> resample_buffer_;
// std::unique_ptr<msg::PcmChunk> resampled_chunk_;
SampleFormat in_format_;
SampleFormat out_format_;
#ifdef HAS_SOXR

View file

@ -1,6 +1,6 @@
/***
This file is part of snapcast
Copyright (C) 2014-2024 Johannes Pohl
Copyright (C) 2014-2025 Johannes Pohl
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -29,27 +29,35 @@
using json = nlohmann::json;
/// Meta data of a single track
class Metadata
{
public:
/// Cover art
struct ArtData
{
/// base64 encoded art data
std::string data;
/// type of the data (e.g. jpg)
std::string extension;
/// compare for equality
bool operator==(const ArtData& other) const
{
return ((other.data == data) && (other.extension == extension));
}
/// compare for un-equality
bool operator!=(const ArtData& other) const
{
return !(other == *this);
}
};
/// c'tor
Metadata() = default;
Metadata(const json& j);
/// c'tor taking json serialized meta data
explicit Metadata(const json& j);
/// https://www.musicpd.org/doc/html/protocol.html#tags
/// the duration of the song
@ -142,7 +150,10 @@ public:
/// Spotify track id
std::optional<std::string> spotify_track_id;
/// serialize to json
json toJson() const;
/// deserialize from json
void fromJson(const json& j);
/// compare for equality
bool operator==(const Metadata& other) const;
};

View file

@ -29,6 +29,7 @@
#include "control_error.hpp"
#include "encoder/encoder_factory.hpp"
#include "image_cache.hpp"
#include "streamreader/properties.hpp"
// 3rd party headers
#include <boost/asio/ip/host_name.hpp>
@ -152,7 +153,7 @@ void PcmStream::pollProperties()
{
LOG(INFO, LOG_TAG) << "Response for Plugin.Stream.Player.GetProperties: " << response.to_json() << "\n";
if (response.error().code() == 0)
setProperties(response.result());
setProperties(Properties(response.result()));
});
pollProperties();
}
@ -168,7 +169,7 @@ void PcmStream::onControlNotification(const jsonrpcpp::Notification& notificatio
if (notification.method() == "Plugin.Stream.Player.Properties")
{
LOG(DEBUG, LOG_TAG) << "Received properties notification\n";
setProperties(notification.params().to_json());
setProperties(Properties(notification.params().to_json()));
}
else if (notification.method() == "Plugin.Stream.Ready")
{
@ -177,7 +178,7 @@ void PcmStream::onControlNotification(const jsonrpcpp::Notification& notificatio
{
LOG(INFO, LOG_TAG) << "Response for Plugin.Stream.Player.GetProperties: " << response.to_json() << "\n";
if (response.error().code() == 0)
setProperties(response.result());
setProperties(Properties(response.result()));
});
// TODO: Add capabilities or settings?

View file

@ -1,6 +1,6 @@
/***
This file is part of snapcast
Copyright (C) 2014-2024 Johannes Pohl
Copyright (C) 2014-2025 Johannes Pohl
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -143,12 +143,14 @@ static std::istream& operator>>(std::istream& is, LoopStatus& loop_status)
return is;
}
/// Properties of the stream (volume, shuffle, mute, position, can_play, can_pause, ...)
class Properties
{
public:
/// c'tor
Properties() = default;
Properties(const json& j);
/// c'tor taking json serialized properties
explicit Properties(const json& j);
/// Meta data
std::optional<Metadata> metadata;
@ -185,7 +187,10 @@ public:
/// Whether the media player may be controlled over this interface
bool can_control = false;
/// serialize to json
json toJson() const;
/// deserialize from json
void fromJson(const json& j);
/// compare for equality
bool operator==(const Properties& other) const;
};