diff options
| author | Michael Sevakis <jethead71@rockbox.org> | 2006-11-22 09:13:14 +0000 |
|---|---|---|
| committer | Michael Sevakis <jethead71@rockbox.org> | 2006-11-22 09:13:14 +0000 |
| commit | fbac4f84442b0e2a5cc9c0845ccabf0af554e82a (patch) | |
| tree | 814084269382cf56b738830819af3995a3fdd920 /apps | |
| parent | ee61057ceabd8b2b69a5e733d27caae2adece6cf (diff) | |
| download | rockbox-fbac4f84442b0e2a5cc9c0845ccabf0af554e82a.zip rockbox-fbac4f84442b0e2a5cc9c0845ccabf0af554e82a.tar.gz rockbox-fbac4f84442b0e2a5cc9c0845ccabf0af554e82a.tar.bz2 rockbox-fbac4f84442b0e2a5cc9c0845ccabf0af554e82a.tar.xz | |
Audio bugfixes. Should wait for voice codec to reload before returning buffer when stealing voice. Certain variables that get or may get used during an IRQ should be declared 'volatile'.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11572 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/playback.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/apps/playback.c b/apps/playback.c index 9d03cd2..2b08a99 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -396,8 +396,18 @@ unsigned char *audio_get_buffer(bool talk_buf, size_t *buffer_size) logf("get buffer: talk_buf"); /* ok to use everything from audiobuf to audiobufend */ if (buffer_state != BUFFER_STATE_TRASHED) + { talk_buffer_steal(); - buffer_state = BUFFER_STATE_TRASHED; +#ifdef PLAYBACK_VOICE + if (NULL != iram_buf[CODEC_IDX_VOICE]) + { + /* Voice could be swapped out - wait for it to return */ + while (current_codec != CODEC_IDX_VOICE) + yield(); + } +#endif /* PLAYBACK_VOICE */ + buffer_state = BUFFER_STATE_TRASHED; + } } else { @@ -423,6 +433,10 @@ void audio_iram_steal(void) #ifdef PLAYBACK_VOICE if (NULL != iram_buf[CODEC_IDX_VOICE]) { + /* Can't already be stolen */ + if (voice_iram_stolen) + return; + /* Wait for voice to swap back in if current codec was audio */ while (current_codec != CODEC_IDX_VOICE) yield(); @@ -455,15 +469,14 @@ unsigned char *audio_get_recording_buffer(size_t *buffer_size) #ifdef PLAYBACK_VOICE #ifdef IRAM_STEAL - end = dram_buf[CODEC_IDX_VOICE] ? - dram_buf[CODEC_IDX_VOICE] : audiobufend; + end = dram_buf[CODEC_IDX_VOICE]; #else - end = iram_buf[CODEC_IDX_VOICE] ? - iram_buf[CODEC_IDX_VOICE] : audiobufend; + end = iram_buf[CODEC_IDX_VOICE]; #endif /* IRAM_STEAL */ -#else - end = audiobufend; + if (NULL == end) #endif /* PLAYBACK_VOICE */ + end = audiobufend; + buffer_state = BUFFER_STATE_TRASHED; |