From 6dc0191e037a9103260fe7190d6eea4f8477ce84 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Mon, 31 May 2004 08:51:10 +0000 Subject: Make allNotesOff() also turn off all "hanging notes". Without this change, I wasn't able to fully stop ITE's XMIDI music - there would always be a couple of notes hanging even after unloading it. Apparently this music doesn't use the "active notes" mechanism at all, and I guess the ALSA driver doesn't support the "All Note Off" event. I'm still not 100% sure this is the correct fix, but unless someone has any better idea... svn-id: r13910 --- sound/midiparser.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'sound') diff --git a/sound/midiparser.cpp b/sound/midiparser.cpp index c2c97a5de1..48d8f6d0d1 100644 --- a/sound/midiparser.cpp +++ b/sound/midiparser.cpp @@ -248,12 +248,18 @@ void MidiParser::allNotesOff() { } } + // Turn off all hanging notes + for (i = 0; i < ARRAYSIZE(_hanging_notes); i++) { + if (_hanging_notes[i].time_left) { + _driver->send (0x80 | _hanging_notes[i].channel | _hanging_notes[i].note << 8); + _hanging_notes[i].time_left = 0; + } + } + _hanging_notes_count = 0; + // To be sure, send an "All Note Off" event (but not all MIDI devices support this...) for (i = 0; i < 16; ++i) _driver->send (0x007BB0 | i); - for (i = 0; i < ARRAYSIZE(_hanging_notes); ++i) - _hanging_notes[i].time_left = 0; - _hanging_notes_count = 0; memset (_active_notes, 0, sizeof(_active_notes)); } -- cgit v1.2.3