X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fdfsound%2Fspu.c;h=0058ad260fd200b1d37f5df091d1bbd44121ec87;hp=9d43e43891f2f01a1ec2a365fbc62756f65ea841;hb=HEAD;hpb=ee98433b9ec9eb891cb285ff4818dc169d55ce87 diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c index 9d43e438..c14f6469 100644 --- a/plugins/dfsound/spu.c +++ b/plugins/dfsound/spu.c @@ -33,7 +33,7 @@ #include "arm_features.h" #endif -#ifdef HAVE_ARMV7 +#ifdef HAVE_ARMV6 #define ssat32_to_16(v) \ asm("ssat %0,#16,%1" : "=r" (v) : "r" (v)) #else @@ -333,11 +333,11 @@ INLINE int GetInterpolationGauss(const sample_buf *sb, int spos) int gpos = sb->interp.gauss.pos; int vl = (spos >> 6) & ~3; int vr; - vr = (gauss[vl+0] * gval(0)) >> 15; - vr += (gauss[vl+1] * gval(1)) >> 15; - vr += (gauss[vl+2] * gval(2)) >> 15; - vr += (gauss[vl+3] * gval(3)) >> 15; - return vr; + vr = gauss[vl+0] * gval(0); + vr += gauss[vl+1] * gval(1); + vr += gauss[vl+2] * gval(2); + vr += gauss[vl+3] * gval(3); + return vr >> 15; } static void decode_block_data(int *dest, const unsigned char *src, int predict_nr, int shift_factor) @@ -1245,6 +1245,7 @@ void do_samples(unsigned int cycles_to, int force_no_thread) spu.cycles_played += ns_to * 768; spu.decode_pos = (spu.decode_pos + ns_to) & 0x1ff; + spu.spuStat = (spu.spuStat & ~0x800) | ((spu.decode_pos << 3) & 0x800); #if 0 static int ccount; static time_t ctime; ccount++; if (time(NULL) != ctime) @@ -1255,8 +1256,8 @@ void do_samples(unsigned int cycles_to, int force_no_thread) static void do_samples_finish(int *SSumLR, int ns_to, int silentch, int decode_pos) { - int vol_l = ((int)regAreaGet(H_SPUmvolL) << 17) >> 17; - int vol_r = ((int)regAreaGet(H_SPUmvolR) << 17) >> 17; + int vol_l = ((int)regAreaGet(H_SPUcmvolL) << 16) >> 17; + int vol_r = ((int)regAreaGet(H_SPUcmvolR) << 16) >> 17; int ns; int d; @@ -1388,6 +1389,7 @@ void CALLBACK SPUplayADPCMchannel(xa_decode_t *xap, unsigned int cycle, int is_s FeedXA(xap); // call main XA feeder spu.xapGlobal = xap; // store info for save states + spu.cdClearSamples = 512; } // CDDA AUDIO @@ -1400,6 +1402,7 @@ int CALLBACK SPUplayCDDAchannel(short *pcm, int nbytes, unsigned int cycle, int do_samples(cycle, 1); // catch up to prevent source underflows later FeedCDDA((unsigned char *)pcm, nbytes); + spu.cdClearSamples = 512; return 0; } @@ -1571,6 +1574,14 @@ static void exit_spu_thread(void) #endif +long CALLBACK SPUfreeze(unsigned int ulFreezeMode, struct SPUFreeze * pF, + unsigned int cycles) +{ + if (worker != NULL) + sync_worker_thread(1); + return DoFreeze(ulFreezeMode, pF, cycles); +} + // SPUINIT: this func will be called first by the main emu long CALLBACK SPUinit(void) { @@ -1720,6 +1731,9 @@ void spu_get_debug_info(int *chans_out, int *run_chans, int *fmod_chans_out, int *run_chans = ~spu.dwChannelsAudible & ~spu.dwChannelDead & irq_chans; *fmod_chans_out = fmod_chans; *noise_chans_out = noise_chans; + // sometimes unused + (void)do_samples_skip_fmod; + (void)SkipADSR; } // vim:shiftwidth=1:expandtab