diff --git a/src/android/i_sound.c b/src/android/i_sound.c
index 0bb47d5cf35be15efcd2abbd83e7fdb66bc320b9..3ce02b41965dc1214132ba38f4d365a87fc5d7c2 100644
--- a/src/android/i_sound.c
+++ b/src/android/i_sound.c
@@ -65,6 +65,16 @@ musictype_t I_GetMusicType(void)
 	return MU_NONE;
 }
 
+boolean I_MusicPlaying(void)
+{
+	return false;
+}
+
+boolean I_MusicPaused(void)
+{
+	return false;
+}
+
 void I_InitMusic(void){}
 
 void I_ShutdownMusic(void){}
diff --git a/src/djgppdos/i_sound.c b/src/djgppdos/i_sound.c
index d924a65602c1ed25bbbf0f32e06ed71b712b01f7..ed681f7dd161a122aa16fcb669a70e6878ae26e3 100644
--- a/src/djgppdos/i_sound.c
+++ b/src/djgppdos/i_sound.c
@@ -321,6 +321,7 @@ static MIDI* currsong;   //im assuming only 1 song will be played at once
 static int      islooping=0;
 static int      musicdies=-1;
 UINT8           music_started=0;
+boolean         songpaused=false;
 
 musictype_t I_GetMusicType(void)
 {
@@ -330,6 +331,16 @@ musictype_t I_GetMusicType(void)
 		return MU_NONE;
 }
 
+boolean I_MusicPlaying()
+{
+	return (boolean)currsong;
+}
+
+boolean I_MusicPaused()
+{
+	return songpaused;
+}
+
 /* load_midi_mem:
  *  Loads a standard MIDI file from memory, returning a pointer to
  *  a MIDI structure, *  or NULL on error.
@@ -403,6 +414,7 @@ void I_InitMusic(void)
 
 	I_AddExitFunc(I_ShutdownMusic);
 	music_started = true;
+	songpaused = false;
 }
 
 void I_ShutdownMusic(void)
@@ -433,8 +445,8 @@ void I_PauseSong (INT32 handle)
 	handle = 0;
 	if (nomidimusic)
 		return;
-
 	midi_pause();
+	songpaused = true;
 }
 
 void I_ResumeSong (INT32 handle)
@@ -442,8 +454,8 @@ void I_ResumeSong (INT32 handle)
 	handle = 0;
 	if (nomidimusic)
 		return;
-
 	midi_resume();
+	songpaused = false;
 }
 
 void I_StopSong(void)
@@ -455,6 +467,7 @@ void I_StopSong(void)
 	islooping = 0;
 	musicdies = 0;
 	stop_midi();
+	songpaused = false;
 }
 
 // Is the song playing?
diff --git a/src/dummy/i_sound.c b/src/dummy/i_sound.c
index 6a01787d9039a80e1c5e3d9e5a0eefa3c7ff16f1..6afbecf7670a8c0deb4ddcd9203ab810f7a81add 100644
--- a/src/dummy/i_sound.c
+++ b/src/dummy/i_sound.c
@@ -66,6 +66,16 @@ musictype_t I_GetMusicType(void)
 	return MU_NONE;
 }
 
+boolean I_MusicPlaying(void)
+{
+	return false;
+}
+
+boolean I_MusicPaused(void)
+{
+	return false;
+}
+
 void I_InitMusic(void){}
 
 void I_ShutdownMusic(void){}
diff --git a/src/sdl/sdl_sound.c b/src/sdl/sdl_sound.c
index 23cce94d93019016faab3df39bde72a0c0aad490..53db7dd260e2395dceaf1ca4b3bac3830a9e98cf 100644
--- a/src/sdl/sdl_sound.c
+++ b/src/sdl/sdl_sound.c
@@ -1336,6 +1336,16 @@ musictype_t I_GetMusicType(void)
 #endif
 }
 
+boolean I_MusicPlaying(void)
+{
+	return music_started;
+}
+
+boolean I_MusicPaused(void)
+{
+	return Mix_PausedMusic();
+}
+
 #ifdef HAVE_LIBGME
 static void I_ShutdownGMEMusic(void)
 {
diff --git a/src/win32/win_snd.c b/src/win32/win_snd.c
index 9bfd1297f5d060ad6e403254a4bb069062e2d870..d69562d413943ed76d23fcda0f59f26bf7c69044 100644
--- a/src/win32/win_snd.c
+++ b/src/win32/win_snd.c
@@ -478,6 +478,19 @@ musictype_t I_GetMusicType(void)
 		return MU_NONE;
 }
 
+boolean I_MusicPlaying(void)
+{
+	return (boolean)music_stream;
+}
+
+boolean I_MusicPaused(void)
+{
+	boolean fmpaused = false;
+	if (music_stream)
+		FMOD_Channel_GetPaused(music_channel, &fmpaused);
+	return fmpaused;
+}
+
 void I_InitMusic(void)
 {
 }