From 210476c77ec6d0160e66ab6e9a45ad64fe5e50ce Mon Sep 17 00:00:00 2001
From: gameblabla <gameblabla@openmailbox.org>
Date: Thu, 7 Mar 2019 20:47:17 +0100
Subject: [PATCH] Diablo Music fix for PCSX Rearmed. (optional hack)

Let's also allow it to be changed from the menu.
Set to off by default as it could cause issues in some other games.
---
 frontend/main.c              | 1 +
 frontend/menu.c              | 2 ++
 maemo/main.c                 | 2 +-
 plugins/dfsound/registers.c  | 2 +-
 plugins/dfsound/spu_config.h | 1 +
 5 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/frontend/main.c b/frontend/main.c
index a824fdcc..43a55481 100644
--- a/frontend/main.c
+++ b/frontend/main.c
@@ -138,6 +138,7 @@ void emu_set_default_config(void)
 	pl_rearmed_cbs.gpu_peopsgl.iTexGarbageCollection = 1;
 
 	spu_config.iUseReverb = 1;
+	spu_config.idiablofix = 0;
 	spu_config.iUseInterpolation = 1;
 	spu_config.iXAPitch = 0;
 	spu_config.iVolume = 768;
diff --git a/frontend/menu.c b/frontend/menu.c
index cf9382a8..0b3f553c 100644
--- a/frontend/menu.c
+++ b/frontend/menu.c
@@ -443,6 +443,7 @@ static const struct {
 	CE_INTVAL_P(gpu_peopsgl.iTexGarbageCollection),
 	CE_INTVAL_P(gpu_peopsgl.dwActFixes),
 	CE_INTVAL(spu_config.iUseReverb),
+	CE_INTVAL(spu_config.idiablofix),
 	CE_INTVAL(spu_config.iXAPitch),
 	CE_INTVAL(spu_config.iUseInterpolation),
 	CE_INTVAL(spu_config.iTempo),
@@ -1454,6 +1455,7 @@ static menu_entry e_menu_plugin_spu[] =
 	mee_range_h   ("Volume boost",              0, volume_boost, -5, 30, h_spu_volboost),
 	mee_onoff     ("Reverb",                    0, spu_config.iUseReverb, 1),
 	mee_enum      ("Interpolation",             0, spu_config.iUseInterpolation, men_spu_interp),
+	mee_onoff     ("Diablo Music fix",          0, spu_config.idiablofix, 1),
 	mee_onoff     ("Adjust XA pitch",           0, spu_config.iXAPitch, 1),
 	mee_onoff_h   ("Adjust tempo",              0, spu_config.iTempo, 1, h_spu_tempo),
 	mee_end,
diff --git a/maemo/main.c b/maemo/main.c
index 85db400b..c382c511 100644
--- a/maemo/main.c
+++ b/maemo/main.c
@@ -197,7 +197,7 @@ int main(int argc, char **argv)
 	strcpy(Config.Bios, "HLE");
 	spu_config.iUseReverb = 1;
 	spu_config.iUseInterpolation = 1;
-
+	spu_config.idiablofix = 0;
 	in_type1 = PSE_PAD_TYPE_STANDARD;
 	in_type2 = PSE_PAD_TYPE_STANDARD;
 
diff --git a/plugins/dfsound/registers.c b/plugins/dfsound/registers.c
index 91bcaf86..bb64658d 100644
--- a/plugins/dfsound/registers.c
+++ b/plugins/dfsound/registers.c
@@ -352,7 +352,7 @@ static void SoundOn(int start,int end,unsigned short val)
    if((val&1) && regAreaGet(ch,6))                     // mmm... start has to be set before key on !?!
     {
      spu.s_chan[ch].pCurr=spu.spuMemC+((regAreaGet(ch,6)&~1)<<3); // must be block aligned
-     spu.s_chan[ch].pLoop=spu.spuMemC+((regAreaGet(ch,14)&~1)<<3);
+     if (spu_config.idiablofix == 0) spu.s_chan[ch].pLoop=spu.spuMemC+((regAreaGet(ch,14)&~1)<<3);
      spu.dwNewChannel|=(1<<ch);
     }
   }
diff --git a/plugins/dfsound/spu_config.h b/plugins/dfsound/spu_config.h
index 3e88a2c2..6b46bf38 100644
--- a/plugins/dfsound/spu_config.h
+++ b/plugins/dfsound/spu_config.h
@@ -7,6 +7,7 @@ typedef struct
  int        iUseReverb;
  int        iUseInterpolation;
  int        iTempo;
+ int        idiablofix;
  int        iUseThread;
  int        iUseFixedUpdates;  // output fixed number of samples/frame
 
-- 
2.39.5