diff options
Diffstat (limited to 'libs/surfaces')
-rw-r--r-- | libs/surfaces/generic_midi/midicontrollable.cc | 52 | ||||
-rw-r--r-- | libs/surfaces/mackie/mackie_control_protocol.cc | 164 |
2 files changed, 108 insertions, 108 deletions
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index 8275d0849c..c16a0bdefd 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -1,6 +1,6 @@ /* Copyright (C) 1998-2006 Paul Davis - + This program 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 @@ -42,7 +42,7 @@ MIDIControllable::MIDIControllable (Port& p, Controllable& c, bool is_bistate) control_additional = (byte) -1; connections = 0; feedback = true; // for now - + /* use channel 0 ("1") as the initial channel */ midi_rebind (0); @@ -59,18 +59,18 @@ MIDIControllable::midi_forget () /* stop listening for incoming messages, but retain our existing event + type information. */ - + if (connections > 0) { midi_sense_connection[0].disconnect (); - } - + } + if (connections > 1) { midi_sense_connection[1].disconnect (); } - + connections = 0; midi_learn_connection.disconnect (); - + } void @@ -101,7 +101,7 @@ MIDIControllable::drop_external_control () { if (connections > 0) { midi_sense_connection[0].disconnect (); - } + } if (connections > 1) { midi_sense_connection[1].disconnect (); } @@ -147,14 +147,14 @@ MIDIControllable::midi_to_control(float val) return val / midi_range * control_range + control_min; } -void -MIDIControllable::midi_sense_note_on (Parser &p, EventTwoBytes *tb) +void +MIDIControllable::midi_sense_note_on (Parser &p, EventTwoBytes *tb) { midi_sense_note (p, tb, true); } -void -MIDIControllable::midi_sense_note_off (Parser &p, EventTwoBytes *tb) +void +MIDIControllable::midi_sense_note_off (Parser &p, EventTwoBytes *tb) { midi_sense_note (p, tb, false); } @@ -168,7 +168,7 @@ MIDIControllable::midi_sense_note (Parser &, EventTwoBytes *msg, bool is_on) /* Note: parser handles the use of zero velocity to mean note off. if we get called with is_on=true, then we - got a *real* note on. + got a *real* note on. */ if (msg->note_number == control_additional) { @@ -209,7 +209,7 @@ MIDIControllable::midi_sense_program_change (Parser &, byte msg) if (!bistate) { controllable.set_value (msg/127.0); last_value = (MIDI::byte) (controllable.get_value() * 127.0); // to prevent feedback fights - } + } } void @@ -221,7 +221,7 @@ MIDIControllable::midi_sense_pitchbend (Parser &, pitchbend_t pb) controllable.set_value ((pb/(float) SHRT_MAX)); last_value = (MIDI::byte) (controllable.get_value() * 127.0); // to prevent feedback fights -} +} void MIDIControllable::midi_receiver (Parser &, byte *msg, size_t /*len*/) @@ -257,7 +257,7 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional) if (_port.input() == 0) { return; } - + Parser& p = *_port.input(); int chn_i = chn; @@ -284,7 +284,7 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional) midi_sense_connection[0] = p.channel_note_on[chn_i].connect (mem_fun (*this, &MIDIControllable::midi_sense_note_on)); if (bistate) { - midi_sense_connection[1] = p.channel_note_off[chn_i].connect + midi_sense_connection[1] = p.channel_note_off[chn_i].connect (mem_fun (*this, &MIDIControllable::midi_sense_note_off)); connections = 2; } else { @@ -294,7 +294,7 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional) break; case MIDI::controller: - midi_sense_connection[0] = p.channel_controller[chn_i].connect + midi_sense_connection[0] = p.channel_controller[chn_i].connect (mem_fun (*this, &MIDIControllable::midi_sense_controller)); connections = 1; snprintf (buf, sizeof (buf), "MIDI control: Controller %d", control_additional); @@ -304,7 +304,7 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional) case MIDI::program: if (!bistate) { midi_sense_connection[0] = p.channel_program_change[chn_i].connect - (mem_fun (*this, + (mem_fun (*this, &MIDIControllable::midi_sense_program_change)); connections = 1; _control_description = "MIDI control: ProgramChange"; @@ -334,7 +334,7 @@ MIDIControllable::send_feedback () return; } - msg[0] = (control_type & 0xF0) | (control_channel & 0xF); + msg[0] = (control_type & 0xF0) | (control_channel & 0xF); msg[1] = control_additional; msg[2] = (byte) (control_to_midi(controllable.get_value())); @@ -345,9 +345,9 @@ MIDI::byte* MIDIControllable::write_feedback (MIDI::byte* buf, int32_t& bufsize, bool /*force*/) { if (control_type != none && feedback && bufsize > 2) { - + MIDI::byte gm = (MIDI::byte) (control_to_midi(controllable.get_value())); - + if (gm != last_value) { *buf++ = (0xF0 & control_type) | (0xF & control_channel); *buf++ = control_additional; /* controller number */ @@ -356,12 +356,12 @@ MIDIControllable::write_feedback (MIDI::byte* buf, int32_t& bufsize, bool /*forc bufsize -= 3; } } - + return buf; } -int -MIDIControllable::set_state (const XMLNode& node, int version) +int +MIDIControllable::set_state (const XMLNode& node, int /*version*/) { const XMLProperty* prop; int xx; @@ -394,7 +394,7 @@ MIDIControllable::set_state (const XMLNode& node, int version) } bind_midi (control_channel, control_type, control_additional); - + return 0; } diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 5fef10fac4..cc33585b62 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -187,7 +187,7 @@ MackiePort & MackieControlProtocol::port_for_id( uint32_t index ) current_max += (*it)->strips(); if ( index < current_max ) return **it; } - + // oops - no matching port ostringstream os; os << "No port for index " << index; @@ -216,15 +216,15 @@ struct RouteByRemoteId MackieControlProtocol::Sorted MackieControlProtocol::get_sorted_routes() { Sorted sorted; - + // fetch all routes boost::shared_ptr<RouteList> routes = session->get_routes(); set<uint32_t> remote_ids; - + // routes with remote_id 0 should never be added // TODO verify this with ardour devs // remote_ids.insert( 0 ); - + // sort in remote_id order, and exclude master, control and hidden routes // and any routes that are already set. for (RouteList::iterator it = routes->begin(); it != routes->end(); ++it ) @@ -255,7 +255,7 @@ void MackieControlProtocol::switch_banks( int initial ) { // DON'T prevent bank switch if initial == _current_initial_bank // because then this method can't be used as a refresh - + // sanity checking Sorted sorted = get_sorted_routes(); int delta = sorted.size() - route_table.size(); @@ -267,11 +267,11 @@ void MackieControlProtocol::switch_banks( int initial ) return; } _current_initial_bank = initial; - + // first clear the signals from old routes // taken care of by the RouteSignal destructors clear_route_signals(); - + // now set the signals for new routes if ( _current_initial_bank <= sorted.size() ) { @@ -282,7 +282,7 @@ void MackieControlProtocol::switch_banks( int initial ) #ifdef DEBUG cout << "switch to " << _current_initial_bank << ", " << end_pos << endl; #endif - + // link routes to strips uint32_t i = 0; for ( ; it != end && it != sorted.end(); ++it, ++i ) @@ -298,7 +298,7 @@ void MackieControlProtocol::switch_banks( int initial ) // update strip from route rs->notify_all(); } - + // create dead strips if there aren't enough routes to // fill a bank for ( ; i < route_table.size(); ++i ) @@ -309,7 +309,7 @@ void MackieControlProtocol::switch_banks( int initial ) port.write( builder.zero_strip( port, strip ) ); } } - + // display the current start bank. surface().display_bank_start( mcu_port(), builder, _current_initial_bank ); } @@ -317,17 +317,17 @@ void MackieControlProtocol::switch_banks( int initial ) void MackieControlProtocol::zero_all() { // TODO turn off SMPTE displays - + // zero all strips for ( Surface::Strips::iterator it = surface().strips.begin(); it != surface().strips.end(); ++it ) { MackiePort & port = port_for_id( (*it)->index() ); port.write( builder.zero_strip( port, **it ) ); } - + // and the master strip mcu_port().write( builder.zero_strip( dynamic_cast<MackiePort&>( mcu_port() ), master_strip() ) ); - + // turn off global buttons and leds // global buttons are only ever on mcu_port, so we don't have // to figure out which port. @@ -355,29 +355,29 @@ int MackieControlProtocol::set_active( bool yn ) if ( yn ) { // TODO what happens if this fails half way? - + // create MackiePorts { Glib::Mutex::Lock lock( update_mutex ); create_ports(); } - + // make sure the ports are being listened to update_ports(); - + // wait until poll thread is running, with ports to poll // the mutex is only there because conditions require a mutex { Glib::Mutex::Lock lock( update_mutex ); while ( nfds == 0 ) update_cond.wait( update_mutex ); } - + // now initialise MackiePorts - ie exchange sysex messages for( MackiePorts::iterator it = _ports.begin(); it != _ports.end(); ++it ) { (*it)->open(); } - + // wait until all ports are active // TODO a more sophisticated approach would // allow things to start up with only an MCU, even if @@ -386,15 +386,15 @@ int MackieControlProtocol::set_active( bool yn ) { (*it)->wait_for_init(); } - + // create surface object. This depends on the ports being // correctly initialised initialize_surface(); connect_session_signals(); - + // yeehah! _active = true; - + // send current control positions to surface // must come after _active = true otherwise it won't run update_surface(); @@ -450,13 +450,13 @@ bool MackieControlProtocol::handle_strip_button( Control & control, ButtonState //state = default_button_press( dynamic_cast<Button&>( control ) ); } } - + if ( control.name() == "fader_touch" ) { state = bs == press; control.strip().gain().in_use( state ); } - + return state; } @@ -541,7 +541,7 @@ void MackieControlProtocol::update_surface() // do the initial bank switch to connect signals // _current_initial_bank is initialised by set_state switch_banks( _current_initial_bank ); - + // create a RouteSignal for the master route boost::shared_ptr<Route> mr = master_route (); @@ -550,10 +550,10 @@ void MackieControlProtocol::update_surface() // update strip from route master_route_signal->notify_all(); } - + // sometimes the jog wheel is a pot surface().blank_jog_ring( mcu_port(), builder ); - + // update global buttons and displays notify_record_state_changed(); notify_transport_state_changed(); @@ -574,7 +574,7 @@ void MackieControlProtocol::connect_session_signals() session->config.ParameterChanged.connect ( ( mem_fun (*this, &MackieControlProtocol::notify_parameter_changed) ) ); // receive rude solo changed connections_back = session->SoloActive.connect( ( mem_fun (*this, &MackieControlProtocol::notify_solo_active_changed) ) ); - + // make sure remote id changed signals reach here // see also notify_route_added Sorted sorted = get_sorted_routes(); @@ -603,7 +603,7 @@ void MackieControlProtocol::add_port( MIDI::Port & midi_port, int number ) { MackiePort * sport = new MackiePort( *this, midi_port, number ); _ports.push_back( sport ); - + connections_back = sport->init_event.connect( sigc::bind ( mem_fun (*this, &MackieControlProtocol::handle_port_init) @@ -624,7 +624,7 @@ void MackieControlProtocol::add_port( MIDI::Port & midi_port, int number ) , sport ) ); - + _ports_changed = true; } } @@ -645,7 +645,7 @@ void MackieControlProtocol::create_ports() } add_port( *midi_port, 0 ); } - + // open extender ports. Up to 9. Should be enough. // could also use mm->get_midi_ports() string ext_port_base = "mcu_xt_"; @@ -676,9 +676,9 @@ void MackieControlProtocol::initialize_surface() { strips += (*it)->strips(); } - + set_route_table_size( strips ); - + // TODO same as code in mackie_port.cc string emulation = ARDOUR::Config->get_mackie_emulation(); if ( emulation == "bcf" ) @@ -697,7 +697,7 @@ void MackieControlProtocol::initialize_surface() } _surface->init(); - + // Connect events. Must be after route table otherwise there will be trouble for( MackiePorts::iterator it = _ports.begin(); it != _ports.end(); ++it ) { @@ -712,10 +712,10 @@ void MackieControlProtocol::close() // calls methods on objects that are deleted _polling = false; pthread_join( thread, 0 ); - + // TODO disconnect port active/inactive signals // Or at least put a lock here - + // disconnect global signals from Session // TODO Since *this is a sigc::trackable, this shouldn't be necessary // but it is for some reason @@ -725,7 +725,7 @@ void MackieControlProtocol::close() it->disconnect(); } #endif - + if ( _surface != 0 ) { // These will fail if the port has gone away. @@ -742,7 +742,7 @@ void MackieControlProtocol::close() cout << "MackieControlProtocol::close caught exception: " << e.what() << endl; #endif } - + for( MackiePorts::iterator it = _ports.begin(); it != _ports.end(); ++it ) { try @@ -762,21 +762,21 @@ void MackieControlProtocol::close() #endif } } - + // disconnect routes from strips clear_route_signals(); - + delete _surface; _surface = 0; } - + // shut down MackiePorts for( MackiePorts::iterator it = _ports.begin(); it != _ports.end(); ++it ) { delete *it; } _ports.clear(); - + // this is done already in monitor_work. But it's here so we know. delete[] pfd; pfd = 0; @@ -793,26 +793,26 @@ XMLNode & MackieControlProtocol::get_state() #ifdef DEBUG cout << "MackieControlProtocol::get_state" << endl; #endif - + // add name of protocol XMLNode* node = new XMLNode( X_("Protocol") ); node->add_property( X_("name"), _name ); - + // add current bank ostringstream os; os << _current_initial_bank; node->add_property( X_("bank"), os.str() ); - + return *node; } -int MackieControlProtocol::set_state (const XMLNode & node, int version) +int MackieControlProtocol::set_state (const XMLNode & node, int /*version*/) { #ifdef DEBUG cout << "MackieControlProtocol::set_state: active " << _active << endl; #endif int retval = 0; - + // fetch current bank if ( node.property( X_("bank") ) != 0 ) { @@ -831,7 +831,7 @@ int MackieControlProtocol::set_state (const XMLNode & node, int version) return -1; } } - + return retval; } @@ -854,7 +854,7 @@ void MackieControlProtocol::handle_control_event( SurfacePort & port, Control & cerr << "Warning: index is " << index << " which is not in the route table, size: " << route_table.size() << endl; } } - + // This handles control element events from the surface // the state of the controls on the surface is usually updated // from UI events. @@ -867,14 +867,14 @@ void MackieControlProtocol::handle_control_event( SurfacePort & port, Control & if ( route != 0 ) { route->gain_control()->set_value( state.pos ); - + // must echo bytes back to slider now, because // the notifier only works if the fader is not being // touched. Which it is if we're getting input. port.write( builder.build_fader( (Fader&)control, state.pos ) ); } break; - + case Control::type_button: if ( control.group().is_strip() ) { @@ -904,7 +904,7 @@ void MackieControlProtocol::handle_control_event( SurfacePort & port, Control & surface().handle_button( *this, state.button_state, dynamic_cast<Button&>( control ) ); } break; - + // pot (jog wheel, external control) case Control::type_pot: if ( control.group().is_strip() ) @@ -917,14 +917,14 @@ void MackieControlProtocol::handle_control_event( SurfacePort & port, Control & // assume pan for now float xpos; route->panner()->streampanner (0).get_effective_position (xpos); - + // calculate new value, and trim xpos += state.delta * state.sign; if ( xpos > 1.0 ) xpos = 1.0; else if ( xpos < 0.0 ) xpos = 0.0; - + route->panner()->streampanner (0).set_position( xpos ); } } @@ -946,7 +946,7 @@ void MackieControlProtocol::handle_control_event( SurfacePort & port, Control & } } break; - + default: cout << "Control::type not handled: " << control.type() << endl; } @@ -1012,7 +1012,7 @@ void MackieControlProtocol::notify_active_changed (RouteSignal *) cout << e.what() << endl; } } - + void MackieControlProtocol::notify_gain_changed( RouteSignal * route_signal, bool force_update ) { try @@ -1044,7 +1044,7 @@ void MackieControlProtocol::notify_name_changed( RouteSignal * route_signal ) { string line1; string fullname = route_signal->route()->name(); - + if ( fullname.length() <= 6 ) { line1 = fullname; @@ -1053,7 +1053,7 @@ void MackieControlProtocol::notify_name_changed( RouteSignal * route_signal ) { line1 = PBD::short_version( fullname, 6 ); } - + SurfacePort & port = route_signal->port(); port.write( builder.strip_display( port, strip, 0, line1 ) ); port.write( builder.strip_display_blank( port, strip, 1 ) ); @@ -1075,7 +1075,7 @@ void MackieControlProtocol::notify_panner_changed( RouteSignal * route_signal, b { float pos; route_signal->route()->panner()->streampanner(0).get_effective_position( pos ); - + // cache the MidiByteArray here, because the mackie led control is much lower // resolution than the panner control. So we save lots of byte // sends in spite of more work on the comparison @@ -1106,7 +1106,7 @@ void MackieControlProtocol::update_automation( RouteSignal & rs ) { notify_gain_changed( &rs, false ); } - + if ( rs.route()->panner() ) { ARDOUR::AutoState panner_state = rs.route()->panner()->automation_state(); if ( panner_state == Touch || panner_state == Play ) @@ -1121,14 +1121,14 @@ string MackieControlProtocol::format_bbt_timecode( nframes_t now_frame ) { BBT_Time bbt_time; session->bbt_time( now_frame, bbt_time ); - + // According to the Logic docs // digits: 888/88/88/888 // BBT mode: Bars/Beats/Subdivisions/Ticks ostringstream os; os << setw(3) << setfill('0') << bbt_time.bars; os << setw(2) << setfill('0') << bbt_time.beats; - + // figure out subdivisions per beat const Meter & meter = session->tempo_map().meter_at( now_frame ); int subdiv = 2; @@ -1136,13 +1136,13 @@ string MackieControlProtocol::format_bbt_timecode( nframes_t now_frame ) { subdiv = 3; } - + uint32_t subdivisions = bbt_time.ticks / uint32_t( Meter::ticks_per_beat / subdiv ); uint32_t ticks = bbt_time.ticks % uint32_t( Meter::ticks_per_beat / subdiv ); - + os << setw(2) << setfill('0') << subdivisions + 1; os << setw(3) << setfill('0') << ticks; - + return os.str(); } @@ -1159,7 +1159,7 @@ string MackieControlProtocol::format_smpte_timecode( nframes_t now_frame ) os << setw(2) << setfill('0') << smpte.minutes; os << setw(2) << setfill('0') << smpte.seconds; os << setw(3) << setfill('0') << smpte.frames; - + return os.str(); } @@ -1170,7 +1170,7 @@ void MackieControlProtocol::update_timecode_display() // do assignment here so current_frame is fixed nframes_t current_frame = session->transport_frame(); string timecode; - + switch ( _timecode_type ) { case ARDOUR::AnyTime::BBT: @@ -1183,8 +1183,8 @@ void MackieControlProtocol::update_timecode_display() ostringstream os; os << "Unknown timecode: " << _timecode_type; throw runtime_error( os.str() ); - } - + } + // only write the timecode string to the MCU if it's changed // since last time. This is to reduce midi bandwidth used. if ( timecode != _timecode_last ) @@ -1204,15 +1204,15 @@ void MackieControlProtocol::poll_session_data() { update_automation( **it ); } - + // and the master strip if ( master_route_signal != 0 ) { update_automation( *master_route_signal ); } - + update_timecode_display(); - + _automation_last.start(); } } @@ -1225,12 +1225,12 @@ LedState MackieControlProtocol::frm_left_press (Button &) { // can use first_mark_before/after as well unsigned long elapsed = _frm_left_last.restart(); - + Location * loc = session->locations()->first_location_before ( session->transport_frame() ); - - // allow a quick double to go past a previous mark + + // allow a quick double to go past a previous mark if ( session->transport_rolling() && elapsed < 500 && loc != 0 ) { Location * loc_two_back = session->locations()->first_location_before ( loc->start() ); @@ -1239,13 +1239,13 @@ LedState MackieControlProtocol::frm_left_press (Button &) loc = loc_two_back; } } - + // move to the location, if it's valid if ( loc != 0 ) { session->request_locate( loc->start(), session->transport_rolling() ); } - + return on; } @@ -1468,7 +1468,7 @@ void MackieControlProtocol::notify_route_added( ARDOUR::RouteList & rl ) refresh_current_bank(); } // otherwise route added, but current bank needs no updating - + // make sure remote id changes in the new route are handled typedef ARDOUR::RouteList ARS; for ( ARS::iterator it = rl.begin(); it != rl.end(); ++it ) @@ -1486,7 +1486,7 @@ void MackieControlProtocol::notify_solo_active_changed( bool active ) void MackieControlProtocol::notify_remote_id_changed() { Sorted sorted = get_sorted_routes(); - + // if a remote id has been moved off the end, we need to shift // the current bank backwards. if ( sorted.size() - _current_initial_bank < route_signals.size() ) @@ -1518,9 +1518,9 @@ void MackieControlProtocol::notify_transport_state_changed() update_global_button( "play", session->transport_rolling() ); update_global_button( "stop", !session->transport_rolling() ); update_global_button( "loop", session->get_play_loop() ); - + _transport_previously_rolling = session->transport_rolling(); - + // rec is special because it's tristate Button * rec = reinterpret_cast<Button*>( surface().controls_by_name["record"] ); mcu_port().write( builder.build_led( *rec, record_release( *rec ) ) ); @@ -1541,7 +1541,7 @@ LedState MackieControlProtocol::left_press (Button &) session->set_dirty(); switch_banks( new_initial ); } - + return on; } else @@ -1567,7 +1567,7 @@ LedState MackieControlProtocol::right_press (Button &) session->set_dirty(); switch_banks( _current_initial_bank + delta ); } - + return on; } else |