spu: cleanup some irq hacks
authornotaz <notasas@gmail.com>
Wed, 7 Sep 2022 23:50:36 +0000 (02:50 +0300)
committernotaz <notasas@gmail.com>
Thu, 8 Sep 2022 21:13:59 +0000 (00:13 +0300)
Note that bIgnoreLoop is still needed or
"Misadventures Of Tron Bonne" may hang after cutscenes.
Before this commit the game will sometimes cut off dialogues.

plugins/dfsound/spu.c

index 3aaf53a..f4426ab 100644 (file)
@@ -426,8 +426,8 @@ static int decode_block(void *unused, int ch, int *SB)
 
   start = s_chan->pLoop;
  }
- else
-  check_irq(ch, start);                    // hack, see check_irq below..
+
+ check_irq(ch, start);
 
  predict_nr = start[0];
  shift_factor = predict_nr & 0xf;
@@ -436,19 +436,11 @@ static int decode_block(void *unused, int ch, int *SB)
  decode_block_data(SB, start + 2, predict_nr, shift_factor);
 
  flags = start[1];
- if (flags & 4 && (!s_chan->bIgnoreLoop))
+ if (flags & 4 && !s_chan->bIgnoreLoop)
   s_chan->pLoop = start;                   // loop adress
 
  start += 16;
 
- if (flags & 1) {                          // 1: stop/loop
-  start = s_chan->pLoop;
-  check_irq(ch, start);                    // hack.. :(
- }
-
- if (start - spu.spuMemC >= 0x80000)
-  start = spu.spuMemC;
-
  s_chan->pCurr = start;                    // store values for next cycle
  s_chan->prevflags = flags;
 
@@ -469,20 +461,15 @@ static int skip_block(int ch)
 
   start = s_chan->pLoop;
  }
- else
 check_irq(ch, start);
+
+ check_irq(ch, start);
 
  flags = start[1];
- if (flags & 4)
+ if (flags & 4 && !s_chan->bIgnoreLoop)
   s_chan->pLoop = start;
 
  start += 16;
 
- if (flags & 1) {
-  start = s_chan->pLoop;
-  check_irq(ch, start);
- }
-
  s_chan->pCurr = start;
  s_chan->prevflags = flags;
 
@@ -511,8 +498,6 @@ static void scan_for_irq(int ch, unsigned int *upd_samples)
   block += 16;
   if (flags & 1) {                          // 1: stop/loop
    block = s_chan->pLoop;
-   if (block == spu.pSpuIrq)                // hack.. (see decode_block)
-    break;
   }
   pos += 28 << 16;
  }