diff options
author | Franklin Wei <franklin@rockbox.org> | 2020-08-08 00:43:05 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2023-05-17 13:23:14 -0400 |
commit | 4554b908590e0f033ab76383516f921f92758435 (patch) | |
tree | 3e61dd71b5f34875f9d6968b0706867b068fb2b5 | |
parent | e232f69214cfe0ad83e8a6051c58ef54754e59bb (diff) | |
download | rockbox-4554b90859.tar.gz rockbox-4554b90859.zip |
sdl: fix two bugs in ROCKBOXAUD_PlayAudio()
First was an off-by-one bug in the loop over buffers. The condition was
`i < this->hidden->n_buffers', but should have been <=, not <. This wasn't
a critical issue, because the last iteration would check the currently
playing buffer - an unlikely situation.
The second logic bug would make the code always think it had found an empty
buffer, even when it had not, since `idx' was being unconditionally set
every loop, rendering it unusable for a sentinel value. Fix that.
Change-Id: I137330965d699acf827e59b6aa5c5f9ddf2ca617
-rw-r--r-- | apps/plugins/sdl/src/audio/rockbox/SDL_rockboxaudio.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/apps/plugins/sdl/src/audio/rockbox/SDL_rockboxaudio.c b/apps/plugins/sdl/src/audio/rockbox/SDL_rockboxaudio.c index cb72687d48..ac268b4a19 100644 --- a/apps/plugins/sdl/src/audio/rockbox/SDL_rockboxaudio.c +++ b/apps/plugins/sdl/src/audio/rockbox/SDL_rockboxaudio.c @@ -132,38 +132,42 @@ static void ROCKBOXAUD_WaitAudio(_THIS) } /* when this is called, SDL wants us to play the samples in mixbuf */ -static void ROCKBOXAUD_PlayAudio(_THIS) +static void +ROCKBOXAUD_PlayAudio(_THIS) { /* There are two cases in which we should be called: * - There is an empty buffer (marked with status = 0) * - There are more than two buffers marked as playing, meaning at least one is stale. */ - int idx = -1; /* Find the next empty or stale buffer and fill. */ - for(int i = 1; i < this->hidden->n_buffers; ++i) + for(int i = 1; i <= this->hidden->n_buffers; ++i) { - idx = (this->hidden->current_playing + i) % this->hidden->n_buffers; + int idx = (this->hidden->current_playing + i) % this->hidden->n_buffers; /* Empty or stale. */ if(this->hidden->status[idx] == 0 || - this->hidden->status[idx] == 2) - break; - } - if(idx < 0) - return; + this->hidden->status[idx] == 2) { + + LOGF("found empty buffer: %d (status: %d)", idx, this->hidden->status[idx]); + + /* probably premature optimization here */ + char *dst = (char*)this->hidden->rb_buf[idx], *src = this->hidden->mixbuf; + int size = this->spec.size / 2; + memcpy(dst, src, size); - /* probably premature optimization here */ - char *dst = (char*)this->hidden->rb_buf[idx], *src = this->hidden->mixbuf; - int size = this->hidden->mixlen / 2; - memcpy(dst, src, size); + this->hidden->status[idx] = 1; + rb->yield(); - this->hidden->status[idx] = 1; - rb->yield(); + memcpy(dst + size, src + size, this->spec.size - size); - memcpy(dst + size, src + size, this->hidden->mixlen - size); + LOGF("filled buffer %d (status %d %d %d %d)", idx, this->hidden->status[0], this->hidden->status[1], this->hidden->status[2], this->hidden->status[3]); + + return; + } + } - //LOGF("filled buffer %d (status %d %d %d)", idx, this->hidden->status[0], this->hidden->status[1], this->hidden->status[2]); + LOGF("WARNING: PlayDevice could not find buffer to fill; DROPPING SAMPLES!"); } static SDL_AudioDevice *ROCKBOXAUD_CreateDevice(int devindex) |