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:
ramapcsx2 2008-10-14 14:57:05 +00:00 committed by Gregory Hainaut
parent f0583ffaf2
commit 27ff8cf44d
4 changed files with 32 additions and 33 deletions

View File

@ -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)
{

View File

@ -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]);

View File

@ -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);
}

View File

@ -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;
}
}