summaryrefslogtreecommitdiffstats
path: root/src/server/Notification.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-08-20 20:59:48 +0000
committerDavid Robillard <d@drobilla.net>2011-08-20 20:59:48 +0000
commit769fd5a2c60ef39f0af68664b35c99f90b8d715b (patch)
treecfaeacafbeba957a349bc1511da86c988685f6e2 /src/server/Notification.cpp
parentc2d440f132983a1068caa23e6c3832ddecbabaa9 (diff)
downloadingen-769fd5a2c60ef39f0af68664b35c99f90b8d715b.tar.gz
ingen-769fd5a2c60ef39f0af68664b35c99f90b8d715b.tar.bz2
ingen-769fd5a2c60ef39f0af68664b35c99f90b8d715b.zip
Fix crash when sending port notifications (fix #741).
Use a simpler system for port change notifications (abusing Event, which is virtual and thus can't be ringbuffered safely, was the cause of this crash). git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@3438 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/server/Notification.cpp')
-rw-r--r--src/server/Notification.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/server/Notification.cpp b/src/server/Notification.cpp
new file mode 100644
index 00000000..652662f2
--- /dev/null
+++ b/src/server/Notification.cpp
@@ -0,0 +1,86 @@
+/* This file is part of Ingen.
+ * Copyright 2011 David 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 "shared/LV2URIMap.hpp"
+
+#include "ClientBroadcaster.hpp"
+#include "Notification.hpp"
+#include "PortImpl.hpp"
+
+namespace Ingen {
+namespace Server {
+
+Notification::Notification(Type y,
+ FrameTime t,
+ PortImpl* p,
+ const Raul::Atom& v,
+ const ControlBindings::Type bt)
+ : type(y)
+ , binding_type(bt)
+ , time(t)
+ , port(p)
+ , value(v)
+{}
+
+void
+Notification::post_process(Engine& engine)
+{
+ switch (type) {
+ case PORT_VALUE:
+ engine.broadcaster()->set_property(
+ port->path(),
+ engine.world()->uris()->ingen_value, value);
+ break;
+ case PORT_ACTIVITY:
+ engine.broadcaster()->activity(port->path());
+ break;
+ case PORT_BINDING: {
+ const Ingen::Shared::LV2URIMap& uris = *engine.world()->uris().get();
+ Raul::Atom::DictValue dict;
+ switch (binding_type) {
+ case ControlBindings::MIDI_CC:
+ dict[uris.rdf_type] = uris.midi_Controller;
+ dict[uris.midi_controllerNumber] = value.get_int32();
+ break;
+ case ControlBindings::MIDI_BENDER:
+ dict[uris.rdf_type] = uris.midi_Bender;
+ break;
+ case ControlBindings::MIDI_CHANNEL_PRESSURE:
+ dict[uris.rdf_type] = uris.midi_ChannelPressure;
+ break;
+ case ControlBindings::MIDI_NOTE:
+ dict[uris.rdf_type] = uris.midi_Note;
+ dict[uris.midi_noteNumber] = value.get_int32();
+ break;
+ case ControlBindings::MIDI_RPN: // TODO
+ case ControlBindings::MIDI_NRPN: // TODO
+ case ControlBindings::NULL_CONTROL:
+ break;
+ }
+ port->set_property(uris.ingen_controlBinding, dict); // FIXME: thread unsafe
+ engine.broadcaster()->set_property(port->path(),
+ uris.ingen_controlBinding,
+ dict);
+ break;
+ }
+ case NIL:
+ break;
+ }
+}
+
+} // namespace Server
+} // namespace Ingen