+ if (muted()) {
+ /* only send messages for channels we are using */
+
+ uint16_t mask = get_playback_channel_mask();
+
+ for (uint8_t channel = 0; channel <= 0xF; channel++) {
+
+ if ((1<<channel) & mask) {
+
+ DEBUG_TRACE (DEBUG::MidiIO, string_compose ("%1 delivers mute message to channel %2\n", name(), channel+1));
+ uint8_t ev[3] = { ((uint8_t) (MIDI_CMD_CONTROL | channel)), MIDI_CTL_SUSTAIN, 0 };
+ write_immediate_event (3, ev);
+ ev[1] = MIDI_CTL_ALL_NOTES_OFF;
+ write_immediate_event (3, ev);
+ }
+ }
+ }
+}
+
+void
+MidiTrack::set_monitoring (MonitorChoice mc)
+{
+ if (mc != _monitoring) {
+
+ Track::set_monitoring (mc);
+
+ /* monitoring state changed, so flush out any on notes at the
+ * port level.
+ */
+
+ PortSet& ports (_output->ports());
+
+ for (PortSet::iterator p = ports.begin(); p != ports.end(); ++p) {
+ boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
+ if (mp) {
+ mp->require_resolve ();
+ }
+ }
+
+ boost::shared_ptr<MidiDiskstream> md (midi_diskstream());
+
+ if (md) {
+ md->reset_tracker ();
+ }
+ }
+}
+
+MonitorState
+MidiTrack::monitoring_state () const
+{
+ MonitorState ms = Track::monitoring_state();
+ if (ms == MonitoringSilence) {
+ return MonitoringInput;
+ }
+ return ms;
+}