From 1f9c3f34d95ecc148b2e796e6361d1c16f533d6c Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 18 Feb 2009 20:53:54 +0000 Subject: [PATCH] Fix MIDI controller feedback. Make control surfaces menu less weird. git-svn-id: svn://localhost/ardour2/branches/3.0@4625 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour_ui_ed.cc | 43 ++++++++++--------- libs/ardour/session_midi.cc | 4 +- libs/midi++2/jack_midiport.cc | 9 +++- libs/midi++2/midi++/jack.h | 1 + .../generic_midi_control_protocol.cc | 3 +- .../surfaces/generic_midi/midicontrollable.cc | 6 +-- 6 files changed, 33 insertions(+), 33 deletions(-) diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 703b7ed06a..1b4d434c15 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -715,20 +715,27 @@ ARDOUR_UI::build_control_surface_menu () /* !!! this has to match the top level entry from ardour.menus */ - string ui = "\n\n\n"; + string ui = "\n" + "\n" + "\n"; - for (i = ControlProtocolManager::instance().control_protocol_info.begin(); i != ControlProtocolManager::instance().control_protocol_info.end(); ++i) { + for (i = ControlProtocolManager::instance().control_protocol_info.begin(); + i != ControlProtocolManager::instance().control_protocol_info.end(); ++i) { if (!(*i)->mandatory) { + // Enable surface + string action_name = "Toggle"; action_name += legalize_for_path ((*i)->name); action_name += "Surface"; string action_label = (*i)->name; - Glib::RefPtr act = ActionManager::register_toggle_action (editor->editor_actions, action_name.c_str(), action_label.c_str(), - (bind (mem_fun (*this, &ARDOUR_UI::toggle_control_protocol), *i))); + Glib::RefPtr act = ActionManager::register_toggle_action ( + editor->editor_actions, action_name.c_str(), action_label.c_str(), (bind ( + mem_fun (*this, &ARDOUR_UI::toggle_control_protocol), + *i))); Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); @@ -742,27 +749,21 @@ ARDOUR_UI::build_control_surface_menu () ui += action_name; ui += "'/>\n"; - if ((*i)->supports_feedback) { - - string submenu_name = action_name; - - submenu_name += "SubMenu"; + // Enable feedback - ActionManager::register_action (editor->editor_actions, submenu_name.c_str(), _("Controls")); + if ((*i)->supports_feedback) { action_name += "Feedback"; - - Glib::RefPtr act = ActionManager::register_toggle_action (editor->editor_actions, action_name.c_str(), _("Feedback"), - (bind (mem_fun (*this, &ARDOUR_UI::toggle_control_protocol_feedback), - *i, - "Editor", - action_name))); - - ui += "\nprotocol) { Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index b85df5b714..f5dc9993d5 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -777,7 +777,6 @@ Session::change_midi_ports () * This resets the MTC code, the next quarter frame message that is sent will be * the first one with the beginning of this cycle as the new start point. */ - int Session::send_full_time_code(nframes_t nframes) { @@ -835,8 +834,7 @@ Session::send_full_time_code(nframes_t nframes) return 0; } - -/** Sends MTC (quarter-frame) messages for this cycle. +/** Send MTC (quarter-frame) messages for this cycle. * Must be called exactly once per cycle from the audio thread. Realtime safe. * This function assumes the state of full SMPTE is sane, eg. the slave is * expecting quarter frame messages and has the right frame of reference (any diff --git a/libs/midi++2/jack_midiport.cc b/libs/midi++2/jack_midiport.cc index 0f707a4b21..0eb867ebe7 100644 --- a/libs/midi++2/jack_midiport.cc +++ b/libs/midi++2/jack_midiport.cc @@ -89,6 +89,12 @@ JACK_MidiPort::cycle_start (nframes_t nframes) } } +void +JACK_MidiPort::cycle_end () +{ + flush(jack_port_get_buffer(_jack_output_port, _nframes_this_cycle)); +} + int JACK_MidiPort::write(byte * msg, size_t msglen, timestamp_t timestamp) { @@ -102,8 +108,7 @@ JACK_MidiPort::write(byte * msg, size_t msglen, timestamp_t timestamp) non_process_thread_fifo.get_write_vector (&vec); if (vec.len[0] + vec.len[1] < 1) { - error << "no space in FIFO for non-process thread MIDI write" - << endmsg; + error << "no space in FIFO for non-process thread MIDI write" << endmsg; return 0; } diff --git a/libs/midi++2/midi++/jack.h b/libs/midi++2/midi++/jack.h index 01f96671be..255264b1d8 100644 --- a/libs/midi++2/midi++/jack.h +++ b/libs/midi++2/midi++/jack.h @@ -53,6 +53,7 @@ public: virtual int selectable() const { return -1; } virtual void cycle_start(nframes_t nframes); + virtual void cycle_end(); static std::string typestring; diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index 9f6441eb4b..fbf27e18c7 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -125,8 +125,7 @@ GenericMidiControlProtocol::_send_feedback () return; } - // FIXME - //_port->write (buf, (int32_t) (end - buf)); + _port->write (buf, (int32_t) (end - buf), 0); } bool diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index 7bf730b0f5..1a044d8ef3 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -98,8 +98,6 @@ MIDIControllable::stop_learning () void MIDIControllable::drop_external_control () { - cerr << "Dropping existing control using " << connections << " connections\n"; - if (connections > 0) { midi_sense_connection[0].disconnect (); } @@ -286,8 +284,6 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional) default: break; } - - cerr << "MIDI bound with " << connections << endl; } void @@ -303,7 +299,7 @@ MIDIControllable::send_feedback () msg[1] = control_additional; msg[2] = (byte) (controllable.get_value() * 127.0f); - //_port.write (msg, 3); + _port.write (msg, 3, 0); } MIDI::byte* -- 2.30.2