diff options
Diffstat (limited to 'libs/surfaces/generic_midi')
-rw-r--r-- | libs/surfaces/generic_midi/SConscript | 4 | ||||
-rw-r--r-- | libs/surfaces/generic_midi/generic_midi_control_protocol.cc | 34 | ||||
-rw-r--r-- | libs/surfaces/generic_midi/midicontrollable.cc | 5 | ||||
-rw-r--r-- | libs/surfaces/generic_midi/midicontrollable.h | 1 |
4 files changed, 34 insertions, 10 deletions
diff --git a/libs/surfaces/generic_midi/SConscript b/libs/surfaces/generic_midi/SConscript index 6c76e05464..b092188852 100644 --- a/libs/surfaces/generic_midi/SConscript +++ b/libs/surfaces/generic_midi/SConscript @@ -40,8 +40,8 @@ genericmidi.Merge ([ libraries['sigc2'], libraries['usb'], libraries['xml'], - libraries['glib2'], - libraries['glibmm2'] + libraries['glib2'], + libraries['glibmm2'] ]) libardour_genericmidi = genericmidi.SharedLibrary('ardour_genericmidi', genericmidi_files) diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index 0256d5c359..1a9570c6a2 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #define __STDC_FORMAT_MACROS 1 @@ -130,7 +129,18 @@ GenericMidiControlProtocol::start_learning (Controllable* c) return false; } - MIDIControllable* mc = new MIDIControllable (*_port, *c); + MIDIControllable* mc = 0; + + for (MIDIControllables::iterator i = controllables.begin(); i != controllables.end(); ++i) { + if ((*i)->get_controllable().id() == c->id()) { + mc = *i; + break; + } + } + + if (!mc) { + mc = new MIDIControllable (*_port, *c); + } { Glib::Mutex::Lock lm (pending_lock); @@ -164,6 +174,8 @@ void GenericMidiControlProtocol::stop_learning (Controllable* c) { Glib::Mutex::Lock lm (pending_lock); + Glib::Mutex::Lock lm2 (controllables_lock); + MIDIControllable* dptr = 0; /* learning timed out, and we've been told to consider this attempt to learn to be cancelled. find the relevant MIDIControllable and remove it from the pending list. @@ -172,11 +184,22 @@ GenericMidiControlProtocol::stop_learning (Controllable* c) for (MIDIControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ++i) { if (&(*i)->get_controllable() == c) { (*i)->stop_learning (); - delete (*i); + dptr = *i; pending_controllables.erase (i); break; } } + + for (MIDIControllables::iterator i = controllables.begin(); i != controllables.end(); ++i) { + if (&(*i)->get_controllable() == c) { + controllables.erase (i); + break; + } + } + + if (dptr) { + delete dptr; + } } XMLNode& @@ -248,7 +271,7 @@ GenericMidiControlProtocol::set_state (const XMLNode& node) ID id = prop->value (); - c = session->controllable_by_id (id); + c = Controllable::by_id (id); if (c) { MIDIControllable* mc = new MIDIControllable (*_port, *c); @@ -257,8 +280,7 @@ GenericMidiControlProtocol::set_state (const XMLNode& node) } } else { - warning << string_compose (_("Generic MIDI control: controllable %1 not found in session (ignored)"), - id) + warning << string_compose (_("Generic MIDI control: controllable %1 not found (ignored)"), id) << endmsg; } } diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index 75b5699f18..7f6f889df5 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: midicontrollable.cc 629 2006-06-21 23:01:03Z paul $ */ #include <cstdio> /* for sprintf, sigh */ @@ -99,6 +98,8 @@ MIDIControllable::stop_learning () void MIDIControllable::drop_external_control () { + cerr << "Dropping existing control using " << connections << " connections\n"; + if (connections > 0) { midi_sense_connection[0].disconnect (); } @@ -279,6 +280,8 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional) default: break; } + + cerr << "MIDI bound with " << connections << endl; } void diff --git a/libs/surfaces/generic_midi/midicontrollable.h b/libs/surfaces/generic_midi/midicontrollable.h index 8b63172916..7e0243971c 100644 --- a/libs/surfaces/generic_midi/midicontrollable.h +++ b/libs/surfaces/generic_midi/midicontrollable.h @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: controllable.h 4 2005-05-13 20:47:18Z taybin $ */ #ifndef __gm_midicontrollable_h__ |