notaz.gp2x.de
/
pcsx_rearmed.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #7 from tobiasjakobi/fixes
[pcsx_rearmed.git]
/
plugins
/
dfsound
/
spu.c
diff --git
a/plugins/dfsound/spu.c
b/plugins/dfsound/spu.c
index
a190b29
..
6cefd11
100644
(file)
--- a/
plugins/dfsound/spu.c
+++ b/
plugins/dfsound/spu.c
@@
-671,12
+671,13
@@
static void noinline do_decode_bufs(int which, int start, int count)
{
const int *src = ChanBuf + start;
unsigned short *dst = &spuMem[0x800/2 + which*0x400/2];
{
const int *src = ChanBuf + start;
unsigned short *dst = &spuMem[0x800/2 + which*0x400/2];
- int cursor = decode_pos;
+ int cursor = decode_pos
+ start
;
while (count-- > 0)
{
while (count-- > 0)
{
+ cursor &= 0x1ff;
dst[cursor] = *src++;
dst[cursor] = *src++;
- cursor
= (cursor + 1) & 0x1ff
;
+ cursor
++
;
}
// decode_pos is updated and irqs are checked later, after voice loop
}
// decode_pos is updated and irqs are checked later, after voice loop
@@
-706,8
+707,6
@@
static int do_samples(int forced_updates)
while(!bIRQReturn)
{
while(!bIRQReturn)
{
- cycles_since_update = 0;
-
ns_from=0;
ns_to=NSSIZE;
ch=0;
ns_from=0;
ns_to=NSSIZE;
ch=0;
@@
-836,6
+835,8
@@
static int do_samples(int forced_updates)
ns++;
}
ns++;
}
+ cycles_since_update -= PSXCLK / 44100 * NSSIZE;
+
//////////////////////////////////////////////////////
// special irq handling in the decode buffers (0x0000-0x1000)
// we know:
//////////////////////////////////////////////////////
// special irq handling in the decode buffers (0x0000-0x1000)
// we know:
@@
-887,8
+888,15
@@
static int do_samples(int forced_updates)
if(forced_updates == 0 && out_current->busy())
break;
}
if(forced_updates == 0 && out_current->busy())
break;
}
+
+ if(cycles_since_update <= -PSXCLK/60 / 4)
+ break;
}
}
+ // this may cause desync, but help audio when the emu can't keep up..
+ if(cycles_since_update < 0)
+ cycles_since_update = 0;
+
return 0;
}
return 0;
}
@@
-899,7
+907,6
@@
static int do_samples(int forced_updates)
void CALLBACK SPUasync(unsigned long cycle)
{
void CALLBACK SPUasync(unsigned long cycle)
{
- static int old_ctrl;
int forced_updates = 0;
int do_update = 0;
int forced_updates = 0;
int do_update = 0;
@@
-914,16
+921,8
@@
void CALLBACK SPUasync(unsigned long cycle)
had_dma = 0;
}
had_dma = 0;
}
- if((spuCtrl&CTRL_IRQ) && (((spuCtrl^old_ctrl)&CTRL_IRQ) // irq was enabled
- || cycles_since_update > PSXCLK/60 / 4)) {
+ if(cycles_since_update > PSXCLK/60 * 5/4)
do_update = 1;
do_update = 1;
- forced_updates = cycles_since_update / (PSXCLK/44100) / NSSIZE;
- }
- // with no irqs, once per frame should be fine (using a bit more because of BIAS)
- else if(cycles_since_update > PSXCLK/60 * 5/4)
- do_update = 1;
-
- old_ctrl = spuCtrl;
if(do_update)
do_samples(forced_updates);
if(do_update)
do_samples(forced_updates);