mirror of https://github.com/PCSX2/pcsx2.git
Last update for today, timestretch needs one more addition, then its perfect. The soundbuffer can (rarely) over/underflow (loop) and throw of the emergency stretch calculations. Will fix that soon :)
git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@200 a6443dda-0b58-4228-96e9-037be469359c
This commit is contained in:
parent
f0583ffaf2
commit
27ff8cf44d
|
@ -46,12 +46,12 @@ int flags,srate,bitrate;
|
|||
|
||||
int sample_flags = 0;
|
||||
|
||||
int frame_size;
|
||||
u32 frame_size;
|
||||
|
||||
a52_state_t* ac3dec;
|
||||
sample_t *decode_buffer = NULL;
|
||||
|
||||
u32 data_rate=4;
|
||||
s32 data_rate=4;
|
||||
|
||||
int state=0;
|
||||
|
||||
|
@ -112,7 +112,7 @@ void spdif_Write(s32 data)
|
|||
}
|
||||
}
|
||||
|
||||
void spdif_remove_data(int bytes)
|
||||
void spdif_remove_data(unsigned int bytes)
|
||||
{
|
||||
if(bytes<data_in_buffer)
|
||||
{
|
||||
|
|
|
@ -261,7 +261,7 @@ private:
|
|||
verifyc(buffer->Lock(poffset,BufferSizeBytes,&p1,&s1,&p2,&s2,0));
|
||||
s16 *t = (s16*)p1;
|
||||
s32 *s = tbuffer;
|
||||
for(int i=0;i<CurBufferSize;i++)
|
||||
for(int j=0;j<CurBufferSize;j++)
|
||||
{
|
||||
// DPL2 code here: inputs s[0] and s[1]. outputs t[0] to t[5]
|
||||
Convert(t,s[0],s[1]);
|
||||
|
|
|
@ -137,7 +137,7 @@ private:
|
|||
verifyc(buffer->Lock(poffset,BufferSizeBytes,&p1,&s1,&p2,&s2,0));
|
||||
s16 *t = (s16*)p1;
|
||||
s32 *s = (s32*)tbuffer;
|
||||
for(int i=0;i<BufferSize;i++)
|
||||
for(int j=0;j<BufferSize;j++)
|
||||
{
|
||||
*(t++) = (s16)((*(s++))>>8);
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ SndOutModule* mods[]=
|
|||
|
||||
const u32 mods_count=sizeof(mods)/sizeof(SndOutModule*);
|
||||
|
||||
//usefull when timestretch isn't available
|
||||
//#define DYNAMIC_BUFFER_LIMITING
|
||||
|
||||
class SndBufferImpl: public SndBuffer
|
||||
|
@ -277,11 +278,9 @@ u32 oldWritten=0;
|
|||
u32 oldRead=0;
|
||||
u32 oldInput=0;
|
||||
|
||||
float valAccum1=0;
|
||||
float valAccum2=0;
|
||||
float valAccum3=0;
|
||||
u32 numAccum=1;
|
||||
|
||||
float valAccum1 = 1.0f;
|
||||
float valAccum2 = 1.0f;
|
||||
u32 numAccum = 1;
|
||||
|
||||
const u32 numUpdates = 112;
|
||||
|
||||
|
@ -313,22 +312,23 @@ void UpdateTempoChange()
|
|||
s32 bufferSize = sndBuffer->GetBufferSize();
|
||||
|
||||
//Emergency stretch to compensate for FPS fluctuations and keep the buffers happy
|
||||
bool a=(bufferUsage < CurBufferSize * 4);
|
||||
bool b=(bufferUsage >= (bufferSize - CurBufferSize * 4));
|
||||
bool a=(bufferUsage < CurBufferSize * 2.5);
|
||||
bool b=(bufferUsage >= (bufferSize - CurBufferSize * 2.5));
|
||||
|
||||
if(a!=b)
|
||||
{
|
||||
if (bufferUsage < CurBufferSize) { cTempo*=0.75f; }
|
||||
if (bufferUsage < CurBufferSize) { cTempo*=0.7f; }
|
||||
else if(bufferUsage < CurBufferSize * 2) { cTempo*=0.90f; }
|
||||
else if(bufferUsage < CurBufferSize * 3) { cTempo*=0.95f; }
|
||||
else if(bufferUsage < CurBufferSize * 4) { cTempo*=0.99f; }
|
||||
else if(bufferUsage < CurBufferSize * 2.5) { cTempo*=0.95f; }
|
||||
|
||||
if (bufferUsage > (bufferSize - CurBufferSize)) { cTempo*=1.25f; }
|
||||
if (bufferUsage > (bufferSize - CurBufferSize)) { cTempo*=1.3f; }
|
||||
else if(bufferUsage > (bufferSize - CurBufferSize * 2)) { cTempo*=1.10f; }
|
||||
else if(bufferUsage > (bufferSize - CurBufferSize * 3)) { cTempo*=1.05f; }
|
||||
else if(bufferUsage > (bufferSize - CurBufferSize * 4)) { cTempo*=1.01f; }
|
||||
|
||||
pSoundTouch->setTempo(cTempo);
|
||||
else if(bufferUsage > (bufferSize - CurBufferSize * 2.5)) { cTempo*=1.05f; }
|
||||
|
||||
if (cTempo != lastTempo) {
|
||||
printf("%f %d\n",cTempo,bufferUsage);
|
||||
pSoundTouch->setTempo(cTempo);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -348,30 +348,29 @@ void UpdateTempoChange()
|
|||
//normal stretch, scales sound to game speed
|
||||
if(numAccum >= numUpdates)
|
||||
{
|
||||
float valAccum = 1.0;
|
||||
|
||||
if (valAccum1 != 0)
|
||||
valAccum=valAccum2 / valAccum1;
|
||||
float valAccum = 1.0f;
|
||||
|
||||
valAccum = valAccum2 / valAccum1;
|
||||
|
||||
if((valAccum < 1.05) && (valAccum > 0.95) /*&& (valAccum != 1)*/)
|
||||
if((valAccum < 1.05f) && (valAccum > 0.95f) /*&& (valAccum != 1)*/)
|
||||
{
|
||||
// printf("Timestretch Debug > Playbackpeed: %f (difference disregarded, using 1.0).\n",valAccum);
|
||||
valAccum = 1;
|
||||
printf("Timestretch Debug > Playbackpeed: %f (difference disregarded, using 1.0).\n",valAccum);
|
||||
valAccum = 1.0f;
|
||||
}
|
||||
/*else
|
||||
else
|
||||
{
|
||||
printf("Timestretch Debug > Playbackpeed: %f\n",valAccum);
|
||||
}*/
|
||||
}
|
||||
|
||||
if (valAccum != lastTempo) //only update soundtouch object when needed
|
||||
pSoundTouch->setTempo(valAccum);
|
||||
|
||||
lastTempo = valAccum;
|
||||
cTempo = lastTempo;
|
||||
cTempo = valAccum;
|
||||
|
||||
valAccum1=0;
|
||||
valAccum2=0;
|
||||
numAccum=0;
|
||||
valAccum1 = 1.0f;
|
||||
valAccum2 = 1.0f;
|
||||
numAccum = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue