Fixed confusion between Ryan's new audio stream and the audio buffer we were calling stream in the callback

This commit is contained in:
Sam Lantinga 2017-01-06 00:47:42 -08:00
parent 3df77ced1e
commit 37f404fb87

View File

@ -547,8 +547,8 @@ SDL_RunAudio(void *devicep)
SDL_AudioDevice *device = (SDL_AudioDevice *) devicep; SDL_AudioDevice *device = (SDL_AudioDevice *) devicep;
const int silence = (int) device->spec.silence; const int silence = (int) device->spec.silence;
const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq); const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq);
const int stream_len = device->callbackspec.size; const int data_len = device->callbackspec.size;
Uint8 *stream; Uint8 *data;
void *udata = device->spec.userdata; void *udata = device->spec.userdata;
SDL_AudioCallback callback = device->spec.callback; SDL_AudioCallback callback = device->spec.callback;
@ -565,8 +565,8 @@ SDL_RunAudio(void *devicep)
while (!SDL_AtomicGet(&device->shutdown)) { while (!SDL_AtomicGet(&device->shutdown)) {
/* Fill the current buffer with sound */ /* Fill the current buffer with sound */
if (!device->stream && SDL_AtomicGet(&device->enabled)) { if (!device->stream && SDL_AtomicGet(&device->enabled)) {
SDL_assert(device->spec.size == device->callbackspec.size); SDL_assert(data_len == device->spec.size);
stream = current_audio.impl.GetDeviceBuf(device); data = current_audio.impl.GetDeviceBuf(device);
} else { } else {
/* if the device isn't enabled, we still write to the /* if the device isn't enabled, we still write to the
work_buffer, so the app's callback will fire with work_buffer, so the app's callback will fire with
@ -574,48 +574,48 @@ SDL_RunAudio(void *devicep)
for timing or progress. They can use hotplug for timing or progress. They can use hotplug
now to know if the device failed. now to know if the device failed.
Streaming playback uses work_buffer, too. */ Streaming playback uses work_buffer, too. */
stream = NULL; data = NULL;
} }
if (stream == NULL) { if (data == NULL) {
stream = device->work_buffer; data = device->work_buffer;
} }
if ( SDL_AtomicGet(&device->enabled) ) { if ( SDL_AtomicGet(&device->enabled) ) {
/* !!! FIXME: this should be LockDevice. */ /* !!! FIXME: this should be LockDevice. */
SDL_LockMutex(device->mixer_lock); SDL_LockMutex(device->mixer_lock);
if (SDL_AtomicGet(&device->paused)) { if (SDL_AtomicGet(&device->paused)) {
SDL_memset(stream, silence, stream_len); SDL_memset(data, silence, data_len);
} else { } else {
callback(udata, stream, stream_len); callback(udata, data, data_len);
} }
SDL_UnlockMutex(device->mixer_lock); SDL_UnlockMutex(device->mixer_lock);
} else { } else {
SDL_memset(stream, silence, stream_len); SDL_memset(data, silence, data_len);
} }
if (device->stream) { if (device->stream) {
/* Stream available audio to device, converting/resampling. */ /* Stream available audio to device, converting/resampling. */
/* if this fails...oh well. We'll play silence here. */ /* if this fails...oh well. We'll play silence here. */
SDL_AudioStreamPut(device->stream, stream, stream_len); SDL_AudioStreamPut(device->stream, data, data_len);
while (SDL_AudioStreamAvailable(device->stream) >= ((int) device->spec.size)) { while (SDL_AudioStreamAvailable(device->stream) >= ((int) device->spec.size)) {
stream = SDL_AtomicGet(&device->enabled) ? current_audio.impl.GetDeviceBuf(device) : NULL; data = SDL_AtomicGet(&device->enabled) ? current_audio.impl.GetDeviceBuf(device) : NULL;
if (stream == NULL) { if (data == NULL) {
SDL_AudioStreamClear(device->stream); SDL_AudioStreamClear(device->stream);
SDL_Delay(delay); SDL_Delay(delay);
break; break;
} else { } else {
const int got = SDL_AudioStreamGet(device->stream, stream, device->spec.size); const int got = SDL_AudioStreamGet(device->stream, data, device->spec.size);
SDL_assert((got < 0) || (got == device->spec.size)); SDL_assert((got < 0) || (got == device->spec.size));
if (got != device->spec.size) { if (got != device->spec.size) {
SDL_memset(stream, device->spec.silence, device->spec.size); SDL_memset(data, device->spec.silence, device->spec.size);
} }
current_audio.impl.PlayDevice(device); current_audio.impl.PlayDevice(device);
current_audio.impl.WaitDevice(device); current_audio.impl.WaitDevice(device);
} }
} }
} else if (stream == device->work_buffer) { } else if (data == device->work_buffer) {
/* nothing to do; pause like we queued a buffer to play. */ /* nothing to do; pause like we queued a buffer to play. */
SDL_Delay(delay); SDL_Delay(delay);
} else { /* writing directly to the device. */ } else { /* writing directly to the device. */
@ -640,8 +640,8 @@ SDL_CaptureAudio(void *devicep)
SDL_AudioDevice *device = (SDL_AudioDevice *) devicep; SDL_AudioDevice *device = (SDL_AudioDevice *) devicep;
const int silence = (int) device->spec.silence; const int silence = (int) device->spec.silence;
const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq); const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq);
const int stream_len = device->spec.size; const int data_len = device->spec.size;
Uint8 *stream; Uint8 *data;
void *udata = device->spec.userdata; void *udata = device->spec.userdata;
SDL_AudioCallback callback = device->spec.callback; SDL_AudioCallback callback = device->spec.callback;
@ -669,13 +669,13 @@ SDL_CaptureAudio(void *devicep)
} }
/* Fill the current buffer with sound */ /* Fill the current buffer with sound */
still_need = stream_len; still_need = data_len;
/* Use the work_buffer to hold data read from the device. */ /* Use the work_buffer to hold data read from the device. */
stream = device->work_buffer; data = device->work_buffer;
SDL_assert(stream != NULL); SDL_assert(data != NULL);
ptr = stream; ptr = data;
/* We still read from the device when "paused" to keep the state sane, /* We still read from the device when "paused" to keep the state sane,
and block when there isn't data so this thread isn't eating CPU. and block when there isn't data so this thread isn't eating CPU.
@ -700,7 +700,7 @@ SDL_CaptureAudio(void *devicep)
if (device->stream) { if (device->stream) {
/* if this fails...oh well. */ /* if this fails...oh well. */
SDL_AudioStreamPut(device->stream, stream, stream_len); SDL_AudioStreamPut(device->stream, data, data_len);
while (SDL_AudioStreamAvailable(device->stream) >= ((int) device->callbackspec.size)) { while (SDL_AudioStreamAvailable(device->stream) >= ((int) device->callbackspec.size)) {
const int got = SDL_AudioStreamGet(device->stream, device->work_buffer, device->callbackspec.size); const int got = SDL_AudioStreamGet(device->stream, device->work_buffer, device->callbackspec.size);
@ -720,7 +720,7 @@ SDL_CaptureAudio(void *devicep)
/* !!! FIXME: this should be LockDevice. */ /* !!! FIXME: this should be LockDevice. */
SDL_LockMutex(device->mixer_lock); SDL_LockMutex(device->mixer_lock);
if (!SDL_AtomicGet(&device->paused)) { if (!SDL_AtomicGet(&device->paused)) {
callback(udata, stream, device->callbackspec.size); callback(udata, data, device->callbackspec.size);
} }
SDL_UnlockMutex(device->mixer_lock); SDL_UnlockMutex(device->mixer_lock);
} }