From 5062ab05dd9e5a58f8c4b3a7b0d486b233fe04b4 Mon Sep 17 00:00:00 2001
From: Carsten Teibes <dev@f4ke.de>
Date: Thu, 17 Jan 2019 01:52:24 +0100
Subject: [PATCH 07/36] Music fixes for Opening and Demo (fixes #56) - Play the
 opening music directly, original game has it hardcoded - Play correct level
 music in demo levels, instead of menu song - Do not restart music playback,
 when same music file is played

---
 src/io/sound.cpp              | 26 +++++++++++++++++++++++---
 src/io/sound.h                |  2 +-
 src/jj1level/jj1demolevel.cpp |  3 +++
 src/jj1level/jj1level.h       |  2 +-
 src/main.cpp                  |  4 ++++
 src/menu/gamemenu.cpp         |  4 ++--
 src/menu/mainmenu.cpp         |  4 ++--
 7 files changed, 36 insertions(+), 9 deletions(-)

--- a/src/io/sound.cpp
+++ b/src/io/sound.cpp
@@ -95,6 +95,7 @@ SDL_AudioSpec  audioSpec;
 bool musicPaused = false;
 int musicVolume = MAX_VOLUME >> 1; // 50%
 int soundVolume = MAX_VOLUME >> 2; // 25%
+char *currentMusic = NULL;
 
 
 /**
@@ -256,8 +257,9 @@ void closeAudio () {
  * Play music from the specified file.
  *
  * @param fileName Name of a file containing music data.
+ * @param restart Restart music when same file is played.
  */
-void playMusic (const char * fileName) {
+void playMusic (const char * fileName, bool restart) {
 
 	File *file;
 	unsigned char *psmData;
@@ -268,9 +270,12 @@ void playMusic (const char * fileName) {
 	ModPlug_Settings settings;
 #endif
 
-	// Stop any existing music playing
-	stopMusic();
+	/* Only stop any existing music playing, if a different file
+	   should be played or a restart has been requested. */
+	if ((currentMusic && (strcmp(fileName, currentMusic) == 0)) && !restart)
+		return;
 
+	stopMusic();
 
 	// Load the music file
 
@@ -284,6 +289,11 @@ void playMusic (const char * fileName) {
 
 	}
 
+	// Save current music filename
+
+	if (currentMusic) delete[] currentMusic;
+	currentMusic = createString(fileName);
+
 	// Find the size of the file
 	size = file->getSize();
 
@@ -387,8 +397,18 @@ void pauseMusic (bool pause) {
 void stopMusic () {
 
 	// Stop the music playing
+
 	SDL_PauseAudio(~0);
 
+	// Cleanup
+
+	if (currentMusic) {
+
+		delete[] currentMusic;
+		currentMusic = NULL;
+
+	}
+
 #if defined(USE_MODPLUG)
 
 	if (musicFile) {
--- a/src/io/sound.h
+++ b/src/io/sound.h
@@ -94,7 +94,7 @@ EXTERN int volume_direction;
 
 EXTERN void openAudio      ();
 EXTERN void closeAudio     ();
-EXTERN void playMusic      (const char *fileName);
+EXTERN void playMusic      (const char *fileName, bool restart = false);
 EXTERN void pauseMusic     (bool pause);
 EXTERN void stopMusic      ();
 EXTERN int  getMusicVolume ();
--- a/src/jj1level/jj1demolevel.cpp
+++ b/src/jj1level/jj1demolevel.cpp
@@ -39,6 +39,7 @@
 #include "io/file.h"
 #include "io/gfx/font.h"
 #include "io/gfx/video.h"
+#include "io/sound.h"
 #include "loop.h"
 #include "util.h"
 
@@ -129,6 +130,8 @@ int JJ1DemoLevel::play () {
 
 	video.setPalette(palette);
 
+	playMusic(musicFile);
+
 	while (true) {
 
 		// Do general processing
--- a/src/jj1level/jj1level.h
+++ b/src/jj1level/jj1level.h
@@ -181,7 +181,6 @@ class JJ1Level : public Level {
 		SDL_Surface*  panelAmmo[6]; ///< HUD ammo type images
 		JJ1Event*     events; ///< Active events
 		JJ1Bullet*    bullets; ///< Active bullets
-		char*         musicFile; ///< Music file name
 		char*         sceneFile; ///< File name of cutscene to play when level has been completed
 		Sprite*       spriteSet; ///< Sprites
 		Anim          animSet[ANIMS]; ///< Animations
@@ -215,6 +214,7 @@ class JJ1Level : public Level {
 
 	protected:
 		Font* font; ///< On-screen message font
+		char* musicFile; ///< Music file name
 
 		JJ1Level (Game* owner);
 
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -401,6 +401,10 @@ int play () {
 	MainMenu *mainMenu = NULL;
 	JJ1Scene *scene = NULL;
 
+	// Start the opening music
+
+	playMusic("MENUSNG.PSM");
+
 	// Load and play the startup cutscene
 
 	try {
--- a/src/menu/gamemenu.cpp
+++ b/src/menu/gamemenu.cpp
@@ -169,7 +169,7 @@ int GameMenu::playNewGame (GameModeType
 
 	delete game;
 
-	if (ret != E_QUIT) playMusic("menusng.psm");
+	if (ret != E_QUIT) playMusic("MENUSNG.PSM");
 
 	switch (ret) {
 
@@ -665,7 +665,7 @@ int GameMenu::joinGame () {
 
 	delete game;
 
-	if (ret != E_QUIT) playMusic("menusng.psm");
+	if (ret != E_QUIT) playMusic("MENUSNG.PSM");
 
 	switch (ret) {
 
--- a/src/menu/mainmenu.cpp
+++ b/src/menu/mainmenu.cpp
@@ -272,7 +272,7 @@ int MainMenu::main () {
 
 	video.setPalette(palette);
 
-	playMusic("menusng.psm");
+	playMusic("MENUSNG.PSM");
 
 
 	// Demo timeout
@@ -407,7 +407,7 @@ int MainMenu::main () {
 
 				delete game;
 
-				playMusic("menusng.psm");
+				playMusic("MENUSNG.PSM");
 
 				// Restore the main menu palette
 				video.setPalette(palette);
