From: notaz Date: Sat, 16 Mar 2013 02:14:24 +0000 (+0200) Subject: spu: change sync again X-Git-Tag: r19~2 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=commitdiff_plain;h=16187bfb1518db23ade931cd7358ba973a585180 spu: change sync again will hurt audio if game is way too slow, but perhaps improve sync situation a bit.. --- diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c index b89ab1af..6cefd112 100644 --- a/plugins/dfsound/spu.c +++ b/plugins/dfsound/spu.c @@ -707,8 +707,6 @@ static int do_samples(int forced_updates) while(!bIRQReturn) { - cycles_since_update = 0; - ns_from=0; ns_to=NSSIZE; ch=0; @@ -837,6 +835,8 @@ static int do_samples(int forced_updates) ns++; } + cycles_since_update -= PSXCLK / 44100 * NSSIZE; + ////////////////////////////////////////////////////// // special irq handling in the decode buffers (0x0000-0x1000) // we know: @@ -888,8 +888,15 @@ static int do_samples(int forced_updates) 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; } @@ -900,7 +907,6 @@ static int do_samples(int forced_updates) void CALLBACK SPUasync(unsigned long cycle) { - static int old_ctrl; int forced_updates = 0; int do_update = 0; @@ -915,16 +921,8 @@ void CALLBACK SPUasync(unsigned long cycle) 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; - 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);