MusicPlus feature: Post Jingle music resume
Resume music after a jingle, with jingle length taken into account. Can play multiple jingles and the game will remember the resume position of each one.
Implementation
- A section in
s_sound
is devoted tomusic_stack
, a next/prev chain ofmusicstack_t
structs that store music, position, and powerup status. - Public methods
S_RetainMusic()
andS_RecallMusic()
work the magic - The idea is:
- The level music is always first (oldest) on the stack.
- When playing a jingle, register that entry on the stack.
- When
P_RestoreMusic
is called, check the stack in order of jingle priority: Super, Invincibility, Speed Shoes. - If none of those statuses are in effect, then go down the entire stack from newest to oldest.
- When a matching entry is in effect, play that music.
- For the resume skipping to work (
old_position + jingle_length
), the game must know the song length, which SDL Mixer cannot retrieve. Instead, the music is tagged withLENGTHMS=xxxxx
as a workaround.- If this tag is missing and the length is not known, then music resumes to the old position without skipping
Music Length Tagger
In order to work properly, music must be tagged with LENGTHMS=
. Use this utility to automatically tag music in a given WADfile.
musicplus-demo
on Windows does not need this because it uses SDL Mixer X to tell song length. This branch, all other branches, and Linux, need this tag.
Edited by mazmazz