mirror of
https://github.com/Ryujinx/SDL.git
synced 2024-12-23 18:55:32 +00:00
naclaudio: Untested attempt to migrate to SDL_AudioStream.
This commit is contained in:
parent
115d0ce71c
commit
99fc1ef994
|
@ -45,27 +45,44 @@
|
||||||
static void nacl_audio_callback(void* samples, uint32_t buffer_size, PP_TimeDelta latency, void* data);
|
static void nacl_audio_callback(void* samples, uint32_t buffer_size, PP_TimeDelta latency, void* data);
|
||||||
|
|
||||||
/* FIXME: Make use of latency if needed */
|
/* FIXME: Make use of latency if needed */
|
||||||
static void nacl_audio_callback(void* samples, uint32_t buffer_size, PP_TimeDelta latency, void* data) {
|
static void nacl_audio_callback(void* stream, uint32_t buffer_size, PP_TimeDelta latency, void* data) {
|
||||||
|
const int len = (int) buffer_size;
|
||||||
SDL_AudioDevice* _this = (SDL_AudioDevice*) data;
|
SDL_AudioDevice* _this = (SDL_AudioDevice*) data;
|
||||||
|
SDL_AudioCallback callback = _this->spec.callback;
|
||||||
|
|
||||||
SDL_LockMutex(private->mutex); /* !!! FIXME: is this mutex necessary? */
|
SDL_LockMutex(private->mutex); /* !!! FIXME: is this mutex necessary? */
|
||||||
|
|
||||||
if (SDL_AtomicGet(&_this->enabled) && !SDL_AtomicGet(&_this->paused)) {
|
/* Only do something if audio is enabled */
|
||||||
if (_this->convert.needed) {
|
if (!SDL_AtomicGet(&_this->enabled) || SDL_AtomicGet(&_this->paused)) {
|
||||||
SDL_LockMutex(_this->mixer_lock);
|
if (_this->stream) {
|
||||||
(*_this->spec.callback) (_this->spec.userdata,
|
SDL_AudioStreamClear(_this->stream);
|
||||||
(Uint8 *) _this->convert.buf,
|
}
|
||||||
_this->convert.len);
|
SDL_memset(stream, _this->spec.silence, len);
|
||||||
SDL_UnlockMutex(_this->mixer_lock);
|
return;
|
||||||
SDL_ConvertAudio(&_this->convert);
|
}
|
||||||
SDL_memcpy(samples, _this->convert.buf, _this->convert.len_cvt);
|
|
||||||
} else {
|
SDL_assert(_this->spec.size == len);
|
||||||
SDL_LockMutex(_this->mixer_lock);
|
|
||||||
(*_this->spec.callback) (_this->spec.userdata, (Uint8 *) samples, buffer_size);
|
if (_this->stream == NULL) { /* no conversion necessary. */
|
||||||
SDL_UnlockMutex(_this->mixer_lock);
|
SDL_LockMutex(_this->mixer_lock);
|
||||||
|
callback(_this->spec.userdata, stream, len);
|
||||||
|
SDL_UnlockMutex(_this->mixer_lock);
|
||||||
|
} else { /* streaming/converting */
|
||||||
|
const int stream_len = _this->callbackspec.size;
|
||||||
|
while (SDL_AudioStreamAvailable(_this->stream) < len) {
|
||||||
|
callback(_this->spec.userdata, _this->fake_stream, stream_len);
|
||||||
|
if (SDL_AudioStreamPut(_this->stream, _this->fake_stream, stream_len) == -1) {
|
||||||
|
SDL_AudioStreamClear(_this->stream);
|
||||||
|
SDL_AtomicSet(&_this->enabled, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const int got = SDL_AudioStreamGet(_this->stream, len, stream, len);
|
||||||
|
SDL_assert((got < 0) || (got == len));
|
||||||
|
if (got != len) {
|
||||||
|
SDL_memset(stream, _this->spec.silence, len);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
SDL_memset(samples, _this->spec.silence, buffer_size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_UnlockMutex(private->mutex);
|
SDL_UnlockMutex(private->mutex);
|
||||||
|
|
Loading…
Reference in a new issue