summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-05-03 00:42:34 +0000
committerDavid Robillard <d@drobilla.net>2012-05-03 00:42:34 +0000
commit93fb77a658d4d78fc64f3b8b84ed28dd94b3e6f8 (patch)
tree4e6b8e35b3922bd2786f966314b41d86d45754cc /src/server
parente114ea3254cea61fb97213e18be8bf266bcc1be1 (diff)
downloadingen-93fb77a658d4d78fc64f3b8b84ed28dd94b3e6f8.tar.gz
ingen-93fb77a658d4d78fc64f3b8b84ed28dd94b3e6f8.tar.bz2
ingen-93fb77a658d4d78fc64f3b8b84ed28dd94b3e6f8.zip
More work towards separating event interfaces from queueing implementation.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4318 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/server')
-rw-r--r--src/server/EventQueue.cpp2
-rw-r--r--src/server/EventQueue.hpp4
-rw-r--r--src/server/EventSink.hpp37
-rw-r--r--src/server/EventSource.hpp47
-rw-r--r--src/server/ServerInterfaceImpl.cpp22
5 files changed, 99 insertions, 13 deletions
diff --git a/src/server/EventQueue.cpp b/src/server/EventQueue.cpp
index ffafe17a..8cb979ca 100644
--- a/src/server/EventQueue.cpp
+++ b/src/server/EventQueue.cpp
@@ -39,7 +39,7 @@ EventQueue::~EventQueue()
/** Push an unprepared event onto the queue.
*/
void
-EventQueue::push_queued(Event* const ev)
+EventQueue::event(Event* const ev)
{
assert(!ev->is_prepared());
assert(!ev->next());
diff --git a/src/server/EventQueue.hpp b/src/server/EventQueue.hpp
index e1adbd6b..a3567574 100644
--- a/src/server/EventQueue.hpp
+++ b/src/server/EventQueue.hpp
@@ -20,6 +20,7 @@
#include "raul/AtomicPtr.hpp"
#include "raul/Slave.hpp"
+#include "EventSink.hpp"
#include "EventSource.hpp"
namespace Ingen {
@@ -32,6 +33,7 @@ class ProcessContext;
/** An EventSource which prepares events in its own thread.
*/
class EventQueue : public EventSource
+ , public EventSink
, public Raul::Slave
{
public:
@@ -44,7 +46,7 @@ public:
inline bool empty() const { return !_head.get(); }
protected:
- void push_queued(Event* const ev);
+ void event(Event* ev);
virtual void _whipped(); ///< Prepare 1 event
diff --git a/src/server/EventSink.hpp b/src/server/EventSink.hpp
new file mode 100644
index 00000000..e24fa5e9
--- /dev/null
+++ b/src/server/EventSink.hpp
@@ -0,0 +1,37 @@
+/*
+ This file is part of Ingen.
+ Copyright 2007-2012 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_ENGINE_EVENTSINK_HPP
+#define INGEN_ENGINE_EVENTSINK_HPP
+
+namespace Ingen {
+namespace Server {
+
+class Event;
+
+class EventSink
+{
+public:
+ virtual ~EventSink() {}
+
+ virtual void event(Event* ev) = 0;
+};
+
+} // namespace Server
+} // namespace Ingen
+
+#endif // INGEN_ENGINE_EVENTSINK_HPP
+
diff --git a/src/server/EventSource.hpp b/src/server/EventSource.hpp
new file mode 100644
index 00000000..4425586d
--- /dev/null
+++ b/src/server/EventSource.hpp
@@ -0,0 +1,47 @@
+/*
+ This file is part of Ingen.
+ Copyright 2007-2012 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_ENGINE_EVENTSOURCE_HPP
+#define INGEN_ENGINE_EVENTSOURCE_HPP
+
+namespace Ingen {
+namespace Server {
+
+class Event;
+class PostProcessor;
+class ProcessContext;
+
+/** Source for events to run in the audio thread.
+ *
+ * The Driver gets events from an EventQueue in the process callback and
+ * executes them, then they are sent to the PostProcessor and finalised
+ * (post-processing thread).
+ */
+class EventSource
+{
+public:
+ virtual ~EventSource() {}
+
+ virtual void process(PostProcessor& dest,
+ ProcessContext& context,
+ bool limit = true) = 0;
+};
+
+} // namespace Server
+} // namespace Ingen
+
+#endif // INGEN_ENGINE_EVENTSOURCE_HPP
+
diff --git a/src/server/ServerInterfaceImpl.cpp b/src/server/ServerInterfaceImpl.cpp
index 492139ed..d3f151e7 100644
--- a/src/server/ServerInterfaceImpl.cpp
+++ b/src/server/ServerInterfaceImpl.cpp
@@ -94,7 +94,7 @@ ServerInterfaceImpl::put(const URI& uri,
const Resource::Properties& properties,
const Resource::Graph ctx)
{
- push_queued(new Events::SetMetadata(_engine, _request_client, _request_id, now(), true, ctx, uri, properties));
+ event(new Events::SetMetadata(_engine, _request_client, _request_id, now(), true, ctx, uri, properties));
}
void
@@ -102,14 +102,14 @@ ServerInterfaceImpl::delta(const URI& uri,
const Resource::Properties& remove,
const Resource::Properties& add)
{
- push_queued(new Events::SetMetadata(_engine, _request_client, _request_id, now(), false, Resource::DEFAULT, uri, add, remove));
+ event(new Events::SetMetadata(_engine, _request_client, _request_id, now(), false, Resource::DEFAULT, uri, add, remove));
}
void
ServerInterfaceImpl::move(const Path& old_path,
const Path& new_path)
{
- push_queued(new Events::Move(_engine, _request_client, _request_id, now(), old_path, new_path));
+ event(new Events::Move(_engine, _request_client, _request_id, now(), old_path, new_path));
}
void
@@ -121,7 +121,7 @@ ServerInterfaceImpl::del(const URI& uri)
}
_engine.quit();
} else {
- push_queued(new Events::Delete(_engine, _request_client, _request_id, now(), uri));
+ event(new Events::Delete(_engine, _request_client, _request_id, now(), uri));
}
}
@@ -129,7 +129,7 @@ void
ServerInterfaceImpl::connect(const Path& tail_path,
const Path& head_path)
{
- push_queued(new Events::Connect(_engine, _request_client, _request_id, now(), tail_path, head_path));
+ event(new Events::Connect(_engine, _request_client, _request_id, now(), tail_path, head_path));
}
@@ -143,7 +143,7 @@ ServerInterfaceImpl::disconnect(const Path& src,
return;
}
- push_queued(new Events::Disconnect(_engine, _request_client, _request_id, now(),
+ event(new Events::Disconnect(_engine, _request_client, _request_id, now(),
Path(src.str()), Path(dst.str())));
}
@@ -151,7 +151,7 @@ void
ServerInterfaceImpl::disconnect_all(const Path& patch_path,
const Path& path)
{
- push_queued(new Events::DisconnectAll(_engine, _request_client, _request_id, now(), patch_path, path));
+ event(new Events::DisconnectAll(_engine, _request_client, _request_id, now(), patch_path, path));
}
void
@@ -163,16 +163,16 @@ ServerInterfaceImpl::set_property(const URI& uri,
&& value.type() == _engine.world()->forge().Bool) {
if (value.get_bool()) {
_engine.activate();
- push_queued(new Events::Ping(_engine, _request_client, _request_id, now()));
+ event(new Events::Ping(_engine, _request_client, _request_id, now()));
} else {
- push_queued(new Events::Deactivate(_engine, _request_client, _request_id, now()));
+ event(new Events::Deactivate(_engine, _request_client, _request_id, now()));
}
} else {
Resource::Properties remove;
remove.insert(make_pair(predicate, _engine.world()->uris()->wildcard));
Resource::Properties add;
add.insert(make_pair(predicate, value));
- push_queued(new Events::SetMetadata(
+ event(new Events::SetMetadata(
_engine, _request_client, _request_id, now(), false, Resource::DEFAULT,
uri, add, remove));
}
@@ -183,7 +183,7 @@ ServerInterfaceImpl::set_property(const URI& uri,
void
ServerInterfaceImpl::get(const URI& uri)
{
- push_queued(new Events::Get(_engine, _request_client, _request_id, now(), uri));
+ event(new Events::Get(_engine, _request_client, _request_id, now(), uri));
}
} // namespace Server