diff options
-rw-r--r-- | include/adlmidi.h | 3 | ||||
-rw-r--r-- | src/adlmidi.cpp | 10 | ||||
-rw-r--r-- | src/adlmidi_midiplay.cpp | 5 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 2 | ||||
-rw-r--r-- | utils/adlmidi-2/midiplay.cc | 20 |
5 files changed, 38 insertions, 2 deletions
diff --git a/include/adlmidi.h b/include/adlmidi.h index 8c5b7f4..c997f9b 100644 --- a/include/adlmidi.h +++ b/include/adlmidi.h @@ -215,6 +215,9 @@ extern double adl_tickEvents(ADL_MIDIPlayer *device, double seconds, double gran /*Returns 1 if music position has reached end*/ extern int adl_atEnd(ADL_MIDIPlayer *device); +/*Force Off all notes on all channels*/ +extern void adl_panic(ADL_MIDIPlayer *device); + /**Hooks**/ typedef void (*ADL_RawEventHook)(void *userdata, ADL_UInt8 type, ADL_UInt8 subtype, ADL_UInt8 channel, const ADL_UInt8 *data, size_t len); diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp index 7c08287..2add51a 100644 --- a/src/adlmidi.cpp +++ b/src/adlmidi.cpp @@ -696,3 +696,13 @@ ADLMIDI_EXPORT int adl_atEnd(ADL_MIDIPlayer *device) return 1; return (int)player->atEnd; } + +ADLMIDI_EXPORT void adl_panic(ADL_MIDIPlayer *device) +{ + if(!device) + return; + MIDIplay *player = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); + if(!player) + return; + player->realTime_panic(); +} diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index 83517db..7b9a086 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -1346,6 +1346,11 @@ void MIDIplay::realTime_BankChange(uint8_t channel, uint16_t bank) Ch[channel].bank_msb = uint8_t((bank >> 8) & 0xFF); } +void MIDIplay::realTime_panic() +{ + Panic(); +} + void MIDIplay::NoteUpdate(uint16_t MidCh, MIDIplay::MIDIchannel::activenoteiterator i, diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp index 58b4e10..27cfdb0 100644 --- a/src/adlmidi_private.hpp +++ b/src/adlmidi_private.hpp @@ -868,6 +868,8 @@ public: void realTime_BankChangeMSB(uint8_t channel, uint8_t msb); void realTime_BankChange(uint8_t channel, uint16_t bank); + void realTime_panic(); + private: enum { diff --git a/utils/adlmidi-2/midiplay.cc b/utils/adlmidi-2/midiplay.cc index 843f4d7..1d5e249 100644 --- a/utils/adlmidi-2/midiplay.cc +++ b/utils/adlmidi-2/midiplay.cc @@ -1578,7 +1578,9 @@ int main(int argc, char **argv) std::fflush(stderr); signal(SIGINT, TidyupAndExit); - __djgpp_set_ctrl_c(1); + #ifdef __DJGPP__ + signal(SIGQUIT, TidyupAndExit); + #endif if(argc < 2 || std::string(argv[1]) == "--help" || std::string(argv[1]) == "-h") { @@ -1863,8 +1865,11 @@ int main(int argc, char **argv) #ifdef __DJGPP__ double tick_delay = 0.0; #endif + + #ifndef __DJGPP__ //sample_buf.resize(1024); short buff[1024]; + #endif UI.TetrisLaunched = true; while(!QuitFlag) @@ -1959,6 +1964,13 @@ int main(int argc, char **argv) const unsigned long CurTimer = BIOStimer; const double eat_delay = (CurTimer - PrevTimer) / (double)NewTimerFreq; PrevTimer = CurTimer; + + if(kbhit()) + { // Quit on ESC key! + int c = getch(); + if(c == 27) + QuitFlag = true; + } #endif //double nextdelay = @@ -1991,6 +2003,9 @@ int main(int argc, char **argv) //tick_delay = nextdelay; } + //Shut up all sustaining notes + adl_panic(myDevice); + #ifdef __DJGPP__ // Fix the skewed clock and reset BIOS tick rate _farpokel(_dos_ds, 0x46C, BIOStimer_begin + @@ -2002,9 +2017,10 @@ int main(int argc, char **argv) outportb(0x40, 0); //enable(); + UI.GotoXY(0, 0); + UI.ShowCursor(); UI.Color(7); clrscr(); - std::printf("Bye!\n"); #else #ifdef _WIN32 WindowsAudio::Close(); |