diff options
Diffstat (limited to 'src/server/Context.cpp')
-rw-r--r-- | src/server/Context.cpp | 144 |
1 files changed, 0 insertions, 144 deletions
diff --git a/src/server/Context.cpp b/src/server/Context.cpp deleted file mode 100644 index 387bed8e..00000000 --- a/src/server/Context.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - 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/>. -*/ - -#include "ingen/Forge.hpp" -#include "ingen/Log.hpp" -#include "ingen/URIMap.hpp" - -#include "Broadcaster.hpp" -#include "BufferFactory.hpp" -#include "Context.hpp" -#include "Engine.hpp" -#include "PortImpl.hpp" - -namespace Ingen { -namespace Server { - -struct Notification -{ - inline Notification(PortImpl* p = 0, - FrameTime f = 0, - LV2_URID k = 0, - uint32_t s = 0, - LV2_URID t = 0) - : port(p), time(f), key(k), size(s), type(t) - {} - - PortImpl* port; - FrameTime time; - LV2_URID key; - uint32_t size; - LV2_URID type; -}; - -Context::Context(Engine& engine, ID id) - : _engine(engine) - , _id(id) - , _event_sink( - new Raul::RingBuffer(engine.event_queue_size() * sizeof(Notification))) - , _start(0) - , _end(0) - , _offset(0) - , _nframes(0) - , _realtime(true) - , _copy(false) -{} - -Context::Context(const Context& copy) - : _engine(copy._engine) - , _id(copy._id) - , _event_sink(copy._event_sink) - , _start(copy._start) - , _end(copy._end) - , _offset(copy._offset) - , _nframes(copy._nframes) - , _realtime(copy._realtime) - , _copy(true) -{} - -Context::~Context() -{ - if (!_copy) { - delete _event_sink; - } -} - -bool -Context::must_notify(const PortImpl* port) const -{ - return (port->is_monitored() || _engine.broadcaster()->must_broadcast()); -} - -bool -Context::notify(LV2_URID key, - FrameTime time, - PortImpl* port, - uint32_t size, - LV2_URID type, - const void* body) -{ - const Notification n(port, time, key, size, type); - if (_event_sink->write_space() < sizeof(n) + size) { - return false; - } - if (_event_sink->write(sizeof(n), &n) != sizeof(n)) { - _engine.log().error("Error writing header to notification ring\n"); - } else if (_event_sink->write(size, body) != size) { - _engine.log().error("Error writing body to notification ring\n"); - } else { - return true; - } - return false; -} - -void -Context::emit_notifications(FrameTime end) -{ - const URIs& uris = _engine.buffer_factory()->uris(); - const uint32_t read_space = _event_sink->read_space(); - Notification note; - for (uint32_t i = 0; i < read_space; i += sizeof(note)) { - if (_event_sink->peek(sizeof(note), ¬e) != sizeof(note) || - note.time >= end) { - return; - } - if (_event_sink->read(sizeof(note), ¬e) == sizeof(note)) { - Atom value = _engine.world()->forge().alloc( - note.size, note.type, NULL); - if (_event_sink->read(note.size, value.get_body()) == note.size) { - i += note.size; - const char* key = _engine.world()->uri_map().unmap_uri(note.key); - if (key) { - _engine.broadcaster()->set_property( - note.port->uri(), Raul::URI(key), value); - if (note.port->is_input() && note.key == uris.ingen_value) { - // FIXME: not thread safe - note.port->set_property(uris.ingen_value, value); - } - } else { - _engine.log().error("Error unmapping notification key URI\n"); - } - } else { - _engine.log().error("Error reading body from notification ring\n"); - } - } else { - _engine.log().error("Error reading header from notification ring\n"); - } - } -} - -} // namespace Server -} // namespace Ingen |