Circle buffer patch (savestate fix) [zinx]

This commit is contained in:
pagefault
2002-09-11 03:53:58 +00:00
parent 9fb45c3b4f
commit fd1411794c

View File

@@ -32,11 +32,13 @@ typedef enum { FALSE = 0, TRUE = 1 } BOOL;
typedef enum vidstate_e { vid_null, vid_none, vid_soft, vid_gl } vidstate_t; typedef enum vidstate_e { vid_null, vid_none, vid_soft, vid_gl } vidstate_t;
// SOUND RELATED VARIABLES // SOUND RELATED VARIABLES
SDL_AudioSpec audiospec;
int SoundEnabled = 1; int SoundEnabled = 1;
BYTE PrevStereoSound; BYTE PrevStereoSound;
DWORD PrevSoundQuality; DWORD PrevSoundQuality;
DWORD BufferLeftOver = 0; /* should we clear these on sound reset? */ Uint8 *Buffer = NULL;
short Buffer[1800 * 2]; int Buffer_len = 0, Buffer_fill = 0;
int Buffer_head = 0, Buffer_tail = 0;
extern BYTE StereoSound; extern BYTE StereoSound;
extern DWORD SoundQuality; extern DWORD SoundQuality;
@@ -503,6 +505,11 @@ int InitSound(void)
return FALSE; return FALSE;
} }
if (Buffer)
free(Buffer);
Buffer = NULL;
Buffer_len = 0;
PrevSoundQuality = SoundQuality; PrevSoundQuality = SoundQuality;
PrevStereoSound = StereoSound; PrevStereoSound = StereoSound;
@@ -524,7 +531,7 @@ int InitSound(void)
wanted.userdata = NULL; wanted.userdata = NULL;
wanted.callback = UpdateSound; wanted.callback = UpdateSound;
if (SDL_OpenAudio(&wanted, NULL) < 0) if (SDL_OpenAudio(&wanted, &audiospec) < 0)
{ {
fprintf(stderr, "Sound init failed!\n"); fprintf(stderr, "Sound init failed!\n");
fprintf(stderr, "freq: %d, channels: %d, samples: %d\n", fprintf(stderr, "freq: %d, channels: %d, samples: %d\n",
@@ -534,6 +541,10 @@ int InitSound(void)
} }
SDL_PauseAudio(0); SDL_PauseAudio(0);
Buffer_len = (audiospec.size * 2);
Buffer_len = (Buffer_len + 255) & ~255; /* Align to SPCSize */
Buffer = malloc(Buffer_len);
return TRUE; return TRUE;
} }
@@ -850,90 +861,30 @@ void CheckTimers(void)
void UpdateSound(void *userdata, Uint8 * stream, int len) void UpdateSound(void *userdata, Uint8 * stream, int len)
{ {
const int SPCSize = 256; int left;
int DataNeeded;
int i;
Uint8 *ptr;
len /= 2; /* only 16bit here */ left = Buffer_len - Buffer_head;
ptr = stream; if (left <= len) {
DataNeeded = len; memcpy(stream, &Buffer[Buffer_head], left);
stream += left;
/* take care of the things we left behind last time */ len -= left;
if (BufferLeftOver) Buffer_head = 0;
{ Buffer_fill -= left;
DataNeeded -= BufferLeftOver;
memcpy(ptr, &Buffer[BufferLeftOver],
(SPCSize - BufferLeftOver) * 2);
ptr += (SPCSize - BufferLeftOver) * 2;
BufferLeftOver = 0;
} }
if (len & 255) if (len) {
{ /* we'll save the rest first */ memcpy(stream, &Buffer[Buffer_head], len);
DataNeeded -= 256; Buffer_head += len;
} Buffer_fill -= len;
while (DataNeeded > 0)
{
SoundProcess();
for (i = 0; i < SPCSize; i++)
{
if (T36HZEnabled)
{
Buffer[i] = 0;
}
else
{
if (DSPBuffer[i] > 32767)
Buffer[i] = 32767;
else if (DSPBuffer[i] < -32767)
Buffer[i] = -32767;
else
Buffer[i] = DSPBuffer[i];
}
}
memcpy(ptr, &Buffer[0], SPCSize * 2);
ptr += SPCSize * 2;
DataNeeded -= SPCSize;
}
if (DataNeeded)
{
DataNeeded += 256;
BufferLeftOver = DataNeeded;
SoundProcess();
for (i = 0; i < SPCSize; i++)
{
if (T36HZEnabled)
{
Buffer[i] = 0;
}
else
{
if (DSPBuffer[i] > 32767)
Buffer[i] = 32767;
else if (DSPBuffer[i] < -32767)
Buffer[i] = -32767;
else
Buffer[i] = DSPBuffer[i];
}
}
memcpy(ptr, &Buffer[0], DataNeeded * 2);
} }
} }
void UpdateVFrame(void) void UpdateVFrame(void)
{ {
const int SPCSize = 256;
int i;
/* rcg06172001 get menu animations running correctly... */ /* rcg06172001 get menu animations running correctly... */
/*if (GUIOn2 == 1 && IsActivated == 0) SDL_WaitEvent(NULL);*/ /*if (GUIOn2 == 1 && IsActivated == 0) SDL_WaitEvent(NULL);*/
if (GUIOn2 == 1 && IsActivated == 0) if (GUIOn2 == 1 && IsActivated == 0)
@@ -941,6 +892,38 @@ void UpdateVFrame(void)
CheckTimers(); CheckTimers();
Main_Proc(); Main_Proc();
/* Process sound */
/* take care of the things we left behind last time */
SDL_LockAudio();
while (Buffer_fill < Buffer_len) {
short *ptr = (short*)&Buffer[Buffer_tail];
SoundProcess();
for (i = 0; i < SPCSize; i++, ptr++)
{
if (T36HZEnabled)
{
*ptr = 0;
}
else
{
if (DSPBuffer[i] > 32767)
*ptr = 32767;
else if (DSPBuffer[i] < -32767)
*ptr = -32767;
else
*ptr = DSPBuffer[i];
}
}
Buffer_fill += SPCSize * 2;
Buffer_tail += SPCSize * 2;
if (Buffer_tail >= Buffer_len) Buffer_tail = 0;
}
SDL_UnlockAudio();
} }
void clearwin() void clearwin()