summaryrefslogtreecommitdiffstats
path: root/src/server/events
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/events
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/events')
-rw-r--r--src/server/events/SendBinding.cpp55
-rw-r--r--src/server/events/SendBinding.hpp86
-rw-r--r--src/server/events/SendPortActivity.cpp36
-rw-r--r--src/server/events/SendPortActivity.hpp69
-rw-r--r--src/server/events/SendPortValue.cpp42
-rw-r--r--src/server/events/SendPortValue.hpp82
6 files changed, 0 insertions, 370 deletions
diff --git a/src/server/events/SendBinding.cpp b/src/server/events/SendBinding.cpp
deleted file mode 100644
index ebfa21dd..00000000
--- a/src/server/events/SendBinding.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/* This file is part of Ingen.
- * Copyright 2007-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 <sstream>
-#include "events/SendBinding.hpp"
-#include "shared/LV2URIMap.hpp"
-#include "Engine.hpp"
-#include "PortImpl.hpp"
-#include "ClientBroadcaster.hpp"
-
-using namespace std;
-
-namespace Ingen {
-namespace Server {
-namespace Events {
-
-void
-SendBinding::post_process()
-{
- const Ingen::Shared::LV2URIMap& uris = *_engine.world()->uris().get();
- Raul::Atom::DictValue dict;
- if (_type == ControlBindings::MIDI_CC) {
- dict[uris.rdf_type] = uris.midi_Controller;
- dict[uris.midi_controllerNumber] = _num;
- } else if (_type == ControlBindings::MIDI_BENDER) {
- dict[uris.rdf_type] = uris.midi_Bender;
- } else if (_type == ControlBindings::MIDI_CHANNEL_PRESSURE) {
- dict[uris.rdf_type] = uris.midi_ChannelPressure;
- } else if (_type == ControlBindings::MIDI_NOTE) {
- dict[uris.rdf_type] = uris.midi_Note;
- dict[uris.midi_noteNumber] = _num;
- }
- // TODO: other event types
- _port->set_property(uris.ingen_controlBinding, dict); // FIXME: thread unsafe
- _engine.broadcaster()->set_property(_port->path(), uris.ingen_controlBinding, dict);
-}
-
-} // namespace Server
-} // namespace Ingen
-} // namespace Events
-
diff --git a/src/server/events/SendBinding.hpp b/src/server/events/SendBinding.hpp
deleted file mode 100644
index f3727ece..00000000
--- a/src/server/events/SendBinding.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/* This file is part of Ingen.
- * Copyright 2007-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
- */
-
-#ifndef INGEN_EVENTS_SENDBINDING_HPP
-#define INGEN_EVENTS_SENDBINDING_HPP
-
-#include "server/Event.hpp"
-#include "server/ControlBindings.hpp"
-#include "server/types.hpp"
-
-namespace Ingen {
-namespace Server {
-
-class PortImpl;
-
-namespace Events {
-
-/** A special event used internally to send control bindings from the audio thread.
- *
- * See SendPortValue documentation for details.
- *
- * \ingroup engine
- */
-class SendBinding : public Event
-{
-public:
- inline SendBinding(
- Engine& engine,
- SampleCount timestamp,
- PortImpl* port,
- ControlBindings::Type type,
- int16_t num)
- : Event(engine, SharedPtr<Request>(), timestamp)
- , _port(port)
- , _type(type)
- , _num(num)
- {
- assert(_port);
- switch (type) {
- case ControlBindings::MIDI_CC:
- assert(num >= 0 && num < 128);
- break;
- case ControlBindings::MIDI_RPN:
- assert(num >= 0 && num < 16384);
- break;
- case ControlBindings::MIDI_NRPN:
- assert(num >= 0 && num < 16384);
- default:
- break;
- }
- }
-
- inline SendBinding& operator=(const SendBinding& ev) {
- _port = ev._port;
- _type = ev._type;
- _num = ev._num;
- return *this;
- }
-
- void post_process();
-
-private:
- PortImpl* _port;
- ControlBindings::Type _type;
- int16_t _num;
-};
-
-} // namespace Server
-} // namespace Ingen
-} // namespace Events
-
-#endif // INGEN_EVENTS_SENDBINDING_HPP
diff --git a/src/server/events/SendPortActivity.cpp b/src/server/events/SendPortActivity.cpp
deleted file mode 100644
index 8ff960e2..00000000
--- a/src/server/events/SendPortActivity.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/* This file is part of Ingen.
- * Copyright 2007-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 "events/SendPortActivity.hpp"
-#include "Engine.hpp"
-#include "PortImpl.hpp"
-#include "ClientBroadcaster.hpp"
-
-namespace Ingen {
-namespace Server {
-namespace Events {
-
-void
-SendPortActivity::post_process()
-{
- _engine.broadcaster()->activity(_port->path());
-}
-
-} // namespace Server
-} // namespace Ingen
-} // namespace Events
-
diff --git a/src/server/events/SendPortActivity.hpp b/src/server/events/SendPortActivity.hpp
deleted file mode 100644
index dd74a68a..00000000
--- a/src/server/events/SendPortActivity.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/* This file is part of Ingen.
- * Copyright 2007-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
- */
-
-#ifndef INGEN_EVENTS_SENDPORTACTIVITY_HPP
-#define INGEN_EVENTS_SENDPORTACTIVITY_HPP
-
-#include "Event.hpp"
-#include "types.hpp"
-
-namespace Ingen {
-namespace Server {
-
-class PortImpl;
-
-namespace Events {
-
-/** A special event used internally to send port activity notification (e.g.
- * MIDI event activity) from the audio thread.
- *
- * This is created in the audio thread (directly in a ringbuffer, not new'd)
- * 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 really makes sense for message ports.
- *
- * \ingroup engine
- */
-class SendPortActivity : public Event
-{
-public:
- inline SendPortActivity(Engine& engine,
- SampleCount timestamp,
- PortImpl* port)
- : Event(engine, SharedPtr<Request>(), timestamp)
- , _port(port)
- {
- }
-
- inline SendPortActivity& operator=(const SendPortActivity& ev) {
- _port = ev._port;
- return *this;
- }
-
- void post_process();
-
-private:
- PortImpl* _port;
-};
-
-} // namespace Server
-} // namespace Ingen
-} // namespace Events
-
-#endif // INGEN_EVENTS_SENDPORTACTIVITY_HPP
diff --git a/src/server/events/SendPortValue.cpp b/src/server/events/SendPortValue.cpp
deleted file mode 100644
index 1364b692..00000000
--- a/src/server/events/SendPortValue.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/* This file is part of Ingen.
- * Copyright 2007-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 <sstream>
-#include "events/SendPortValue.hpp"
-#include "shared/LV2URIMap.hpp"
-#include "Engine.hpp"
-#include "PortImpl.hpp"
-#include "ClientBroadcaster.hpp"
-
-using namespace std;
-
-namespace Ingen {
-namespace Server {
-namespace Events {
-
-void
-SendPortValue::post_process()
-{
- _engine.broadcaster()->set_property(
- _port->path(),
- _engine.world()->uris()->ingen_value, _value);
-}
-
-} // namespace Server
-} // namespace Ingen
-} // namespace Events
-
diff --git a/src/server/events/SendPortValue.hpp b/src/server/events/SendPortValue.hpp
deleted file mode 100644
index 4465ef00..00000000
--- a/src/server/events/SendPortValue.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/* This file is part of Ingen.
- * Copyright 2007-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
- */
-
-#ifndef INGEN_EVENTS_SENDPORTVALUE_HPP
-#define INGEN_EVENTS_SENDPORTVALUE_HPP
-
-#include "raul/Atom.hpp"
-#include "server/Event.hpp"
-#include "server/types.hpp"
-
-namespace Ingen {
-namespace Server {
-
-class PortImpl;
-
-namespace Events {
-
-/** 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.
- *
- * \ingroup engine
- */
-class SendPortValue : public Event
-{
-public:
- inline SendPortValue(
- Engine& engine,
- SampleCount timestamp,
- PortImpl* port,
- bool omni,
- uint32_t voice_num,
- const Raul::Atom& value)
- : Event(engine, SharedPtr<Request>(), timestamp)
- , _port(port)
- , _omni(omni)
- , _voice_num(voice_num)
- , _value(value)
- {
- }
-
- inline SendPortValue& operator=(const SendPortValue& ev) {
- _port = ev._port;
- _omni = ev._omni;
- _voice_num = ev._voice_num;
- _value = ev._value;
- return *this;
- }
-
- void post_process();
-
-private:
- PortImpl* _port;
- bool _omni;
- uint32_t _voice_num;
- Raul::Atom _value;
-};
-
-} // namespace Server
-} // namespace Ingen
-} // namespace Events
-
-#endif // INGEN_EVENTS_SENDPORTVALUE_HPP