foxygit / doom Log in
commit 796abf07141ade4d1c035d33bb478356a087279d
Author:     Roman Fomin <rfomin@gmail.com>
AuthorDate: Fri Jan 14 14:17:17 2022 +0700
Commit:     Roman Fomin <rfomin@gmail.com>
CommitDate: Fri Jan 14 14:17:17 2022 +0700

    win midi: Proper pause/resume
---
 src/i_sdlmusic.c |  8 ++++++++
 src/i_winmusic.c | 23 +++++++++++++++++++++++
 src/i_winmusic.h |  2 ++
 3 files changed, 33 insertions(+)

diff --git a/src/i_sdlmusic.c b/src/i_sdlmusic.c
index 7f1d0c0c..632dc02b 100644
--- a/src/i_sdlmusic.c
+++ b/src/i_sdlmusic.c
@@ -341,9 +341,13 @@ static void I_SDL_PauseSong(void)
         return;
     }

+#if defined(_WIN32)
+    I_WIN_PauseSong();
+#else
     musicpaused = true;

     UpdateMusicVolume();
+#endif
 }

 static void I_SDL_ResumeSong(void)
@@ -353,9 +357,13 @@ static void I_SDL_ResumeSong(void)
         return;
     }

+#if defined(_WIN32)
+    I_WIN_ResumeSong();
+#else
     musicpaused = false;

     UpdateMusicVolume();
+#endif
 }

 static void I_SDL_StopSong(void)
diff --git a/src/i_winmusic.c b/src/i_winmusic.c
index 1e2c7971..8b085392 100644
--- a/src/i_winmusic.c
+++ b/src/i_winmusic.c
@@ -444,6 +444,28 @@ void I_WIN_PlaySong(boolean looping)
     UpdateVolume();
 }

+void I_WIN_PauseSong(void)
+{
+    MMRESULT mmr;
+
+    mmr = midiStreamPause(hMidiStream);
+    if (mmr != MMSYSERR_NOERROR)
+    {
+        MidiErrorMessageBox(mmr);
+    }
+}
+
+void I_WIN_ResumeSong(void)
+{
+    MMRESULT mmr;
+
+    mmr = midiStreamRestart(hMidiStream);
+    if (mmr != MMSYSERR_NOERROR)
+    {
+        MidiErrorMessageBox(mmr);
+    }
+}
+
 boolean I_WIN_RegisterSong(char *filename)
 {
     int i;
@@ -517,6 +539,7 @@ void I_WIN_ShutdownMusic(void)
     MMRESULT mmr;

     I_WIN_StopSong();
+    I_WIN_UnRegisterSong();

     mmr = midiOutUnprepareHeader((HMIDIOUT)hMidiStream, hdr, sizeof(MIDIHDR));
     if (mmr != MMSYSERR_NOERROR)
diff --git a/src/i_winmusic.h b/src/i_winmusic.h
index 8f1edf10..f1bfce02 100644
--- a/src/i_winmusic.h
+++ b/src/i_winmusic.h
@@ -23,6 +23,8 @@

 boolean I_WIN_InitMusic(void);
 void I_WIN_PlaySong(boolean looping);
+void I_WIN_PauseSong(void);
+void I_WIN_ResumeSong(void);
 void I_WIN_StopSong(void);
 void I_WIN_SetMusicVolume(int volume);
 boolean I_WIN_RegisterSong(char* filename);