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
This commit is contained in:
David Robillard 2009-02-18 20:53:54 +00:00
parent 22088e77a7
commit 1f9c3f34d9
6 changed files with 32 additions and 32 deletions

View file

@ -715,20 +715,27 @@ ARDOUR_UI::build_control_surface_menu ()
/* !!! this has to match the top level entry from ardour.menus */
string ui = "<menubar name='Main' action='MainMenu'>\n<menu name='Options' action='Options'>\n<menu action='ControlSurfaces'><separator/>\n";
string ui = "<menubar name='Main' action='MainMenu'>\n"
"<menu name='Options' action='Options'>\n"
"<menu action='ControlSurfaces'><separator/>\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<Action> 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<Action> 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<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
@ -742,27 +749,21 @@ ARDOUR_UI::build_control_surface_menu ()
ui += action_name;
ui += "'/>\n";
// Enable feedback
if ((*i)->supports_feedback) {
string submenu_name = action_name;
submenu_name += "SubMenu";
ActionManager::register_action (editor->editor_actions, submenu_name.c_str(), _("Controls"));
action_name += "Feedback";
string feedback_label = action_label + " " + _("Feedback");
Glib::RefPtr<Action> 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 += "<menu action='";
ui += submenu_name;
ui += "'>\n<menuitem action='";
Glib::RefPtr<Action> act = ActionManager::register_toggle_action (
editor->editor_actions, action_name.c_str(), feedback_label.c_str(), (bind (
mem_fun (*this, &ARDOUR_UI::toggle_control_protocol_feedback),
*i, "Editor", action_name)));
ui += "<menuitem action='";
ui += action_name;
ui += "'/>\n</menu>\n";
ui += "'/>\n";
if ((*i)->protocol) {
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);

View file

@ -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

View file

@ -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;
}

View file

@ -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;

View file

@ -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

View file

@ -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*