mirror of
https://github.com/badaix/snapcast.git
synced 2025-05-19 12:06:15 +02:00
Pass io_context to stream readers
This commit is contained in:
parent
7a58526736
commit
6e138ff49f
15 changed files with 30 additions and 22 deletions
|
@ -801,7 +801,7 @@ void StreamServer::start()
|
|||
controlServer_.reset(new ControlServer(io_context_, settings_.tcp, settings_.http, this));
|
||||
controlServer_->start();
|
||||
|
||||
streamManager_.reset(new StreamManager(this, settings_.stream.sampleFormat, settings_.stream.codec, settings_.stream.streamReadMs));
|
||||
streamManager_.reset(new StreamManager(this, io_context_, settings_.stream.sampleFormat, settings_.stream.codec, settings_.stream.streamReadMs));
|
||||
// throw SnapException("xxx");
|
||||
for (const auto& streamUri : settings_.stream.pcmStreams)
|
||||
{
|
||||
|
|
|
@ -41,7 +41,7 @@ static string hex2str(string input)
|
|||
* move to Makefile?
|
||||
*/
|
||||
|
||||
AirplayStream::AirplayStream(PcmListener* pcmListener, const StreamUri& uri) : ProcessStream(pcmListener, uri), port_(5000)
|
||||
AirplayStream::AirplayStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri) : ProcessStream(pcmListener, ioc, uri), port_(5000)
|
||||
{
|
||||
logStderr_ = true;
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ class AirplayStream : public ProcessStream
|
|||
{
|
||||
public:
|
||||
/// ctor. Encoded PCM data is passed to the PipeListener
|
||||
AirplayStream(PcmListener* pcmListener, const StreamUri& uri);
|
||||
AirplayStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri);
|
||||
~AirplayStream() override;
|
||||
|
||||
protected:
|
||||
|
|
|
@ -30,7 +30,7 @@ using namespace std;
|
|||
|
||||
|
||||
|
||||
FileStream::FileStream(PcmListener* pcmListener, const StreamUri& uri) : PcmStream(pcmListener, uri)
|
||||
FileStream::FileStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri) : PcmStream(pcmListener, ioc, uri)
|
||||
{
|
||||
ifs.open(uri_.path.c_str(), std::ifstream::in | std::ifstream::binary);
|
||||
if (!ifs.good())
|
||||
|
|
|
@ -33,7 +33,7 @@ class FileStream : public PcmStream
|
|||
{
|
||||
public:
|
||||
/// ctor. Encoded PCM data is passed to the PipeListener
|
||||
FileStream(PcmListener* pcmListener, const StreamUri& uri);
|
||||
FileStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri);
|
||||
~FileStream() override;
|
||||
|
||||
protected:
|
||||
|
|
|
@ -28,7 +28,7 @@ using namespace std;
|
|||
|
||||
|
||||
|
||||
LibrespotStream::LibrespotStream(PcmListener* pcmListener, const StreamUri& uri) : ProcessStream(pcmListener, uri)
|
||||
LibrespotStream::LibrespotStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri) : ProcessStream(pcmListener, ioc, uri)
|
||||
{
|
||||
sampleFormat_ = SampleFormat("44100:16:2");
|
||||
uri_.query["sampleformat"] = sampleFormat_.getFormat();
|
||||
|
|
|
@ -35,7 +35,7 @@ class LibrespotStream : public ProcessStream, WatchdogListener
|
|||
{
|
||||
public:
|
||||
/// ctor. Encoded PCM data is passed to the PipeListener
|
||||
LibrespotStream(PcmListener* pcmListener, const StreamUri& uri);
|
||||
LibrespotStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri);
|
||||
~LibrespotStream() override;
|
||||
|
||||
protected:
|
||||
|
|
|
@ -31,7 +31,8 @@ using namespace std;
|
|||
|
||||
|
||||
|
||||
PcmStream::PcmStream(PcmListener* pcmListener, const StreamUri& uri) : active_(false), pcmListener_(pcmListener), uri_(uri), pcmReadMs_(20), state_(kIdle)
|
||||
PcmStream::PcmStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri)
|
||||
: active_(false), pcmListener_(pcmListener), uri_(uri), pcmReadMs_(20), state_(kIdle), ioc_(ioc)
|
||||
{
|
||||
encoder::EncoderFactory encoderFactory;
|
||||
if (uri_.query.find("codec") == uri_.query.end())
|
||||
|
@ -169,7 +170,9 @@ json PcmStream::toJson() const
|
|||
state = "disabled";
|
||||
|
||||
json j = {
|
||||
{"uri", uri_.toJson()}, {"id", getId()}, {"status", state},
|
||||
{"uri", uri_.toJson()},
|
||||
{"id", getId()},
|
||||
{"status", state},
|
||||
};
|
||||
|
||||
if (meta_)
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "message/stream_tags.hpp"
|
||||
#include "stream_uri.hpp"
|
||||
#include <atomic>
|
||||
#include <boost/asio/io_context.hpp>
|
||||
#include <condition_variable>
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
|
@ -68,7 +69,7 @@ class PcmStream : public encoder::EncoderListener
|
|||
{
|
||||
public:
|
||||
/// ctor. Encoded PCM data is passed to the PcmListener
|
||||
PcmStream(PcmListener* pcmListener, const StreamUri& uri);
|
||||
PcmStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri);
|
||||
virtual ~PcmStream();
|
||||
|
||||
virtual void start();
|
||||
|
@ -110,6 +111,7 @@ protected:
|
|||
std::string name_;
|
||||
ReaderState state_;
|
||||
std::shared_ptr<msg::StreamTags> meta_;
|
||||
boost::asio::io_context& ioc_;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ using namespace std;
|
|||
|
||||
|
||||
|
||||
PipeStream::PipeStream(PcmListener* pcmListener, const StreamUri& uri) : PcmStream(pcmListener, uri), fd_(-1)
|
||||
PipeStream::PipeStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri) : PcmStream(pcmListener, ioc, uri), fd_(-1)
|
||||
{
|
||||
umask(0);
|
||||
string mode = uri_.getQuery("mode", "create");
|
||||
|
|
|
@ -33,7 +33,7 @@ class PipeStream : public PcmStream
|
|||
{
|
||||
public:
|
||||
/// ctor. Encoded PCM data is passed to the PipeListener
|
||||
PipeStream(PcmListener* pcmListener, const StreamUri& uri);
|
||||
PipeStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri);
|
||||
~PipeStream() override;
|
||||
|
||||
protected:
|
||||
|
|
|
@ -31,7 +31,8 @@ using namespace std;
|
|||
|
||||
|
||||
|
||||
ProcessStream::ProcessStream(PcmListener* pcmListener, const StreamUri& uri) : PcmStream(pcmListener, uri), path_(""), process_(nullptr)
|
||||
ProcessStream::ProcessStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri)
|
||||
: PcmStream(pcmListener, ioc, uri), path_(""), process_(nullptr)
|
||||
{
|
||||
params_ = uri_.getQuery("params");
|
||||
logStderr_ = (uri_.getQuery("logStderr", "false") == "true");
|
||||
|
|
|
@ -36,7 +36,7 @@ class ProcessStream : public PcmStream
|
|||
{
|
||||
public:
|
||||
/// ctor. Encoded PCM data is passed to the PipeListener
|
||||
ProcessStream(PcmListener* pcmListener, const StreamUri& uri);
|
||||
ProcessStream(PcmListener* pcmListener, boost::asio::io_context& ioc, const StreamUri& uri);
|
||||
~ProcessStream() override;
|
||||
|
||||
void start() override;
|
||||
|
|
|
@ -31,8 +31,8 @@
|
|||
using namespace std;
|
||||
|
||||
|
||||
StreamManager::StreamManager(PcmListener* pcmListener, const std::string& defaultSampleFormat, const std::string& defaultCodec, size_t defaultReadBufferMs)
|
||||
: pcmListener_(pcmListener), sampleFormat_(defaultSampleFormat), codec_(defaultCodec), readBufferMs_(defaultReadBufferMs)
|
||||
StreamManager::StreamManager(PcmListener* pcmListener, boost::asio::io_context& ioc, const std::string& defaultSampleFormat, const std::string& defaultCodec, size_t defaultReadBufferMs)
|
||||
: pcmListener_(pcmListener), sampleFormat_(defaultSampleFormat), codec_(defaultCodec), readBufferMs_(defaultReadBufferMs), ioc_(ioc)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -59,23 +59,23 @@ PcmStreamPtr StreamManager::addStream(const std::string& uri)
|
|||
|
||||
if (streamUri.scheme == "pipe")
|
||||
{
|
||||
stream = make_shared<PipeStream>(pcmListener_, streamUri);
|
||||
stream = make_shared<PipeStream>(pcmListener_, ioc_, streamUri);
|
||||
}
|
||||
else if (streamUri.scheme == "file")
|
||||
{
|
||||
stream = make_shared<FileStream>(pcmListener_, streamUri);
|
||||
stream = make_shared<FileStream>(pcmListener_, ioc_, streamUri);
|
||||
}
|
||||
else if (streamUri.scheme == "process")
|
||||
{
|
||||
stream = make_shared<ProcessStream>(pcmListener_, streamUri);
|
||||
stream = make_shared<ProcessStream>(pcmListener_, ioc_, streamUri);
|
||||
}
|
||||
else if ((streamUri.scheme == "spotify") || (streamUri.scheme == "librespot"))
|
||||
{
|
||||
stream = make_shared<LibrespotStream>(pcmListener_, streamUri);
|
||||
stream = make_shared<LibrespotStream>(pcmListener_, ioc_, streamUri);
|
||||
}
|
||||
else if (streamUri.scheme == "airplay")
|
||||
{
|
||||
stream = make_shared<AirplayStream>(pcmListener_, streamUri);
|
||||
stream = make_shared<AirplayStream>(pcmListener_, ioc_, streamUri);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -5,13 +5,14 @@
|
|||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <boost/asio/io_context.hpp>
|
||||
|
||||
typedef std::shared_ptr<PcmStream> PcmStreamPtr;
|
||||
|
||||
class StreamManager
|
||||
{
|
||||
public:
|
||||
StreamManager(PcmListener* pcmListener, const std::string& defaultSampleFormat, const std::string& defaultCodec, size_t defaultReadBufferMs = 20);
|
||||
StreamManager(PcmListener* pcmListener, boost::asio::io_context& ioc, const std::string& defaultSampleFormat, const std::string& defaultCodec, size_t defaultReadBufferMs = 20);
|
||||
|
||||
PcmStreamPtr addStream(const std::string& uri);
|
||||
void removeStream(const std::string& name);
|
||||
|
@ -28,6 +29,7 @@ private:
|
|||
std::string sampleFormat_;
|
||||
std::string codec_;
|
||||
size_t readBufferMs_;
|
||||
boost::asio::io_context& ioc_;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue