1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Michael Sevakis 2006-11-22 09:13:14 +00:00
parent ee61057cea
commit fbac4f8444
4 changed files with 30 additions and 17 deletions

View file

@ -396,8 +396,18 @@ unsigned char *audio_get_buffer(bool talk_buf, size_t *buffer_size)
logf("get buffer: talk_buf"); logf("get buffer: talk_buf");
/* ok to use everything from audiobuf to audiobufend */ /* ok to use everything from audiobuf to audiobufend */
if (buffer_state != BUFFER_STATE_TRASHED) if (buffer_state != BUFFER_STATE_TRASHED)
{
talk_buffer_steal(); 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 else
{ {
@ -423,6 +433,10 @@ void audio_iram_steal(void)
#ifdef PLAYBACK_VOICE #ifdef PLAYBACK_VOICE
if (NULL != iram_buf[CODEC_IDX_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 */ /* Wait for voice to swap back in if current codec was audio */
while (current_codec != CODEC_IDX_VOICE) while (current_codec != CODEC_IDX_VOICE)
yield(); yield();
@ -455,15 +469,14 @@ unsigned char *audio_get_recording_buffer(size_t *buffer_size)
#ifdef PLAYBACK_VOICE #ifdef PLAYBACK_VOICE
#ifdef IRAM_STEAL #ifdef IRAM_STEAL
end = dram_buf[CODEC_IDX_VOICE] ? end = dram_buf[CODEC_IDX_VOICE];
dram_buf[CODEC_IDX_VOICE] : audiobufend;
#else #else
end = iram_buf[CODEC_IDX_VOICE] ? end = iram_buf[CODEC_IDX_VOICE];
iram_buf[CODEC_IDX_VOICE] : audiobufend;
#endif /* IRAM_STEAL */ #endif /* IRAM_STEAL */
#else if (NULL == end)
end = audiobufend;
#endif /* PLAYBACK_VOICE */ #endif /* PLAYBACK_VOICE */
end = audiobufend;
buffer_state = BUFFER_STATE_TRASHED; buffer_state = BUFFER_STATE_TRASHED;

View file

@ -48,9 +48,9 @@
be shared semi-privately **/ be shared semi-privately **/
/* the registered callback function to ask for more mp3 data */ /* the registered callback function to ask for more mp3 data */
pcm_more_callback_type pcm_callback_for_more = NULL; volatile pcm_more_callback_type pcm_callback_for_more = NULL;
bool pcm_playing = false; volatile bool pcm_playing = false;
bool pcm_paused = false; volatile bool pcm_paused = false;
void pcm_play_dma_start(const void *addr, size_t size); void pcm_play_dma_start(const void *addr, size_t size);
void pcm_play_dma_stop(void); void pcm_play_dma_stop(void);

View file

@ -55,9 +55,9 @@
be shared semi-privately **/ be shared semi-privately **/
/* the registered callback function for when more data is available */ /* the registered callback function for when more data is available */
pcm_more_callback_type pcm_callback_more_ready = NULL; volatile pcm_more_callback_type pcm_callback_more_ready = NULL;
/* DMA transfer in is currently active */ /* DMA transfer in is currently active */
bool pcm_recording = false; volatile bool pcm_recording = false;
/* APIs implemented in the target-specific portion */ /* APIs implemented in the target-specific portion */
void pcm_rec_dma_start(const void *addr, size_t size); void pcm_rec_dma_start(const void *addr, size_t size);

View file

@ -44,13 +44,13 @@
/** Semi-private shared symbols **/ /** Semi-private shared symbols **/
/* the registered callback function to ask for more pcm data */ /* the registered callback function to ask for more pcm data */
extern pcm_more_callback_type pcm_callback_for_more; extern volatile pcm_more_callback_type pcm_callback_for_more;
extern bool pcm_playing; extern volatile bool pcm_playing;
extern bool pcm_paused; extern volatile bool pcm_paused;
/* the registered callback function for when more data is available */ /* the registered callback function for when more data is available */
extern pcm_more_callback_type pcm_callback_more_ready; extern volatile pcm_more_callback_type pcm_callback_more_ready;
extern bool pcm_recording; extern volatile bool pcm_recording;
/* peaks */ /* peaks */
static int play_peak_left, play_peak_right; static int play_peak_left, play_peak_right;