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
frontend/pollux: program MLC2 for TV-out, save/restore regs
[pcsx_rearmed.git]
/
plugins
/
dfsound
/
spu.c
diff --git
a/plugins/dfsound/spu.c
b/plugins/dfsound/spu.c
index
f84ef77
..
ecc7ca0
100644
(file)
--- a/
plugins/dfsound/spu.c
+++ b/
plugins/dfsound/spu.c
@@
-132,6
+132,8
@@
int lastch=-1; // last channel processed on spu irq in timer mode
static int lastns=0; // last ns pos
static int iSecureStart=0; // secure start counter
static int lastns=0; // last ns pos
static int iSecureStart=0; // secure start counter
+#define CDDA_BUFFER_SIZE (16384 * sizeof(uint32_t)) // must be power of 2
+
////////////////////////////////////////////////////////////////////////
// CODE AREA
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// CODE AREA
////////////////////////////////////////////////////////////////////////
@@
-220,9
+222,10
@@
INLINE void InterpolateUp(int ch)
s_chan[ch].SB[32]=0;
s_chan[ch].SB[28]=(s_chan[ch].SB[28]*s_chan[ch].sinc)/0x20000L;
s_chan[ch].SB[32]=0;
s_chan[ch].SB[28]=(s_chan[ch].SB[28]*s_chan[ch].sinc)/0x20000L;
- if(s_chan[ch].sinc<=0x8000)
- s_chan[ch].SB[29]=s_chan[ch].SB[30]-(s_chan[ch].SB[28]*((0x10000/s_chan[ch].sinc)-1));
- else s_chan[ch].SB[29]+=s_chan[ch].SB[28];
+ //if(s_chan[ch].sinc<=0x8000)
+ // s_chan[ch].SB[29]=s_chan[ch].SB[30]-(s_chan[ch].SB[28]*((0x10000/s_chan[ch].sinc)-1));
+ //else
+ s_chan[ch].SB[29]+=s_chan[ch].SB[28];
}
else // no flags? add bigger val (if possible), calc smaller step, set flag1
s_chan[ch].SB[29]+=s_chan[ch].SB[28];
}
else // no flags? add bigger val (if possible), calc smaller step, set flag1
s_chan[ch].SB[29]+=s_chan[ch].SB[28];
@@
-336,7
+339,7
@@
INLINE void StoreInterpolationVal(int ch,int fa)
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
-INLINE int iGetInterpolationVal(int ch)
+INLINE int iGetInterpolationVal(int ch
, int spos
)
{
int fa;
{
int fa;
@@
-348,7
+351,7
@@
INLINE int iGetInterpolationVal(int ch)
case 3: // cubic interpolation
{
long xd;int gpos;
case 3: // cubic interpolation
{
long xd;int gpos;
- xd = (
(s_chan[ch].spos)
>> 1)+1;
+ xd = (
spos
>> 1)+1;
gpos = s_chan[ch].SB[28];
fa = gval(3) - 3*gval(2) + 3*gval(1) - gval0;
gpos = s_chan[ch].SB[28];
fa = gval(3) - 3*gval(2) + 3*gval(1) - gval0;
@@
-367,7
+370,7
@@
INLINE int iGetInterpolationVal(int ch)
case 2: // gauss interpolation
{
int vl, vr;int gpos;
case 2: // gauss interpolation
{
int vl, vr;int gpos;
- vl = (s
_chan[ch].s
pos >> 6) & ~3;
+ vl = (spos >> 6) & ~3;
gpos = s_chan[ch].SB[28];
vr=(gauss[vl]*gval0)&~2047;
vr+=(gauss[vl+1]*gval(1))&~2047;
gpos = s_chan[ch].SB[28];
vr=(gauss[vl]*gval0)&~2047;
vr+=(gauss[vl+1]*gval(1))&~2047;
@@
-567,7
+570,7
@@
out: \
make_do_samples(default, fmod_recv_check, ,
StoreInterpolationVal(ch, fa),
make_do_samples(default, fmod_recv_check, ,
StoreInterpolationVal(ch, fa),
- ChanBuf[ns] = iGetInterpolationVal(ch), )
+ ChanBuf[ns] = iGetInterpolationVal(ch
, spos
), )
make_do_samples(noint, , fa = s_chan[ch].SB[29], , ChanBuf[ns] = fa, s_chan[ch].SB[29] = fa)
#define simple_interp_store \
make_do_samples(noint, , fa = s_chan[ch].SB[29], , ChanBuf[ns] = fa, s_chan[ch].SB[29] = fa)
#define simple_interp_store \
@@
-901,12
+904,14
@@
static void *MAINThread(void *arg)
// SPU ASYNC... even newer epsxe func
// 1 time every 'cycle' cycles... harhar
// SPU ASYNC... even newer epsxe func
// 1 time every 'cycle' cycles... harhar
+// rearmed: called every 2ms now
+
void CALLBACK SPUasync(unsigned long cycle)
{
if(iSpuAsyncWait)
{
iSpuAsyncWait++;
void CALLBACK SPUasync(unsigned long cycle)
{
if(iSpuAsyncWait)
{
iSpuAsyncWait++;
- if(iSpuAsyncWait<=16/
FRAG_MSECS
) return;
+ if(iSpuAsyncWait<=16/
2
) return;
iSpuAsyncWait=0;
}
iSpuAsyncWait=0;
}
@@
-948,12
+953,12
@@
void CALLBACK SPUplayADPCMchannel(xa_decode_t *xap)
}
// CDDA AUDIO
}
// CDDA AUDIO
-
void
CALLBACK SPUplayCDDAchannel(short *pcm, int nbytes)
+
int
CALLBACK SPUplayCDDAchannel(short *pcm, int nbytes)
{
{
- if (!pcm) return;
- if (nbytes<=0) return;
+ if (!pcm) return
-1
;
+ if (nbytes<=0) return
-1
;
- FeedCDDA((unsigned char *)pcm, nbytes);
+
return
FeedCDDA((unsigned char *)pcm, nbytes);
}
// SETUPTIMER: init of certain buffers and threads/timers
}
// SETUPTIMER: init of certain buffers and threads/timers
@@
-1011,7
+1016,7
@@
void SetupStreams(void)
XAFeed = XAStart;
CDDAStart = // alloc cdda buffer
XAFeed = XAStart;
CDDAStart = // alloc cdda buffer
- (uint32_t *)malloc(
16384 * sizeof(uint32_t)
);
+ (uint32_t *)malloc(
CDDA_BUFFER_SIZE
);
CDDAEnd = CDDAStart + 16384;
CDDAPlay = CDDAStart;
CDDAFeed = CDDAStart;
CDDAEnd = CDDAStart + 16384;
CDDAPlay = CDDAStart;
CDDAFeed = CDDAStart;