Fixed bug #69
Hopefully this takes care of most of the audio dropouts in Windows --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401882
This commit is contained in:
parent
f955c92364
commit
d9c54aecc1
2 changed files with 23 additions and 13 deletions
|
@ -254,7 +254,7 @@ static void DX5_WaitAudio_BusyWait(_THIS)
|
||||||
/* Semi-busy wait, since we have no way of getting play notification
|
/* Semi-busy wait, since we have no way of getting play notification
|
||||||
on a primary mixing buffer located in hardware (DirectX 5.0)
|
on a primary mixing buffer located in hardware (DirectX 5.0)
|
||||||
*/
|
*/
|
||||||
result = IDirectSoundBuffer_GetCurrentPosition(mixbuf, &cursor, &junk);
|
result = IDirectSoundBuffer_GetCurrentPosition(mixbuf, &junk, &cursor);
|
||||||
if ( result != DS_OK ) {
|
if ( result != DS_OK ) {
|
||||||
if ( result == DSERR_BUFFERLOST ) {
|
if ( result == DSERR_BUFFERLOST ) {
|
||||||
IDirectSoundBuffer_Restore(mixbuf);
|
IDirectSoundBuffer_Restore(mixbuf);
|
||||||
|
@ -264,11 +264,10 @@ static void DX5_WaitAudio_BusyWait(_THIS)
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cursor /= mixlen;
|
|
||||||
|
|
||||||
while ( cursor == playing ) {
|
while ( (cursor/mixlen) == lastchunk ) {
|
||||||
/* FIXME: find out how much time is left and sleep that long */
|
/* FIXME: find out how much time is left and sleep that long */
|
||||||
SDL_Delay(10);
|
SDL_Delay(1);
|
||||||
|
|
||||||
/* Try to restore a lost sound buffer */
|
/* Try to restore a lost sound buffer */
|
||||||
IDirectSoundBuffer_GetStatus(mixbuf, &status);
|
IDirectSoundBuffer_GetStatus(mixbuf, &status);
|
||||||
|
@ -292,12 +291,11 @@ static void DX5_WaitAudio_BusyWait(_THIS)
|
||||||
|
|
||||||
/* Find out where we are playing */
|
/* Find out where we are playing */
|
||||||
result = IDirectSoundBuffer_GetCurrentPosition(mixbuf,
|
result = IDirectSoundBuffer_GetCurrentPosition(mixbuf,
|
||||||
&cursor, &junk);
|
&junk, &cursor);
|
||||||
if ( result != DS_OK ) {
|
if ( result != DS_OK ) {
|
||||||
SetDSerror("DirectSound GetCurrentPosition", result);
|
SetDSerror("DirectSound GetCurrentPosition", result);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cursor /= mixlen;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,18 +344,30 @@ static Uint8 *DX5_GetAudioBuf(_THIS)
|
||||||
|
|
||||||
/* Figure out which blocks to fill next */
|
/* Figure out which blocks to fill next */
|
||||||
locked_buf = NULL;
|
locked_buf = NULL;
|
||||||
result = IDirectSoundBuffer_GetCurrentPosition(mixbuf, &cursor, &junk);
|
result = IDirectSoundBuffer_GetCurrentPosition(mixbuf, &junk, &cursor);
|
||||||
if ( result == DSERR_BUFFERLOST ) {
|
if ( result == DSERR_BUFFERLOST ) {
|
||||||
IDirectSoundBuffer_Restore(mixbuf);
|
IDirectSoundBuffer_Restore(mixbuf);
|
||||||
result = IDirectSoundBuffer_GetCurrentPosition(mixbuf,
|
result = IDirectSoundBuffer_GetCurrentPosition(mixbuf,
|
||||||
&cursor, &junk);
|
&junk, &cursor);
|
||||||
}
|
}
|
||||||
if ( result != DS_OK ) {
|
if ( result != DS_OK ) {
|
||||||
SetDSerror("DirectSound GetCurrentPosition", result);
|
SetDSerror("DirectSound GetCurrentPosition", result);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
cursor /= mixlen;
|
cursor /= mixlen;
|
||||||
playing = cursor;
|
#ifdef DEBUG_SOUND
|
||||||
|
/* Detect audio dropouts */
|
||||||
|
{ DWORD spot = cursor;
|
||||||
|
if ( spot < lastchunk ) {
|
||||||
|
spot += NUM_BUFFERS;
|
||||||
|
}
|
||||||
|
if ( spot > lastchunk+1 ) {
|
||||||
|
fprintf(stderr, "Audio dropout, missed %d fragments\n",
|
||||||
|
(spot - (lastchunk+1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
lastchunk = cursor;
|
||||||
cursor = (cursor+1)%NUM_BUFFERS;
|
cursor = (cursor+1)%NUM_BUFFERS;
|
||||||
cursor *= mixlen;
|
cursor *= mixlen;
|
||||||
|
|
||||||
|
@ -491,7 +501,7 @@ static int CreatePrimary(LPDIRECTSOUND sndObj, HWND focus,
|
||||||
static int CreateSecondary(LPDIRECTSOUND sndObj, HWND focus,
|
static int CreateSecondary(LPDIRECTSOUND sndObj, HWND focus,
|
||||||
LPDIRECTSOUNDBUFFER *sndbuf, WAVEFORMATEX *wavefmt, Uint32 chunksize)
|
LPDIRECTSOUNDBUFFER *sndbuf, WAVEFORMATEX *wavefmt, Uint32 chunksize)
|
||||||
{
|
{
|
||||||
const int numchunks = 2;
|
const int numchunks = 8;
|
||||||
HRESULT result;
|
HRESULT result;
|
||||||
DSBUFFERDESC format;
|
DSBUFFERDESC format;
|
||||||
LPVOID pvAudioPtr1, pvAudioPtr2;
|
LPVOID pvAudioPtr1, pvAudioPtr2;
|
||||||
|
@ -679,7 +689,7 @@ static int DX5_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The buffer will auto-start playing in DX5_WaitAudio() */
|
/* The buffer will auto-start playing in DX5_WaitAudio() */
|
||||||
playing = 0;
|
lastchunk = 0;
|
||||||
mixlen = spec->size;
|
mixlen = spec->size;
|
||||||
|
|
||||||
#ifdef USE_POSITION_NOTIFY
|
#ifdef USE_POSITION_NOTIFY
|
||||||
|
|
|
@ -37,7 +37,7 @@ struct SDL_PrivateAudioData {
|
||||||
LPDIRECTSOUNDBUFFER mixbuf;
|
LPDIRECTSOUNDBUFFER mixbuf;
|
||||||
int NUM_BUFFERS;
|
int NUM_BUFFERS;
|
||||||
int mixlen, silence;
|
int mixlen, silence;
|
||||||
DWORD playing;
|
DWORD lastchunk;
|
||||||
Uint8 *locked_buf;
|
Uint8 *locked_buf;
|
||||||
HANDLE audio_event;
|
HANDLE audio_event;
|
||||||
};
|
};
|
||||||
|
@ -48,7 +48,7 @@ struct SDL_PrivateAudioData {
|
||||||
#define NUM_BUFFERS (this->hidden->NUM_BUFFERS)
|
#define NUM_BUFFERS (this->hidden->NUM_BUFFERS)
|
||||||
#define mixlen (this->hidden->mixlen)
|
#define mixlen (this->hidden->mixlen)
|
||||||
#define silence (this->hidden->silence)
|
#define silence (this->hidden->silence)
|
||||||
#define playing (this->hidden->playing)
|
#define lastchunk (this->hidden->lastchunk)
|
||||||
#define locked_buf (this->hidden->locked_buf)
|
#define locked_buf (this->hidden->locked_buf)
|
||||||
#define audio_event (this->hidden->audio_event)
|
#define audio_event (this->hidden->audio_event)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue