diff --git a/src/lua_baselib.c b/src/lua_baselib.c
index b191dba62b7c0a3108d5459d8ec5fa73ed996ab4..1125ef7f84b4da04c9b6ac17aafd076d750aef23 100644
--- a/src/lua_baselib.c
+++ b/src/lua_baselib.c
@@ -3718,7 +3718,8 @@ static int musicdef_get(lua_State *L)
 
 static int lib_sMusicInfo(lua_State *L)
 {
-	LUA_PushUserdata(L, S_MusicInfo(), META_MUSICDEF);
+	const char *music_name = lua_tolstring(L, 1, NULL);
+	LUA_PushUserdata(L, S_MusicInfo(music_name), META_MUSICDEF);
 	return 1;
 }
 
diff --git a/src/s_sound.c b/src/s_sound.c
index 0654e705f86f78ba5ab7d742654692a3625e1ef3..1a04e9ab87aa751ea985e4e62e46dcd93ffd432a 100644
--- a/src/s_sound.c
+++ b/src/s_sound.c
@@ -1801,12 +1801,21 @@ UINT32 S_GetMusicLength(void)
 	return I_GetSongLength();
 }
 
-musicdef_t *S_MusicInfo(void)
+//
+// S_MusicInfo
+//
+// Returns metadata about supplied music
+// If name is NULL, returns the currently playing music (if any)
+//
+musicdef_t *S_MusicInfo(const char *name)
 {
+	if (!name)
+		name = music_name;
+
 	musicdef_t *def;
 	for (def = musicdefstart; def; def = def->next)
 	{
-		if (strcasecmp(def->name, music_name) == 0)
+		if (strcasecmp(def->name, name) == 0)
 			return def;
 	}
 
diff --git a/src/s_sound.h b/src/s_sound.h
index 909a77e081c21c6f02374ead552def674344c1e6..98aebcc27cfb95b231588101557f3485983d5e9e 100644
--- a/src/s_sound.h
+++ b/src/s_sound.h
@@ -221,7 +221,7 @@ boolean S_PrepareSoundTest(void);
 UINT32 S_GetMusicLength(void);
 
 // Get MUSICDEF of Music
-musicdef_t *S_MusicInfo(void);
+musicdef_t *S_MusicInfo(const char *name);
 
 // Set LoopPoint of Music
 boolean S_SetMusicLoopPoint(UINT32 looppoint);