summaryrefslogtreecommitdiffstats
path: root/src/libs/engine/events
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-09-29 21:39:53 +0000
committerDavid Robillard <d@drobilla.net>2007-09-29 21:39:53 +0000
commitc0af61632938f161dd2e15dec3c5260a3d5427ca (patch)
tree950bcfc1bc1fb232f8244c42504b8da3d5b511f5 /src/libs/engine/events
parent85923e8b4f9f1601f008a9120d376d944f2478a2 (diff)
downloadingen-c0af61632938f161dd2e15dec3c5260a3d5427ca.tar.gz
ingen-c0af61632938f161dd2e15dec3c5260a3d5427ca.tar.bz2
ingen-c0af61632938f161dd2e15dec3c5260a3d5427ca.zip
Work towards port monitoring and better (higher utilization) parallel execution.
git-svn-id: http://svn.drobilla.net/lad/ingen@784 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/events')
-rw-r--r--src/libs/engine/events/EnablePortNotificationEvent.cpp80
-rw-r--r--src/libs/engine/events/EnablePortNotificationEvent.hpp58
-rw-r--r--src/libs/engine/events/Makefile.am4
-rw-r--r--src/libs/engine/events/RequestPortValueEvent.cpp21
-rw-r--r--src/libs/engine/events/SendPortValueEvent.cpp61
-rw-r--r--src/libs/engine/events/SendPortValueEvent.hpp80
-rw-r--r--src/libs/engine/events/SetPortValueEvent.cpp14
7 files changed, 304 insertions, 14 deletions
diff --git a/src/libs/engine/events/EnablePortNotificationEvent.cpp b/src/libs/engine/events/EnablePortNotificationEvent.cpp
new file mode 100644
index 00000000..992c1615
--- /dev/null
+++ b/src/libs/engine/events/EnablePortNotificationEvent.cpp
@@ -0,0 +1,80 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) 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 General Public License for details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "RequestPortValueEvent.hpp"
+#include <string>
+#include "interface/ClientInterface.hpp"
+#include "Responder.hpp"
+#include "Engine.hpp"
+#include "Port.hpp"
+#include "ObjectStore.hpp"
+#include "ClientBroadcaster.hpp"
+#include "AudioBuffer.hpp"
+
+using std::string;
+
+namespace Ingen {
+
+
+RequestPortValueEvent::RequestPortValueEvent(Engine& engine, SharedPtr<Responder> responder, SampleCount timestamp, const string& port_path)
+: QueuedEvent(engine, responder, timestamp),
+ _port_path(port_path),
+ _port(NULL),
+ _value(0.0)
+{
+}
+
+
+void
+RequestPortValueEvent::pre_process()
+{
+ _port = _engine.object_store()->find_port(_port_path);
+
+ QueuedEvent::pre_process();
+}
+
+
+void
+RequestPortValueEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
+{
+ QueuedEvent::execute(nframes, start, end);
+ assert(_time >= start && _time <= end);
+
+ if (_port != NULL && _port->type() == DataType::FLOAT)
+ _value = ((AudioBuffer*)_port->buffer(0))->value_at(0/*_time - start*/);
+ else
+ _port = NULL; // triggers error response
+}
+
+
+void
+RequestPortValueEvent::post_process()
+{
+ string msg;
+ if (!_port) {
+ _responder->respond_error("Unable to find port for get_value responder.");
+ } else if (_responder->client()) {
+ _responder->respond_ok();
+ _responder->client()->control_change(_port_path, _value);
+ } else {
+ _responder->respond_error("Unable to find client to send port value");
+ }
+}
+
+
+} // namespace Ingen
+
diff --git a/src/libs/engine/events/EnablePortNotificationEvent.hpp b/src/libs/engine/events/EnablePortNotificationEvent.hpp
new file mode 100644
index 00000000..522af143
--- /dev/null
+++ b/src/libs/engine/events/EnablePortNotificationEvent.hpp
@@ -0,0 +1,58 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) 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 General Public License for details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef ENABLEPORTNOTIFICATIONEVENT_H
+#define ENABLEPORTNOTIFICATIONEVENT_H
+
+#include <string>
+#include "QueuedEvent.hpp"
+#include "types.hpp"
+
+using std::string;
+
+namespace Ingen {
+
+class Port;
+namespace Shared { class ClientInterface; }
+using Shared::ClientInterface;
+
+
+/** Enable sending of dynamic value change notifications for a port.
+ *
+ * \ingroup engine
+ */
+class EnablePortNotificationEvent : public QueuedEvent
+{
+public:
+ EnablePortNotificationEvent(Engine& engine,
+ SharedPtr<Responder> responder,
+ SampleCount timestamp,
+ const std::string& port_path);
+
+ void pre_process();
+ void execute(SampleCount nframes, FrameTime start, FrameTime end);
+ void post_process();
+
+private:
+ const std::string _port_path;
+ Port* _port;
+};
+
+
+} // namespace Ingen
+
+#endif // ENABLEPORTNOTIFICATIONEVENT_H
diff --git a/src/libs/engine/events/Makefile.am b/src/libs/engine/events/Makefile.am
index f3190756..a97c3bba 100644
--- a/src/libs/engine/events/Makefile.am
+++ b/src/libs/engine/events/Makefile.am
@@ -33,6 +33,8 @@ EXTRA_DIST = \
DisconnectionEvent.hpp \
EnablePatchEvent.cpp \
EnablePatchEvent.hpp \
+ EnablePortNotificationEvent.cpp \
+ EnablePortNotificationEvent.hpp \
LoadPluginsEvent.cpp \
LoadPluginsEvent.hpp \
MidiLearnEvent.cpp \
@@ -58,6 +60,8 @@ EXTRA_DIST = \
RequestPluginsEvent.hpp \
RequestPortValueEvent.cpp \
RequestPortValueEvent.hpp \
+ SendPortValueEvent.cpp \
+ SendPortValueEvent.hpp \
SetMetadataEvent.cpp \
SetMetadataEvent.hpp \
SetPolyphonyEvent.hpp \
diff --git a/src/libs/engine/events/RequestPortValueEvent.cpp b/src/libs/engine/events/RequestPortValueEvent.cpp
index 992c1615..34545670 100644
--- a/src/libs/engine/events/RequestPortValueEvent.cpp
+++ b/src/libs/engine/events/RequestPortValueEvent.cpp
@@ -15,9 +15,9 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "RequestPortValueEvent.hpp"
#include <string>
#include "interface/ClientInterface.hpp"
+#include "events/EnablePortNotificationEvent.hpp"
#include "Responder.hpp"
#include "Engine.hpp"
#include "Port.hpp"
@@ -30,17 +30,19 @@ using std::string;
namespace Ingen {
-RequestPortValueEvent::RequestPortValueEvent(Engine& engine, SharedPtr<Responder> responder, SampleCount timestamp, const string& port_path)
+EnablePortNotificationEvent::EnablePortNotificationEvent(Engine& engine,
+ SharedPtr<Responder> responder,
+ SampleCount timestamp,
+ const std::string& port_path)
: QueuedEvent(engine, responder, timestamp),
_port_path(port_path),
- _port(NULL),
- _value(0.0)
+ _port(NULL)
{
}
void
-RequestPortValueEvent::pre_process()
+EnablePortNotificationEvent::pre_process()
{
_port = _engine.object_store()->find_port(_port_path);
@@ -49,21 +51,25 @@ RequestPortValueEvent::pre_process()
void
-RequestPortValueEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
+EnablePortNotificationEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
{
QueuedEvent::execute(nframes, start, end);
+
+#if 0
assert(_time >= start && _time <= end);
if (_port != NULL && _port->type() == DataType::FLOAT)
_value = ((AudioBuffer*)_port->buffer(0))->value_at(0/*_time - start*/);
else
_port = NULL; // triggers error response
+#endif
}
void
-RequestPortValueEvent::post_process()
+EnablePortNotificationEvent::post_process()
{
+#if 0
string msg;
if (!_port) {
_responder->respond_error("Unable to find port for get_value responder.");
@@ -73,6 +79,7 @@ RequestPortValueEvent::post_process()
} else {
_responder->respond_error("Unable to find client to send port value");
}
+#endif
}
diff --git a/src/libs/engine/events/SendPortValueEvent.cpp b/src/libs/engine/events/SendPortValueEvent.cpp
new file mode 100644
index 00000000..d537011d
--- /dev/null
+++ b/src/libs/engine/events/SendPortValueEvent.cpp
@@ -0,0 +1,61 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) 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 General Public License for details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <sstream>
+#include "Responder.hpp"
+#include "SendPortValueEvent.hpp"
+#include "Engine.hpp"
+#include "Port.hpp"
+#include "ClientBroadcaster.hpp"
+#include "Node.hpp"
+#include "ObjectStore.hpp"
+#include "AudioBuffer.hpp"
+#include "MidiBuffer.hpp"
+
+using namespace std;
+
+namespace Ingen {
+
+
+SendPortValueEvent(Engine& engine,
+ SampleCount timestamp,
+ Port* port,
+ bool omni,
+ uint32_t voice_num,
+ float value)
+ : _port(port)
+ , _omni(omni)
+ , _voice_num(voice_num)
+ , _value(value)
+{
+}
+
+
+void
+SendPortValueEvent::post_process()
+{
+ if (_omni) {
+ _engine.broadcaster()->send_control_change(_port->path(), _value);
+ } else {
+ cerr << "NON-OMNI CONTROL CHANGE WHAT?" << endl;
+ _engine.broadcaster()->send_control_change(_port->path(), _value);
+ }
+}
+
+
+} // namespace Ingen
+
diff --git a/src/libs/engine/events/SendPortValueEvent.hpp b/src/libs/engine/events/SendPortValueEvent.hpp
new file mode 100644
index 00000000..d63d43b0
--- /dev/null
+++ b/src/libs/engine/events/SendPortValueEvent.hpp
@@ -0,0 +1,80 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) 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 General Public License for details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef SENDPORTVALUEEVENT_H
+#define SENDPORTVALUEEVENT_H
+
+#include <string>
+#include "Event.hpp"
+#include "types.hpp"
+using std::string;
+
+namespace Ingen {
+
+class Port;
+
+
+/** A special event used internally to send port values from the audio thread.
+ *
+ * This is created in the audio thread (using in-place new on a preallocated
+ * buffer) for processing in the post processing thread (unlike normal events
+ * which are created in the pre-processor thread then run through the audio
+ * thread). This event's job is done entirely in post_process.
+ *
+ * This only works for control ports right now. Variable size data is harder.
+ * Need some clever variable sized event RT allocation in flat buffer thingie..
+ *
+ * \ingroup engine
+ */
+class SendPortValueEvent : public Event
+{
+public:
+ SendPortValueEvent() {}
+
+ inline SendPortValueEvent(Engine& engine,
+ SampleCount timestamp,
+ Port* port,
+ bool omni,
+ uint32_t voice_num,
+ Sample value)
+ : _port(port)
+ , _omni(omni)
+ , _voice_num(voice_num)
+ , _value(value)
+ {
+ }
+
+ inline void operator=(const SendPortValueEvent& ev) {
+ _port = ev._port;
+ _omni = ev._omni;
+ _voice_num = ev._voice_num;
+ _value = ev._value;
+ }
+
+ void post_process();
+
+private:
+ Port* _port;
+ bool _omni;
+ uint32_t _voice_num;
+ Sample _value;
+};
+
+
+} // namespace Ingen
+
+#endif // SENDPORTVALUEEVENT_H
diff --git a/src/libs/engine/events/SetPortValueEvent.cpp b/src/libs/engine/events/SetPortValueEvent.cpp
index 9d1ad0db..c1f3c890 100644
--- a/src/libs/engine/events/SetPortValueEvent.cpp
+++ b/src/libs/engine/events/SetPortValueEvent.cpp
@@ -32,7 +32,7 @@ namespace Ingen {
/** Omni (all voices) control setting */
-SetPortValueEvent::SetPortValueEvent(Engine& engine,
+SetPortValueEvent::SetPortValueEvent(Engine& engine,
SharedPtr<Responder> responder,
SampleCount timestamp,
const string& port_path,
@@ -53,12 +53,12 @@ SetPortValueEvent::SetPortValueEvent(Engine& engine,
/** Voice-specific control setting */
SetPortValueEvent::SetPortValueEvent(Engine& engine,
- SharedPtr<Responder> responder,
- SampleCount timestamp,
- uint32_t voice_num,
- const string& port_path,
- uint32_t data_size,
- const void* data)
+ SharedPtr<Responder> responder,
+ SampleCount timestamp,
+ uint32_t voice_num,
+ const string& port_path,
+ uint32_t data_size,
+ const void* data)
: Event(engine, responder, timestamp),
_omni(false),
_voice_num(voice_num),