mirror of
https://github.com/Ryujinx/SDL.git
synced 2024-12-23 10:35:38 +00:00
audio: Streams now resample in-place. Removed second allocated buffer.
This commit is contained in:
parent
b5eeab779f
commit
17dcee20c1
|
@ -869,8 +869,6 @@ struct SDL_AudioStream
|
||||||
SDL_DataQueue *queue;
|
SDL_DataQueue *queue;
|
||||||
Uint8 *work_buffer;
|
Uint8 *work_buffer;
|
||||||
int work_buffer_len;
|
int work_buffer_len;
|
||||||
Uint8 *resample_buffer;
|
|
||||||
int resample_buffer_len;
|
|
||||||
int src_sample_frame_size;
|
int src_sample_frame_size;
|
||||||
SDL_AudioFormat src_format;
|
SDL_AudioFormat src_format;
|
||||||
Uint8 src_channels;
|
Uint8 src_channels;
|
||||||
|
@ -1145,6 +1143,7 @@ int
|
||||||
SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, const Uint32 _buflen)
|
SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, const Uint32 _buflen)
|
||||||
{
|
{
|
||||||
int buflen = (int) _buflen;
|
int buflen = (int) _buflen;
|
||||||
|
SDL_bool copied = SDL_FALSE;
|
||||||
|
|
||||||
if (!stream) {
|
if (!stream) {
|
||||||
return SDL_InvalidParamError("stream");
|
return SDL_InvalidParamError("stream");
|
||||||
|
@ -1162,6 +1161,7 @@ SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, const Uint32 _bufle
|
||||||
if (workbuf == NULL) {
|
if (workbuf == NULL) {
|
||||||
return -1; /* probably out of memory. */
|
return -1; /* probably out of memory. */
|
||||||
}
|
}
|
||||||
|
copied = SDL_TRUE;
|
||||||
SDL_memcpy(workbuf, buf, buflen);
|
SDL_memcpy(workbuf, buf, buflen);
|
||||||
stream->cvt_before_resampling.buf = workbuf;
|
stream->cvt_before_resampling.buf = workbuf;
|
||||||
stream->cvt_before_resampling.len = buflen;
|
stream->cvt_before_resampling.len = buflen;
|
||||||
|
@ -1174,31 +1174,28 @@ SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, const Uint32 _bufle
|
||||||
|
|
||||||
if (stream->dst_rate != stream->src_rate) {
|
if (stream->dst_rate != stream->src_rate) {
|
||||||
const int workbuflen = buflen * ((int) SDL_ceil(stream->rate_incr));
|
const int workbuflen = buflen * ((int) SDL_ceil(stream->rate_incr));
|
||||||
void *workbuf = EnsureBufferSize(&stream->resample_buffer, &stream->resample_buffer_len, workbuflen);
|
void *workbuf = EnsureBufferSize(&stream->work_buffer, &stream->work_buffer_len, workbuflen);
|
||||||
if (workbuf == NULL) {
|
if (workbuf == NULL) {
|
||||||
return -1; /* probably out of memory. */
|
return -1; /* probably out of memory. */
|
||||||
}
|
}
|
||||||
buflen = stream->resampler_func(stream, buf, buflen, workbuf, workbuflen);
|
if (!copied) {
|
||||||
|
SDL_memcpy(workbuf, buf, buflen);
|
||||||
|
copied = SDL_TRUE;
|
||||||
|
}
|
||||||
|
buflen = stream->resampler_func(stream, workbuf, buflen, workbuf, workbuflen);
|
||||||
buf = workbuf;
|
buf = workbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stream->cvt_after_resampling.needed) {
|
if (stream->cvt_after_resampling.needed) {
|
||||||
const int workbuflen = buflen * stream->cvt_after_resampling.len_mult; /* will be "* 1" if not needed */
|
const int workbuflen = buflen * stream->cvt_after_resampling.len_mult; /* will be "* 1" if not needed */
|
||||||
Uint8 *workbuf;
|
Uint8 *workbuf = EnsureBufferSize(&stream->work_buffer, &stream->work_buffer_len, workbuflen);
|
||||||
|
|
||||||
if (buf == stream->resample_buffer) {
|
|
||||||
workbuf = EnsureBufferSize(&stream->resample_buffer, &stream->resample_buffer_len, workbuflen);
|
|
||||||
} else {
|
|
||||||
const int inplace = (buf == stream->work_buffer);
|
|
||||||
workbuf = EnsureBufferSize(&stream->work_buffer, &stream->work_buffer_len, workbuflen);
|
|
||||||
if (workbuf && !inplace) {
|
|
||||||
SDL_memcpy(workbuf, buf, buflen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (workbuf == NULL) {
|
if (workbuf == NULL) {
|
||||||
return -1; /* probably out of memory. */
|
return -1; /* probably out of memory. */
|
||||||
}
|
}
|
||||||
|
if (!copied) {
|
||||||
|
SDL_memcpy(workbuf, buf, buflen);
|
||||||
|
copied = SDL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
stream->cvt_after_resampling.buf = workbuf;
|
stream->cvt_after_resampling.buf = workbuf;
|
||||||
stream->cvt_after_resampling.len = buflen;
|
stream->cvt_after_resampling.len = buflen;
|
||||||
|
@ -1260,7 +1257,6 @@ SDL_FreeAudioStream(SDL_AudioStream *stream)
|
||||||
}
|
}
|
||||||
SDL_FreeDataQueue(stream->queue);
|
SDL_FreeDataQueue(stream->queue);
|
||||||
SDL_free(stream->work_buffer);
|
SDL_free(stream->work_buffer);
|
||||||
SDL_free(stream->resample_buffer);
|
|
||||||
SDL_free(stream);
|
SDL_free(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue