mirror of
https://github.com/badaix/snapcast.git
synced 2025-05-25 06:56:15 +02:00
switched to standalone asio
This commit is contained in:
parent
75179cc936
commit
5cc7285a87
14 changed files with 42 additions and 42 deletions
|
@ -3,7 +3,7 @@ TARGET = snapclient
|
||||||
SHELL = /bin/bash
|
SHELL = /bin/bash
|
||||||
|
|
||||||
CXX = /usr/bin/g++
|
CXX = /usr/bin/g++
|
||||||
CFLAGS = -std=c++0x -Wall -Wno-unused-function -O3 -pthread -DVERSION=\"$(VERSION)\" -I..
|
CFLAGS = -std=c++0x -Wall -Wno-unused-function -O3 -pthread -DVERSION=\"$(VERSION)\" -I.. -I../externals/asio/asio/include
|
||||||
#CFLAGS = -std=c++0x -Wall -Wno-unused-function -O3 -pthread -DVERSION=\"$(VERSION)\" -I.. -static-libgcc -static-libstdc++
|
#CFLAGS = -std=c++0x -Wall -Wno-unused-function -O3 -pthread -DVERSION=\"$(VERSION)\" -I.. -static-libgcc -static-libstdc++
|
||||||
LDFLAGS = -lrt -lboost_system -lboost_program_options -lasound -logg -lvorbis -lvorbisenc -lFLAC -lavahi-client -lavahi-common
|
LDFLAGS = -lrt -lboost_system -lboost_program_options -lasound -logg -lvorbis -lvorbisenc -lFLAC -lavahi-client -lavahi-common
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ void ClientConnection::socketRead(void* _to, size_t _bytes)
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
// boost::system::error_code error;
|
// boost::system::error_code error;
|
||||||
len += socket_->read_some(boost::asio::buffer((char*)_to + len, toRead));
|
len += socket_->read_some(asio::buffer((char*)_to + len, toRead));
|
||||||
//cout << "len: " << len << ", error: " << error << endl;
|
//cout << "len: " << len << ", error: " << error << endl;
|
||||||
toRead = _bytes - len;
|
toRead = _bytes - len;
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ void ClientConnection::socketRead(void* _to, size_t _bytes)
|
||||||
void ClientConnection::start()
|
void ClientConnection::start()
|
||||||
{
|
{
|
||||||
tcp::resolver resolver(io_service_);
|
tcp::resolver resolver(io_service_);
|
||||||
tcp::resolver::query query(tcp::v4(), host_, std::to_string(port_), boost::asio::ip::resolver_query_base::numeric_service);
|
tcp::resolver::query query(tcp::v4(), host_, std::to_string(port_), asio::ip::resolver_query_base::numeric_service);
|
||||||
auto iterator = resolver.resolve(query);
|
auto iterator = resolver.resolve(query);
|
||||||
logO << "Connecting\n";
|
logO << "Connecting\n";
|
||||||
socket_.reset(new tcp::socket(io_service_));
|
socket_.reset(new tcp::socket(io_service_));
|
||||||
|
@ -86,10 +86,10 @@ void ClientConnection::stop()
|
||||||
active_ = false;
|
active_ = false;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
boost::system::error_code ec;
|
std::error_code ec;
|
||||||
if (socket_)
|
if (socket_)
|
||||||
{
|
{
|
||||||
socket_->shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
|
socket_->shutdown(asio::ip::tcp::socket::shutdown_both, ec);
|
||||||
if (ec) logE << "Error in socket shutdown: " << ec << endl;
|
if (ec) logE << "Error in socket shutdown: " << ec << endl;
|
||||||
socket_->close(ec);
|
socket_->close(ec);
|
||||||
if (ec) logE << "Error in socket close: " << ec << endl;
|
if (ec) logE << "Error in socket close: " << ec << endl;
|
||||||
|
@ -116,12 +116,12 @@ bool ClientConnection::send(const msg::BaseMessage* message) const
|
||||||
if (!connected())
|
if (!connected())
|
||||||
return false;
|
return false;
|
||||||
//logD << "send: " << message->type << ", size: " << message->getSize() << "\n";
|
//logD << "send: " << message->type << ", size: " << message->getSize() << "\n";
|
||||||
boost::asio::streambuf streambuf;
|
asio::streambuf streambuf;
|
||||||
std::ostream stream(&streambuf);
|
std::ostream stream(&streambuf);
|
||||||
tv t;
|
tv t;
|
||||||
message->sent = t;
|
message->sent = t;
|
||||||
message->serialize(stream);
|
message->serialize(stream);
|
||||||
boost::asio::write(*socket_.get(), streambuf);
|
asio::write(*socket_.get(), streambuf);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,14 +24,14 @@
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <boost/asio.hpp>
|
#include <asio.hpp>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include "message/message.h"
|
#include "message/message.h"
|
||||||
#include "common/timeDefs.h"
|
#include "common/timeDefs.h"
|
||||||
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
using asio::ip::tcp;
|
||||||
|
|
||||||
|
|
||||||
class ClientConnection;
|
class ClientConnection;
|
||||||
|
@ -105,7 +105,7 @@ protected:
|
||||||
void socketRead(void* to, size_t bytes);
|
void socketRead(void* to, size_t bytes);
|
||||||
void getNextMessage();
|
void getNextMessage();
|
||||||
|
|
||||||
boost::asio::io_service io_service_;
|
asio::io_service io_service_;
|
||||||
std::shared_ptr<tcp::socket> socket_;
|
std::shared_ptr<tcp::socket> socket_;
|
||||||
std::atomic<bool> active_;
|
std::atomic<bool> active_;
|
||||||
std::atomic<bool> connected_;
|
std::atomic<bool> connected_;
|
||||||
|
|
2
externals/tclap
vendored
2
externals/tclap
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit f41dcb5ce3d063c9fe95623193bba693338f3edb
|
Subproject commit 3627d9402e529770df9b0edf2aa8c0e0d6c6bb41
|
|
@ -3,7 +3,7 @@ TARGET = snapserver
|
||||||
SHELL = /bin/bash
|
SHELL = /bin/bash
|
||||||
|
|
||||||
CXX = /usr/bin/g++
|
CXX = /usr/bin/g++
|
||||||
CFLAGS = -std=c++0x -Wall -Wno-unused-function -O3 -pthread -DVERSION=\"$(VERSION)\" -I..
|
CFLAGS = -std=c++0x -Wall -Wno-unused-function -O3 -pthread -DVERSION=\"$(VERSION)\" -I.. -I../externals/asio/asio/include
|
||||||
LDFLAGS = -lrt -lboost_system -lboost_program_options -lvorbis -lvorbisenc -logg -lFLAC -lavahi-client -lavahi-common
|
LDFLAGS = -lrt -lboost_system -lboost_program_options -lvorbis -lvorbisenc -logg -lFLAC -lavahi-client -lavahi-common
|
||||||
|
|
||||||
OBJ = snapServer.o config.o controlServer.o controlSession.o streamServer.o streamSession.o json/jsonrpc.o pcmreader/pcmReader.o pcmreader/pipeReader.o encoder/encoderFactory.o encoder/flacEncoder.o encoder/pcmEncoder.o encoder/oggEncoder.o publishAvahi.o ../common/log.o ../message/pcmChunk.o ../message/sampleFormat.o
|
OBJ = snapServer.o config.o controlServer.o controlSession.o streamServer.o streamSession.o json/jsonrpc.o pcmreader/pcmReader.o pcmreader/pipeReader.o encoder/encoderFactory.o encoder/flacEncoder.o encoder/pcmEncoder.o encoder/oggEncoder.o publishAvahi.o ../common/log.o ../message/pcmChunk.o ../message/sampleFormat.o
|
||||||
|
|
|
@ -33,7 +33,7 @@ using namespace std;
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
|
|
||||||
ControlServer::ControlServer(boost::asio::io_service* io_service, size_t port, ControlMessageReceiver* controlMessageReceiver) : io_service_(io_service), port_(port), controlMessageReceiver_(controlMessageReceiver)
|
ControlServer::ControlServer(asio::io_service* io_service, size_t port, ControlMessageReceiver* controlMessageReceiver) : io_service_(io_service), port_(port), controlMessageReceiver_(controlMessageReceiver)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifndef CONTROL_SERVER_H
|
#ifndef CONTROL_SERVER_H
|
||||||
#define CONTROL_SERVER_H
|
#define CONTROL_SERVER_H
|
||||||
|
|
||||||
#include <boost/asio.hpp>
|
#include <asio.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
#include "message/serverSettings.h"
|
#include "message/serverSettings.h"
|
||||||
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
using asio::ip::tcp;
|
||||||
typedef std::shared_ptr<tcp::socket> socket_ptr;
|
typedef std::shared_ptr<tcp::socket> socket_ptr;
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ typedef std::shared_ptr<tcp::socket> socket_ptr;
|
||||||
class ControlServer : public ControlMessageReceiver
|
class ControlServer : public ControlMessageReceiver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ControlServer(boost::asio::io_service* io_service, size_t port, ControlMessageReceiver* controlMessageReceiver = NULL);
|
ControlServer(asio::io_service* io_service, size_t port, ControlMessageReceiver* controlMessageReceiver = NULL);
|
||||||
virtual ~ControlServer();
|
virtual ~ControlServer();
|
||||||
|
|
||||||
void start();
|
void start();
|
||||||
|
@ -67,7 +67,7 @@ private:
|
||||||
std::shared_ptr<tcp::acceptor> acceptor_;
|
std::shared_ptr<tcp::acceptor> acceptor_;
|
||||||
|
|
||||||
Queue<std::shared_ptr<msg::BaseMessage>> messages_;
|
Queue<std::shared_ptr<msg::BaseMessage>> messages_;
|
||||||
boost::asio::io_service* io_service_;
|
asio::io_service* io_service_;
|
||||||
size_t port_;
|
size_t port_;
|
||||||
ControlMessageReceiver* controlMessageReceiver_;
|
ControlMessageReceiver* controlMessageReceiver_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -52,10 +52,10 @@ void ControlSession::stop()
|
||||||
active_ = false;
|
active_ = false;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
boost::system::error_code ec;
|
std::error_code ec;
|
||||||
if (socket_)
|
if (socket_)
|
||||||
{
|
{
|
||||||
socket_->shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
|
socket_->shutdown(asio::ip::tcp::socket::shutdown_both, ec);
|
||||||
if (ec) logE << "Error in socket shutdown: " << ec << "\n";
|
if (ec) logE << "Error in socket shutdown: " << ec << "\n";
|
||||||
socket_->close(ec);
|
socket_->close(ec);
|
||||||
if (ec) logE << "Error in socket close: " << ec << "\n";
|
if (ec) logE << "Error in socket close: " << ec << "\n";
|
||||||
|
@ -96,10 +96,10 @@ bool ControlSession::send(const std::string& message) const
|
||||||
std::unique_lock<std::mutex> mlock(mutex_);
|
std::unique_lock<std::mutex> mlock(mutex_);
|
||||||
if (!socket_ || !active_)
|
if (!socket_ || !active_)
|
||||||
return false;
|
return false;
|
||||||
boost::asio::streambuf streambuf;
|
asio::streambuf streambuf;
|
||||||
std::ostream request_stream(&streambuf);
|
std::ostream request_stream(&streambuf);
|
||||||
request_stream << message << "\r\n";
|
request_stream << message << "\r\n";
|
||||||
boost::asio::write(*socket_.get(), streambuf);
|
asio::write(*socket_.get(), streambuf);
|
||||||
// logO << "done: " << message->type << ", size: " << message->size << ", id: " << message->id << ", refers: " << message->refersTo << "\n";
|
// logO << "done: " << message->type << ", size: " << message->size << ", id: " << message->id << ", refers: " << message->refersTo << "\n";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -112,8 +112,8 @@ void ControlSession::reader()
|
||||||
{
|
{
|
||||||
while (active_)
|
while (active_)
|
||||||
{
|
{
|
||||||
boost::asio::streambuf response;
|
asio::streambuf response;
|
||||||
boost::asio::read_until(*socket_, response, "\r\n");
|
asio::read_until(*socket_, response, "\r\n");
|
||||||
std::string s((istreambuf_iterator<char>(&response)), istreambuf_iterator<char>());
|
std::string s((istreambuf_iterator<char>(&response)), istreambuf_iterator<char>());
|
||||||
s.resize(s.length() - 2);
|
s.resize(s.length() - 2);
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ void ControlSession::writer()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
boost::asio::streambuf streambuf;
|
asio::streambuf streambuf;
|
||||||
std::ostream stream(&streambuf);
|
std::ostream stream(&streambuf);
|
||||||
string message;
|
string message;
|
||||||
while (active_)
|
while (active_)
|
||||||
|
|
|
@ -24,14 +24,14 @@
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <boost/asio.hpp>
|
#include <asio.hpp>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include "message/message.h"
|
#include "message/message.h"
|
||||||
#include "common/queue.h"
|
#include "common/queue.h"
|
||||||
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
using asio::ip::tcp;
|
||||||
|
|
||||||
|
|
||||||
class ControlSession;
|
class ControlSession;
|
||||||
|
|
|
@ -127,11 +127,11 @@ int main(int argc, char* argv[])
|
||||||
settings.bufferMs = 400;
|
settings.bufferMs = 400;
|
||||||
settings.sampleFormat = sampleFormat;
|
settings.sampleFormat = sampleFormat;
|
||||||
|
|
||||||
boost::asio::io_service io_service;
|
asio::io_service io_service;
|
||||||
std::unique_ptr<StreamServer> streamServer(new StreamServer(&io_service, settings));
|
std::unique_ptr<StreamServer> streamServer(new StreamServer(&io_service, settings));
|
||||||
streamServer->start();
|
streamServer->start();
|
||||||
|
|
||||||
auto func = [](boost::asio::io_service* ioservice)->void{ioservice->run();};
|
auto func = [](asio::io_service* ioservice)->void{ioservice->run();};
|
||||||
std::thread t(func, &io_service);
|
std::thread t(func, &io_service);
|
||||||
|
|
||||||
while (!g_terminated)
|
while (!g_terminated)
|
||||||
|
|
|
@ -32,7 +32,7 @@ using namespace std;
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
|
|
||||||
StreamServer::StreamServer(boost::asio::io_service* io_service, const StreamServerSettings& streamServerSettings) : io_service_(io_service), settings_(streamServerSettings), sampleFormat_(streamServerSettings.sampleFormat)
|
StreamServer::StreamServer(asio::io_service* io_service, const StreamServerSettings& streamServerSettings) : io_service_(io_service), settings_(streamServerSettings), sampleFormat_(streamServerSettings.sampleFormat)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifndef STREAM_SERVER_H
|
#ifndef STREAM_SERVER_H
|
||||||
#define STREAM_SERVER_H
|
#define STREAM_SERVER_H
|
||||||
|
|
||||||
#include <boost/asio.hpp>
|
#include <asio.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
#include "controlServer.h"
|
#include "controlServer.h"
|
||||||
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
using asio::ip::tcp;
|
||||||
typedef std::shared_ptr<tcp::socket> socket_ptr;
|
typedef std::shared_ptr<tcp::socket> socket_ptr;
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ struct StreamServerSettings
|
||||||
class StreamServer : public MessageReceiver, ControlMessageReceiver, PcmListener
|
class StreamServer : public MessageReceiver, ControlMessageReceiver, PcmListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
StreamServer(boost::asio::io_service* io_service, const StreamServerSettings& streamServerSettings);
|
StreamServer(asio::io_service* io_service, const StreamServerSettings& streamServerSettings);
|
||||||
virtual ~StreamServer();
|
virtual ~StreamServer();
|
||||||
|
|
||||||
void start();
|
void start();
|
||||||
|
@ -100,7 +100,7 @@ private:
|
||||||
mutable std::mutex mutex_;
|
mutable std::mutex mutex_;
|
||||||
std::unique_ptr<PcmReader> pcmReader_;
|
std::unique_ptr<PcmReader> pcmReader_;
|
||||||
std::set<std::shared_ptr<StreamSession>> sessions_;
|
std::set<std::shared_ptr<StreamSession>> sessions_;
|
||||||
boost::asio::io_service* io_service_;
|
asio::io_service* io_service_;
|
||||||
std::shared_ptr<tcp::acceptor> acceptor_;
|
std::shared_ptr<tcp::acceptor> acceptor_;
|
||||||
|
|
||||||
StreamServerSettings settings_;
|
StreamServerSettings settings_;
|
||||||
|
|
|
@ -54,10 +54,10 @@ void StreamSession::stop()
|
||||||
setActive(false);
|
setActive(false);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
boost::system::error_code ec;
|
std::error_code ec;
|
||||||
if (socket_)
|
if (socket_)
|
||||||
{
|
{
|
||||||
socket_->shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
|
socket_->shutdown(asio::ip::tcp::socket::shutdown_both, ec);
|
||||||
if (ec) logE << "Error in socket shutdown: " << ec << "\n";
|
if (ec) logE << "Error in socket shutdown: " << ec << "\n";
|
||||||
socket_->close(ec);
|
socket_->close(ec);
|
||||||
if (ec) logE << "Error in socket close: " << ec << "\n";
|
if (ec) logE << "Error in socket close: " << ec << "\n";
|
||||||
|
@ -90,8 +90,8 @@ void StreamSession::socketRead(void* _to, size_t _bytes)
|
||||||
size_t read = 0;
|
size_t read = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
boost::system::error_code error;
|
std::error_code error;
|
||||||
read += socket_->read_some(boost::asio::buffer((char*)_to + read, _bytes - read));
|
read += socket_->read_some(asio::buffer((char*)_to + read, _bytes - read));
|
||||||
}
|
}
|
||||||
while (active_ && (read < _bytes));
|
while (active_ && (read < _bytes));
|
||||||
}
|
}
|
||||||
|
@ -114,12 +114,12 @@ bool StreamSession::send(const msg::BaseMessage* message) const
|
||||||
std::unique_lock<std::mutex> mlock(mutex_);
|
std::unique_lock<std::mutex> mlock(mutex_);
|
||||||
if (!socket_ || !active_)
|
if (!socket_ || !active_)
|
||||||
return false;
|
return false;
|
||||||
boost::asio::streambuf streambuf;
|
asio::streambuf streambuf;
|
||||||
std::ostream stream(&streambuf);
|
std::ostream stream(&streambuf);
|
||||||
tv t;
|
tv t;
|
||||||
message->sent = t;
|
message->sent = t;
|
||||||
message->serialize(stream);
|
message->serialize(stream);
|
||||||
boost::asio::write(*socket_.get(), streambuf);
|
asio::write(*socket_.get(), streambuf);
|
||||||
// logO << "done: " << message->type << ", size: " << message->size << ", id: " << message->id << ", refers: " << message->refersTo << "\n";
|
// logO << "done: " << message->type << ", size: " << message->size << ", id: " << message->id << ", refers: " << message->refersTo << "\n";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,7 @@ void StreamSession::writer()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
boost::asio::streambuf streambuf;
|
asio::streambuf streambuf;
|
||||||
std::ostream stream(&streambuf);
|
std::ostream stream(&streambuf);
|
||||||
shared_ptr<const msg::BaseMessage> message;
|
shared_ptr<const msg::BaseMessage> message;
|
||||||
while (active_)
|
while (active_)
|
||||||
|
|
|
@ -24,14 +24,14 @@
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <boost/asio.hpp>
|
#include <asio.hpp>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include "message/message.h"
|
#include "message/message.h"
|
||||||
#include "common/queue.h"
|
#include "common/queue.h"
|
||||||
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
using asio::ip::tcp;
|
||||||
|
|
||||||
|
|
||||||
class StreamSession;
|
class StreamSession;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue