aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/adlmidi.h3
-rw-r--r--src/adlmidi.cpp10
-rw-r--r--src/adlmidi_midiplay.cpp5
-rw-r--r--src/adlmidi_private.hpp2
-rw-r--r--utils/adlmidi-2/midiplay.cc20
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();