* *
***************************************************************************/
-#if !defined(_WIN32) && !defined(NO_OS)
-#include <sys/time.h> // gettimeofday in xa.c
-#define THREAD_ENABLED 1
-#endif
#include "stdafx.h"
#define _IN_SPU
pos = s_chan->spos;
sinc = s_chan->sinc;
end = pos + *upd_samples * sinc;
+ if (s_chan->prevflags & 1) // 1: stop/loop
+ block = s_chan->pLoop;
pos += (28 - s_chan->iSBPos) << 16;
while (pos < end)
mix_chan(spu.SSumLR, ns_to, s_chan->iLeftVolume, s_chan->iRightVolume);
}
+ MixXA(spu.SSumLR, RVB, ns_to, spu.decode_pos);
+
if (spu.rvb->StartAddr) {
if (do_rvb)
REVERBDo(spu.SSumLR, RVB, ns_to, spu.rvb->CurrAddr);
// optional worker thread handling
-#if defined(THREAD_ENABLED) || defined(WANT_THREAD_CODE)
+#if P_HAVE_PTHREAD || defined(WANT_THREAD_CODE)
// worker thread state
static struct spu_worker {
work = &worker->i[worker->i_reaped & WORK_I_MASK];
thread_work_wait_sync(work, force);
+ MixXA(work->SSumLR, RVB, work->ns_to, work->decode_pos);
do_samples_finish(work->SSumLR, work->ns_to,
work->channels_silent, work->decode_pos);
static const void * const worker = NULL;
-#endif // THREAD_ENABLED
+#endif // P_HAVE_PTHREAD || defined(WANT_THREAD_CODE)
////////////////////////////////////////////////////////////////////////
// MAIN SPU FUNCTION
do_irq();
}
}
- check_irq_io(spu.spuAddr);
+ if (!spu.cycles_dma_end || (int)(spu.cycles_dma_end - cycles_to) < 0) {
+ spu.cycles_dma_end = 0;
+ check_irq_io(spu.spuAddr);
+ }
if (unlikely(spu.rvb->dirty))
REVERBPrep();
spu.decode_dirty_ch &= ~(1<<3);
}
- MixXA(SSumLR, ns_to, decode_pos);
-
vol_l = vol_l * spu_config.iVolume >> 10;
vol_r = vol_r * spu_config.iVolume >> 10;
- if (!(spu.spuCtrl & 0x4000) || !(vol_l | vol_r))
+ if (!(spu.spuCtrl & CTRL_MUTE) || !(vol_l | vol_r))
{
// muted? (rare)
memset(spu.pS, 0, ns_to * 2 * sizeof(spu.pS[0]));
/* special code for TI C64x DSP */
#include "spu_c64x.c"
-#elif defined(THREAD_ENABLED)
+#elif P_HAVE_PTHREAD
#include <pthread.h>
#include <semaphore.h>
worker = NULL;
}
-#else // if !THREAD_ENABLED
+#else // if !P_HAVE_PTHREAD
static void init_spu_thread(void)
{
{
int i;
+ memset(&spu, 0, sizeof(spu));
spu.spuMemC = calloc(1, 512 * 1024);
InitADSR();
return 0;
}
-// SPUTEST: we don't test, we are always fine ;)
-long CALLBACK SPUtest(void)
-{
- return 0;
-}
-
-// SPUCONFIGURE: call config dialog
-long CALLBACK SPUconfigure(void)
-{
-#ifdef _MACOSX
- DoConfiguration();
-#else
-// StartCfgTool("CFG");
-#endif
- return 0;
-}
-
-// SPUABOUT: show about window
-void CALLBACK SPUabout(void)
-{
-#ifdef _MACOSX
- DoAbout();
-#else
-// StartCfgTool("ABOUT");
-#endif
-}
-
// SETUP CALLBACKS
// this functions will be called once,
// passes a callback that should be called on SPU-IRQ/cdda volume change