diff options
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/Engine.cpp | 19 | ||||
-rw-r--r-- | src/server/Engine.hpp | 6 | ||||
-rw-r--r-- | src/server/SocketServer.hpp | 61 | ||||
-rw-r--r-- | src/server/wscript | 3 |
4 files changed, 86 insertions, 3 deletions
diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp index 76755a2c..c905eed2 100644 --- a/src/server/Engine.cpp +++ b/src/server/Engine.cpp @@ -1,6 +1,6 @@ /* This file is part of Ingen. - Copyright 2007-2013 David Robillard <http://drobilla.net/> + Copyright 2007-2015 David Robillard <http://drobilla.net/> Ingen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free @@ -14,6 +14,8 @@ along with Ingen. If not, see <http://www.gnu.org/licenses/>. */ +#include "ingen_config.h" + #include <sys/mman.h> #include <limits> @@ -45,6 +47,9 @@ #include "ProcessContext.hpp" #include "ThreadManager.hpp" #include "Worker.hpp" +#ifdef HAVE_SOCKET +#include "SocketListener.hpp" +#endif using namespace std; @@ -67,6 +72,7 @@ Engine::Engine(Ingen::World* world) , _post_processor(new PostProcessor(*this)) , _root_graph(NULL) , _worker(new Worker(world->log(), event_queue_size())) + , _listener(NULL) , _process_context(*this) , _rand_engine(0) , _uniform_dist(0.0f, 1.0f) @@ -119,6 +125,9 @@ Engine::~Engine() _world->set_store(SPtr<Ingen::Store>()); +#ifdef HAVE_SOCKET + delete _listener; +#endif delete _pre_processor; delete _post_processor; delete _block_factory; @@ -135,6 +144,14 @@ Engine::~Engine() munlockall(); } +void +Engine::listen() +{ +#ifdef HAVE_SOCKET + _listener = new SocketListener(*this); +#endif +} + SPtr<Store> Engine::store() const { diff --git a/src/server/Engine.hpp b/src/server/Engine.hpp index 851b3127..ecc90c9b 100644 --- a/src/server/Engine.hpp +++ b/src/server/Engine.hpp @@ -1,6 +1,6 @@ /* This file is part of Ingen. - Copyright 2007-2012 David Robillard <http://drobilla.net/> + Copyright 2007-2015 David Robillard <http://drobilla.net/> Ingen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free @@ -48,6 +48,7 @@ class LV2Options; class PostProcessor; class PreProcessor; class ProcessContext; +class SocketListener; class Worker; /** @@ -78,6 +79,8 @@ public: SPtr<Interface> client); virtual bool unregister_client(const Raul::URI& uri); + void listen(); + /** Return a random [0..1] float with uniform distribution */ float frand() { return _uniform_dist(_rand_engine); } @@ -130,6 +133,7 @@ private: PostProcessor* _post_processor; GraphImpl* _root_graph; Worker* _worker; + SocketListener* _listener; ProcessContext _process_context; diff --git a/src/server/SocketServer.hpp b/src/server/SocketServer.hpp new file mode 100644 index 00000000..5ebcaa6f --- /dev/null +++ b/src/server/SocketServer.hpp @@ -0,0 +1,61 @@ +/* + This file is part of Ingen. + Copyright 2007-2015 David Robillard <http://drobilla.net/> + + Ingen is free software: you can redistribute it and/or modify it under the + terms of the GNU Affero General Public License as published by the Free + Software Foundation, either version 3 of the License, or any later version. + + Ingen 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 Affero General Public License for details. + + You should have received a copy of the GNU Affero General Public License + along with Ingen. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef INGEN_SERVER_SOCKET_SERVER_HPP +#define INGEN_SERVER_SOCKET_SERVER_HPP + +#include "raul/Socket.hpp" + +#include "ingen/SocketReader.hpp" +#include "ingen/SocketWriter.hpp" + +#include "EventWriter.hpp" + +namespace Ingen { +namespace Server { + +/** The server side of an Ingen socket connection. */ +class SocketServer : public EventWriter, public SocketReader +{ +public: + SocketServer(World& world, + Server::Engine& engine, + SPtr<Raul::Socket> sock) + : EventWriter(engine) + , SocketReader(world, *this, sock) + , _engine(engine) + , _writer(new SocketWriter(world.uri_map(), + world.uris(), + sock->uri(), + sock)) + { + set_respondee(_writer); + engine.register_client(_writer->uri(), _writer); + } + + ~SocketServer() { + _engine.unregister_client(_writer->uri()); + } + +private: + Server::Engine& _engine; + SPtr<SocketWriter> _writer; +}; + +} // namespace Ingen +} // namespace Socket + +#endif // INGEN_SERVER_SOCKET_SERVER_HPP diff --git a/src/server/wscript b/src/server/wscript index 76362fa5..9d1238a4 100644 --- a/src/server/wscript +++ b/src/server/wscript @@ -25,6 +25,7 @@ def build(bld): PortImpl.cpp PostProcessor.cpp PreProcessor.cpp + SocketListener.cpp Worker.cpp events/Connect.cpp events/CreateBlock.cpp @@ -53,7 +54,7 @@ def build(bld): name = 'libingen_server', target = 'ingen_server', install_path = '${LIBDIR}', - use = 'libingen', + use = 'libingen libingen_socket', cxxflags = bld.env.PTHREAD_CFLAGS, linkflags = bld.env.PTHREAD_LINKFLAGS) core_libs = 'GLIBMM LV2 LILV RAUL SERD SORD' |