notaz.gp2x.de
/
pcsx_rearmed.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
4ccd0fb
)
spu: get rid of bStop, clean up
author
notaz
<notasas@gmail.com>
Fri, 2 Jan 2015 02:12:35 +0000
(
04:12
+0200)
committer
notaz
<notasas@gmail.com>
Sat, 3 Jan 2015 00:25:30 +0000
(
02:25
+0200)
plugins/dfsound/adsr.c
patch
|
blob
|
blame
|
history
plugins/dfsound/externals.h
patch
|
blob
|
blame
|
history
plugins/dfsound/freeze.c
patch
|
blob
|
blame
|
history
plugins/dfsound/registers.c
patch
|
blob
|
blame
|
history
plugins/dfsound/spu.c
patch
|
blob
|
blame
|
history
diff --git
a/plugins/dfsound/adsr.c
b/plugins/dfsound/adsr.c
index
976315d
..
a86f461
100644
(file)
--- a/
plugins/dfsound/adsr.c
+++ b/
plugins/dfsound/adsr.c
@@
-57,22
+57,22
@@
void InitADSR(void) // INIT ADSR
\r
INLINE void StartADSR(int ch) // MIX ADSR
\r
{
\r
\r
INLINE void StartADSR(int ch) // MIX ADSR
\r
{
\r
- s_chan[ch].ADSRX.State=
0;
// and init some adsr vars
\r
+ s_chan[ch].ADSRX.State=
ADSR_ATTACK;
// and init some adsr vars
\r
s_chan[ch].ADSRX.EnvelopeVol=0;
\r
}
\r
\r
////////////////////////////////////////////////////////////////////////
\r
\r
s_chan[ch].ADSRX.EnvelopeVol=0;
\r
}
\r
\r
////////////////////////////////////////////////////////////////////////
\r
\r
-static int MixADSR(
int ch, int ns_to) // MIX ADSR
\r
+static int MixADSR(
ADSRInfoEx *adsr, int ns_to)
\r
{
\r
{
\r
- int EnvelopeVol =
s_chan[ch].ADSRX.
EnvelopeVol;
\r
+ int EnvelopeVol =
adsr->
EnvelopeVol;
\r
int ns = 0, val, rto, level;
\r
\r
int ns = 0, val, rto, level;
\r
\r
- if (
s_chan[ch].bStop) // should be stopped:
\r
- {
// do release
\r
- val = RateTableSub[
s_chan[ch].ADSRX.
ReleaseRate * 4];
\r
+ if (
adsr->State == ADSR_RELEASE)
\r
+ {
\r
+ val = RateTableSub[
adsr->
ReleaseRate * 4];
\r
\r
\r
- if (
s_chan[ch].ADSRX.
ReleaseModeExp)
\r
+ if (
adsr->
ReleaseModeExp)
\r
{
\r
for (; ns < ns_to; ns++)
\r
{
\r
{
\r
for (; ns < ns_to; ns++)
\r
{
\r
@@
-100,13
+100,13
@@
static int MixADSR(int ch, int ns_to) // MIX ADSR
goto done;
\r
}
\r
\r
goto done;
\r
}
\r
\r
- switch (
s_chan[ch].ADSRX.
State)
\r
+ switch (
adsr->
State)
\r
{
\r
{
\r
- case
0:
// -> attack
\r
+ case
ADSR_ATTACK:
// -> attack
\r
rto = 0;
\r
rto = 0;
\r
- if (
s_chan[ch].ADSRX.
AttackModeExp && EnvelopeVol >= 0x60000000)
\r
+ if (
adsr->
AttackModeExp && EnvelopeVol >= 0x60000000)
\r
rto = 8;
\r
rto = 8;
\r
- val = RateTableAdd[
s_chan[ch].ADSRX.
AttackRate + rto];
\r
+ val = RateTableAdd[
adsr->
AttackRate + rto];
\r
\r
for (; ns < ns_to; ns++)
\r
{
\r
\r
for (; ns < ns_to; ns++)
\r
{
\r
@@
-121,7
+121,7
@@
static int MixADSR(int ch, int ns_to) // MIX ADSR
if (EnvelopeVol < 0) // overflow
\r
{
\r
EnvelopeVol = 0x7fffffff;
\r
if (EnvelopeVol < 0) // overflow
\r
{
\r
EnvelopeVol = 0x7fffffff;
\r
-
s_chan[ch].ADSRX.State = 1
;
\r
+
adsr->State = ADSR_DECAY
;
\r
ns++; // sample is good already
\r
goto decay;
\r
}
\r
ns++; // sample is good already
\r
goto decay;
\r
}
\r
@@
-129,9
+129,9
@@
static int MixADSR(int ch, int ns_to) // MIX ADSR
\r
//--------------------------------------------------//
\r
decay:
\r
\r
//--------------------------------------------------//
\r
decay:
\r
- case
1:
// -> decay
\r
- val = RateTableSub[
s_chan[ch].ADSRX.
DecayRate * 4];
\r
- level =
s_chan[ch].ADSRX.
SustainLevel;
\r
+ case
ADSR_DECAY:
// -> decay
\r
+ val = RateTableSub[
adsr->
DecayRate * 4];
\r
+ level =
adsr->
SustainLevel;
\r
\r
for (; ns < ns_to; )
\r
{
\r
\r
for (; ns < ns_to; )
\r
{
\r
@@
-145,7
+145,7
@@
static int MixADSR(int ch, int ns_to) // MIX ADSR
\r
if (((EnvelopeVol >> 27) & 0xf) <= level)
\r
{
\r
\r
if (((EnvelopeVol >> 27) & 0xf) <= level)
\r
{
\r
-
s_chan[ch].ADSRX.State = 2
;
\r
+
adsr->State = ADSR_SUSTAIN
;
\r
goto sustain;
\r
}
\r
}
\r
goto sustain;
\r
}
\r
}
\r
@@
-153,8
+153,8
@@
static int MixADSR(int ch, int ns_to) // MIX ADSR
\r
//--------------------------------------------------//
\r
sustain:
\r
\r
//--------------------------------------------------//
\r
sustain:
\r
- case
2:
// -> sustain
\r
- if (
s_chan[ch].ADSRX.
SustainIncrease)
\r
+ case
ADSR_SUSTAIN:
// -> sustain
\r
+ if (
adsr->
SustainIncrease)
\r
{
\r
if (EnvelopeVol >= 0x7fff0000)
\r
{
\r
{
\r
if (EnvelopeVol >= 0x7fff0000)
\r
{
\r
@@
-163,9
+163,9
@@
static int MixADSR(int ch, int ns_to) // MIX ADSR
}
\r
\r
rto = 0;
\r
}
\r
\r
rto = 0;
\r
- if (
s_chan[ch].ADSRX.
SustainModeExp && EnvelopeVol >= 0x60000000)
\r
+ if (
adsr->
SustainModeExp && EnvelopeVol >= 0x60000000)
\r
rto = 8;
\r
rto = 8;
\r
- val = RateTableAdd[
s_chan[ch].ADSRX.
SustainRate + rto];
\r
+ val = RateTableAdd[
adsr->
SustainRate + rto];
\r
\r
for (; ns < ns_to; ns++)
\r
{
\r
\r
for (; ns < ns_to; ns++)
\r
{
\r
@@
-183,8
+183,8
@@
static int MixADSR(int ch, int ns_to) // MIX ADSR
}
\r
else
\r
{
\r
}
\r
else
\r
{
\r
- val = RateTableSub[
s_chan[ch].ADSRX.
SustainRate];
\r
- if (
s_chan[ch].ADSRX.
SustainModeExp)
\r
+ val = RateTableSub[
adsr->
SustainRate];
\r
+ if (
adsr->
SustainModeExp)
\r
{
\r
for (; ns < ns_to; ns++)
\r
{
\r
{
\r
for (; ns < ns_to; ns++)
\r
{
\r
@@
-213,7
+213,7
@@
static int MixADSR(int ch, int ns_to) // MIX ADSR
}
\r
\r
done:
\r
}
\r
\r
done:
\r
-
s_chan[ch].ADSRX.
EnvelopeVol = EnvelopeVol;
\r
+
adsr->
EnvelopeVol = EnvelopeVol;
\r
return ns;
\r
}
\r
\r
return ns;
\r
}
\r
\r
diff --git
a/plugins/dfsound/externals.h
b/plugins/dfsound/externals.h
index
7935cb9
..
d1d081a
100644
(file)
--- a/
plugins/dfsound/externals.h
+++ b/
plugins/dfsound/externals.h
@@
-53,10
+53,17
@@
// struct defines
\r
///////////////////////////////////////////////////////////
\r
\r
// struct defines
\r
///////////////////////////////////////////////////////////
\r
\r
+enum ADSR_State {
\r
+ ADSR_ATTACK = 0,
\r
+ ADSR_DECAY = 1,
\r
+ ADSR_SUSTAIN = 2,
\r
+ ADSR_RELEASE = 3,
\r
+};
\r
+
\r
// ADSR INFOS PER CHANNEL
\r
typedef struct
\r
{
\r
// ADSR INFOS PER CHANNEL
\r
typedef struct
\r
{
\r
- unsigned char State:2;
\r
+ unsigned char State:2;
// ADSR_State
\r
unsigned char AttackModeExp:1;
\r
unsigned char SustainModeExp:1;
\r
unsigned char SustainIncrease:1;
\r
unsigned char AttackModeExp:1;
\r
unsigned char SustainModeExp:1;
\r
unsigned char SustainIncrease:1;
\r
@@
-93,7
+100,6
@@
typedef struct
unsigned char * pCurr; // current pos in sound mem
\r
unsigned char * pLoop; // loop ptr in sound mem
\r
\r
unsigned char * pCurr; // current pos in sound mem
\r
unsigned char * pLoop; // loop ptr in sound mem
\r
\r
- unsigned int bStop:1; // is channel stopped (sample _can_ still be playing, ADSR Release phase)
\r
unsigned int bReverb:1; // can we do reverb on this channel? must have ctrl register bit, to get active
\r
unsigned int bRVBActive:1; // reverb active flag
\r
unsigned int bNoise:1; // noise active flag
\r
unsigned int bReverb:1; // can we do reverb on this channel? must have ctrl register bit, to get active
\r
unsigned int bRVBActive:1; // reverb active flag
\r
unsigned int bNoise:1; // noise active flag
\r
diff --git
a/plugins/dfsound/freeze.c
b/plugins/dfsound/freeze.c
index
d38faa6
..
be344ce
100644
(file)
--- a/
plugins/dfsound/freeze.c
+++ b/
plugins/dfsound/freeze.c
@@
-148,7
+148,7
@@
static void save_channel(SPUCHAN_orig *d, const SPUCHAN *s, int ch)
d->iCurr = 0; // set by the caller
\r
d->iLoop = 0; // set by the caller
\r
d->bOn = !!(spu.dwChannelOn & (1<<ch));
\r
d->iCurr = 0; // set by the caller
\r
d->iLoop = 0; // set by the caller
\r
d->bOn = !!(spu.dwChannelOn & (1<<ch));
\r
- d->bStop = s->
bStop
;
\r
+ d->bStop = s->
ADSRX.State == ADSR_RELEASE
;
\r
d->bReverb = s->bReverb;
\r
d->iActFreq = 1;
\r
d->iUsedFreq = 2;
\r
d->bReverb = s->bReverb;
\r
d->iActFreq = 1;
\r
d->iUsedFreq = 2;
\r
@@
-188,7
+188,6
@@
static void load_channel(SPUCHAN *d, const SPUCHAN_orig *s, int ch)
memcpy(d->SB, s->SB, sizeof(d->SB));
\r
d->pCurr = (void *)((long)s->iCurr & 0x7fff0);
\r
d->pLoop = (void *)((long)s->iLoop & 0x7fff0);
\r
memcpy(d->SB, s->SB, sizeof(d->SB));
\r
d->pCurr = (void *)((long)s->iCurr & 0x7fff0);
\r
d->pLoop = (void *)((long)s->iLoop & 0x7fff0);
\r
- d->bStop = s->bStop;
\r
d->bReverb = s->bReverb;
\r
d->iLeftVolume = s->iLeftVolume;
\r
d->iRightVolume = s->iRightVolume;
\r
d->bReverb = s->bReverb;
\r
d->iLeftVolume = s->iLeftVolume;
\r
d->iRightVolume = s->iRightVolume;
\r
@@
-198,6
+197,7
@@
static void load_channel(SPUCHAN *d, const SPUCHAN_orig *s, int ch)
d->bFMod = s->bFMod;
\r
d->prevflags = (s->bIgnoreLoop >> 1) ^ 2;
\r
d->ADSRX.State = s->ADSRX.State;
\r
d->bFMod = s->bFMod;
\r
d->prevflags = (s->bIgnoreLoop >> 1) ^ 2;
\r
d->ADSRX.State = s->ADSRX.State;
\r
+ if (s->bStop) d->ADSRX.State = ADSR_RELEASE;
\r
d->ADSRX.AttackModeExp = s->ADSRX.AttackModeExp;
\r
d->ADSRX.AttackRate = s->ADSRX.AttackRate;
\r
d->ADSRX.DecayRate = s->ADSRX.DecayRate;
\r
d->ADSRX.AttackModeExp = s->ADSRX.AttackModeExp;
\r
d->ADSRX.AttackRate = s->ADSRX.AttackRate;
\r
d->ADSRX.DecayRate = s->ADSRX.DecayRate;
\r
@@
-349,7
+349,6
@@
void LoadStateUnknown(SPUFreeze_t * pF, uint32_t cycles)
\r
for(i=0;i<MAXCHAN;i++)
\r
{
\r
\r
for(i=0;i<MAXCHAN;i++)
\r
{
\r
- s_chan[i].bStop=0;
\r
s_chan[i].pLoop=spu.spuMemC;
\r
}
\r
\r
s_chan[i].pLoop=spu.spuMemC;
\r
}
\r
\r
diff --git
a/plugins/dfsound/registers.c
b/plugins/dfsound/registers.c
index
8e4956e
..
bc99d9a
100644
(file)
--- a/
plugins/dfsound/registers.c
+++ b/
plugins/dfsound/registers.c
@@
-378,9
+378,9
@@
static void SoundOff(int start,int end,unsigned short val)
int ch;
\r
for(ch=start;ch<end;ch++,val>>=1) // loop channels
\r
{
\r
int ch;
\r
for(ch=start;ch<end;ch++,val>>=1) // loop channels
\r
{
\r
- if(val&1)
// && s_chan[i].bOn) mmm...
\r
+ if(val&1)
\r
{
\r
{
\r
- s_chan[ch].
bStop=1
;
\r
+ s_chan[ch].
ADSRX.State = ADSR_RELEASE
;
\r
\r
// Jungle Book - Rhythm 'n Groove
\r
// - turns off buzzing sound (loop hangs)
\r
\r
// Jungle Book - Rhythm 'n Groove
\r
// - turns off buzzing sound (loop hangs)
\r
diff --git
a/plugins/dfsound/spu.c
b/plugins/dfsound/spu.c
index
147db94
..
66ab150
100644
(file)
--- a/
plugins/dfsound/spu.c
+++ b/
plugins/dfsound/spu.c
@@
-238,7
+238,6
@@
INLINE void StartSound(int ch)
StartADSR(ch);
StartREVERB(ch);
StartADSR(ch);
StartREVERB(ch);
- s_chan[ch].bStop=0;
s_chan[ch].prevflags=2;
s_chan[ch].SB[26]=0; // init mixing vars
s_chan[ch].prevflags=2;
s_chan[ch].SB[26]=0; // init mixing vars
@@
-765,10
+764,9
@@
static void do_channels(int ns_to)
else
d = do_samples_default(ch, ns_to);
else
d = do_samples_default(ch, ns_to);
- d = MixADSR(
ch
, d);
+ d = MixADSR(
&s_chan[ch].ADSRX
, d);
if (d < ns_to) {
spu.dwChannelOn &= ~(1 << ch);
if (d < ns_to) {
spu.dwChannelOn &= ~(1 << ch);
- s_chan[ch].bStop = 1;
s_chan[ch].ADSRX.EnvelopeVol = 0;
memset(&ChanBuf[d], 0, (ns_to - d) * sizeof(ChanBuf[0]));
}
s_chan[ch].ADSRX.EnvelopeVol = 0;
memset(&ChanBuf[d], 0, (ns_to - d) * sizeof(ChanBuf[0]));
}