mpd/src/input/IcyInputStream.hxx
2023-03-06 14:59:48 +01:00

60 lines
1.5 KiB
C++

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright The Music Player Daemon Project
#ifndef MPD_ICY_INPUT_STREAM_HXX
#define MPD_ICY_INPUT_STREAM_HXX
#include "ProxyInputStream.hxx"
#include <memory>
struct Tag;
class IcyMetaDataParser;
/**
* An #InputStream filter that parses Icy metadata.
*/
class IcyInputStream final : public ProxyInputStream {
std::shared_ptr<IcyMetaDataParser> parser;
/**
* The #Tag object ready to be requested via ReadTag().
*/
std::unique_ptr<Tag> input_tag;
/**
* The #Tag object ready to be requested via ReadTag().
*/
std::unique_ptr<Tag> icy_tag;
offset_type override_offset = 0;
public:
/**
* @param _parser a IcyMetaDataParser instance which is shared
* with our input; it needs to be shared because our input
* needs to feed parameters (e.g. from the "icy-metaint"
* header) into it
*
* Throws on error (e.g. if the charset converter specified by
* the URI fragment fails to initialize).
*/
IcyInputStream(InputStreamPtr _input,
std::shared_ptr<IcyMetaDataParser> _parser);
~IcyInputStream() noexcept override;
IcyInputStream(const IcyInputStream &) = delete;
IcyInputStream &operator=(const IcyInputStream &) = delete;
[[gnu::pure]]
bool IsEnabled() const noexcept;
/* virtual methods from InputStream */
void Update() noexcept override;
std::unique_ptr<Tag> ReadTag() noexcept override;
size_t Read(std::unique_lock<Mutex> &lock,
void *ptr, size_t size) override;
};
#endif