-////////////////////////////////////////////////////////////////////////
-// MAIN SPU FUNCTION
-// here is the main job handler... thread, timer or direct func call
-// basically the whole sound processing is done in this fat func!
-////////////////////////////////////////////////////////////////////////
+// if irq is going to trigger sooner than in upd_samples, set upd_samples
+static void scan_for_irq(int ch, unsigned int *upd_samples)
+{
+ int pos, sinc, sinc_inv, end;
+ unsigned char *block;
+ int flags;
+
+ block = s_chan[ch].pCurr;
+ pos = s_chan[ch].spos;
+ sinc = s_chan[ch].sinc;
+ end = pos + *upd_samples * sinc;
+
+ pos += (28 - s_chan[ch].iSBPos) << 16;
+ while (pos < end)
+ {
+ if (block == spu.pSpuIrq)
+ break;
+ flags = block[1];
+ block += 16;
+ if (flags & 1) { // 1: stop/loop
+ block = s_chan[ch].pLoop;
+ if (block == spu.pSpuIrq) // hack.. (see decode_block)
+ break;
+ }
+ pos += 28 << 16;
+ }
+
+ if (pos < end)
+ {
+ sinc_inv = s_chan[ch].sinc_inv;
+ if (sinc_inv == 0)
+ sinc_inv = s_chan[ch].sinc_inv = (0x80000000u / (uint32_t)sinc) << 1;
+
+ pos -= s_chan[ch].spos;
+ *upd_samples = (((uint64_t)pos * sinc_inv) >> 32) + 1;
+ //xprintf("ch%02d: irq sched: %3d %03d\n",
+ // ch, *upd_samples, *upd_samples * 60 * 263 / 44100);
+ }
+}