From fbac4f84442b0e2a5cc9c0845ccabf0af554e82a Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Wed, 22 Nov 2006 09:13:14 +0000 Subject: 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 --- apps/playback.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'apps/playback.c') diff --git a/apps/playback.c b/apps/playback.c index 9d03cd266c..2b08a99a8a 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; -- cgit v1.2.3