+void
+TrackMixLayout::solo_mute_change ()
+{
+ if (!stripable) {
+ return;
+ }
+
+ Push2::Button* b = p2.button_by_id (Push2::Lower2);
+
+ if (b) {
+ boost::shared_ptr<SoloControl> sc = stripable->solo_control();
+
+ if (sc) {
+ if (sc->soloed_by_self_or_masters()) {
+ b->set_color (selection_color);
+ b->set_state (Push2::LED::OneShot24th);
+ } else if (sc->soloed_by_others_upstream() || sc->soloed_by_others_downstream()) {
+ b->set_color (selection_color);
+ b->set_state (Push2::LED::Blinking8th);
+ } else {
+ b->set_color (Push2::LED::DarkGray);
+ b->set_state (Push2::LED::OneShot24th);
+ }
+ } else {
+ b->set_color (Push2::LED::DarkGray);
+ b->set_state (Push2::LED::OneShot24th);
+ }
+
+ p2.write (b->state_msg());
+ }
+
+ b = p2.button_by_id (Push2::Lower1);
+
+ if (b) {
+ boost::shared_ptr<MuteControl> mc = stripable->mute_control();
+
+ if (mc) {
+ if (mc->muted_by_self_or_masters()) {
+ b->set_color (selection_color);
+ b->set_state (Push2::LED::OneShot24th);
+ } else if (mc->muted_by_others_soloing()) {
+ b->set_color (selection_color);
+ b->set_state (Push2::LED::Blinking8th);
+ } else {
+ b->set_color (Push2::LED::DarkGray);
+ b->set_state (Push2::LED::OneShot24th);
+ }
+
+ } else {
+ b->set_color (Push2::LED::DarkGray);
+ b->set_state (Push2::LED::OneShot24th);
+ }
+
+ p2.write (b->state_msg());
+ }
+
+}
+
+void
+TrackMixLayout::rec_enable_change ()
+{
+ if (!stripable) {
+ return;
+ }
+
+ simple_control_change (stripable->rec_enable_control(), Push2::Lower3);
+}
+
+void
+TrackMixLayout::solo_iso_change ()
+{
+ if (!stripable) {
+ return;
+ }
+
+ simple_control_change (stripable->solo_isolate_control(), Push2::Lower6);
+}
+void
+TrackMixLayout::solo_safe_change ()
+{
+ if (!stripable) {
+ return;
+ }
+
+ simple_control_change (stripable->solo_safe_control(), Push2::Lower7);
+}
+
+void
+TrackMixLayout::monitoring_change ()
+{
+ if (!stripable) {
+ return;
+ }
+
+ if (!stripable->monitoring_control()) {
+ return;
+ }
+
+ Push2::Button* b1 = p2.button_by_id (Push2::Lower4);
+ Push2::Button* b2 = p2.button_by_id (Push2::Lower5);
+ uint8_t b1_color;
+ uint8_t b2_color;
+
+ MonitorChoice mc = stripable->monitoring_control()->monitoring_choice ();
+
+ switch (mc) {
+ case MonitorAuto:
+ b1_color = Push2::LED::DarkGray;
+ b2_color = Push2::LED::DarkGray;
+ break;
+ case MonitorInput:
+ b1_color = selection_color;
+ b2_color = Push2::LED::DarkGray;
+ break;
+ case MonitorDisk:
+ b1_color = Push2::LED::DarkGray;
+ b2_color = selection_color;
+ break;
+ case MonitorCue:
+ b1_color = selection_color;
+ b2_color = selection_color;
+ break;
+ }
+
+ b1->set_color (b1_color);
+ b1->set_state (Push2::LED::OneShot24th);
+ p2.write (b1->state_msg());
+
+ b2->set_color (b2_color);
+ b2->set_state (Push2::LED::OneShot24th);
+ p2.write (b2->state_msg());
+}
+
+void
+TrackMixLayout::show_state ()
+{
+ if (!parent()) {
+ return;
+ }
+
+ if (stripable) {