summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2006-11-22 09:13:14 +0000
committerMichael Sevakis <jethead71@rockbox.org>2006-11-22 09:13:14 +0000
commitfbac4f84442b0e2a5cc9c0845ccabf0af554e82a (patch)
tree814084269382cf56b738830819af3995a3fdd920 /apps
parentee61057ceabd8b2b69a5e733d27caae2adece6cf (diff)
downloadrockbox-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.c27
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;