2023-03-06 14:42:04 +01:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
// Copyright The Music Player Daemon Project
|
2014-05-11 15:32:47 +02:00
|
|
|
|
|
|
|
#ifndef MPD_ICY_INPUT_STREAM_HXX
|
|
|
|
#define MPD_ICY_INPUT_STREAM_HXX
|
|
|
|
|
|
|
|
#include "ProxyInputStream.hxx"
|
|
|
|
|
2017-12-20 15:13:22 +01:00
|
|
|
#include <memory>
|
|
|
|
|
2014-05-11 15:32:47 +02:00
|
|
|
struct Tag;
|
2017-12-26 19:43:29 +01:00
|
|
|
class IcyMetaDataParser;
|
2014-05-11 15:32:47 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* An #InputStream filter that parses Icy metadata.
|
|
|
|
*/
|
|
|
|
class IcyInputStream final : public ProxyInputStream {
|
2017-12-26 19:43:29 +01:00
|
|
|
std::shared_ptr<IcyMetaDataParser> parser;
|
2014-05-11 15:32:47 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The #Tag object ready to be requested via ReadTag().
|
|
|
|
*/
|
2017-12-20 15:13:22 +01:00
|
|
|
std::unique_ptr<Tag> input_tag;
|
2014-05-11 15:32:47 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The #Tag object ready to be requested via ReadTag().
|
|
|
|
*/
|
2017-12-20 15:13:22 +01:00
|
|
|
std::unique_ptr<Tag> icy_tag;
|
2014-05-11 15:32:47 +02:00
|
|
|
|
2017-12-26 11:32:36 +01:00
|
|
|
offset_type override_offset = 0;
|
2014-05-11 15:32:47 +02:00
|
|
|
|
|
|
|
public:
|
2017-12-26 19:43:29 +01:00
|
|
|
/**
|
|
|
|
* @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
|
2019-08-09 15:44:09 +02:00
|
|
|
*
|
|
|
|
* Throws on error (e.g. if the charset converter specified by
|
|
|
|
* the URI fragment fails to initialize).
|
2017-12-26 19:43:29 +01:00
|
|
|
*/
|
2017-12-26 11:37:29 +01:00
|
|
|
IcyInputStream(InputStreamPtr _input,
|
2019-08-09 15:44:09 +02:00
|
|
|
std::shared_ptr<IcyMetaDataParser> _parser);
|
2020-03-16 05:58:40 +01:00
|
|
|
~IcyInputStream() noexcept override;
|
2014-05-11 15:32:47 +02:00
|
|
|
|
|
|
|
IcyInputStream(const IcyInputStream &) = delete;
|
|
|
|
IcyInputStream &operator=(const IcyInputStream &) = delete;
|
|
|
|
|
2021-10-13 11:28:04 +02:00
|
|
|
[[gnu::pure]]
|
2017-12-26 19:43:29 +01:00
|
|
|
bool IsEnabled() const noexcept;
|
2014-05-11 15:32:47 +02:00
|
|
|
|
|
|
|
/* virtual methods from InputStream */
|
2017-12-26 11:31:05 +01:00
|
|
|
void Update() noexcept override;
|
2019-04-05 08:57:42 +02:00
|
|
|
std::unique_ptr<Tag> ReadTag() noexcept override;
|
2019-04-26 19:19:45 +02:00
|
|
|
size_t Read(std::unique_lock<Mutex> &lock,
|
|
|
|
void *ptr, size_t size) override;
|
2014-05-11 15:32:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|