diff options
-rw-r--r-- | apps/playback.c | 27 | ||||
-rw-r--r-- | firmware/pcm_playback.c | 6 | ||||
-rw-r--r-- | firmware/pcm_record.c | 4 | ||||
-rw-r--r-- | firmware/target/coldfire/pcm-coldfire.c | 10 |
4 files changed, 30 insertions, 17 deletions
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) | |||
396 | logf("get buffer: talk_buf"); | 396 | logf("get buffer: talk_buf"); |
397 | /* ok to use everything from audiobuf to audiobufend */ | 397 | /* ok to use everything from audiobuf to audiobufend */ |
398 | if (buffer_state != BUFFER_STATE_TRASHED) | 398 | if (buffer_state != BUFFER_STATE_TRASHED) |
399 | { | ||
399 | talk_buffer_steal(); | 400 | talk_buffer_steal(); |
400 | buffer_state = BUFFER_STATE_TRASHED; | 401 | #ifdef PLAYBACK_VOICE |
402 | if (NULL != iram_buf[CODEC_IDX_VOICE]) | ||
403 | { | ||
404 | /* Voice could be swapped out - wait for it to return */ | ||
405 | while (current_codec != CODEC_IDX_VOICE) | ||
406 | yield(); | ||
407 | } | ||
408 | #endif /* PLAYBACK_VOICE */ | ||
409 | buffer_state = BUFFER_STATE_TRASHED; | ||
410 | } | ||
401 | } | 411 | } |
402 | else | 412 | else |
403 | { | 413 | { |
@@ -423,6 +433,10 @@ void audio_iram_steal(void) | |||
423 | #ifdef PLAYBACK_VOICE | 433 | #ifdef PLAYBACK_VOICE |
424 | if (NULL != iram_buf[CODEC_IDX_VOICE]) | 434 | if (NULL != iram_buf[CODEC_IDX_VOICE]) |
425 | { | 435 | { |
436 | /* Can't already be stolen */ | ||
437 | if (voice_iram_stolen) | ||
438 | return; | ||
439 | |||
426 | /* Wait for voice to swap back in if current codec was audio */ | 440 | /* Wait for voice to swap back in if current codec was audio */ |
427 | while (current_codec != CODEC_IDX_VOICE) | 441 | while (current_codec != CODEC_IDX_VOICE) |
428 | yield(); | 442 | yield(); |
@@ -455,15 +469,14 @@ unsigned char *audio_get_recording_buffer(size_t *buffer_size) | |||
455 | 469 | ||
456 | #ifdef PLAYBACK_VOICE | 470 | #ifdef PLAYBACK_VOICE |
457 | #ifdef IRAM_STEAL | 471 | #ifdef IRAM_STEAL |
458 | end = dram_buf[CODEC_IDX_VOICE] ? | 472 | end = dram_buf[CODEC_IDX_VOICE]; |
459 | dram_buf[CODEC_IDX_VOICE] : audiobufend; | ||
460 | #else | 473 | #else |
461 | end = iram_buf[CODEC_IDX_VOICE] ? | 474 | end = iram_buf[CODEC_IDX_VOICE]; |
462 | iram_buf[CODEC_IDX_VOICE] : audiobufend; | ||
463 | #endif /* IRAM_STEAL */ | 475 | #endif /* IRAM_STEAL */ |
464 | #else | 476 | if (NULL == end) |
465 | end = audiobufend; | ||
466 | #endif /* PLAYBACK_VOICE */ | 477 | #endif /* PLAYBACK_VOICE */ |
478 | end = audiobufend; | ||
479 | |||
467 | 480 | ||
468 | buffer_state = BUFFER_STATE_TRASHED; | 481 | buffer_state = BUFFER_STATE_TRASHED; |
469 | 482 | ||
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index a2d09e7c8d..8b5479cae9 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c | |||
@@ -48,9 +48,9 @@ | |||
48 | be shared semi-privately **/ | 48 | be shared semi-privately **/ |
49 | 49 | ||
50 | /* the registered callback function to ask for more mp3 data */ | 50 | /* the registered callback function to ask for more mp3 data */ |
51 | pcm_more_callback_type pcm_callback_for_more = NULL; | 51 | volatile pcm_more_callback_type pcm_callback_for_more = NULL; |
52 | bool pcm_playing = false; | 52 | volatile bool pcm_playing = false; |
53 | bool pcm_paused = false; | 53 | volatile bool pcm_paused = false; |
54 | 54 | ||
55 | void pcm_play_dma_start(const void *addr, size_t size); | 55 | void pcm_play_dma_start(const void *addr, size_t size); |
56 | void pcm_play_dma_stop(void); | 56 | void pcm_play_dma_stop(void); |
diff --git a/firmware/pcm_record.c b/firmware/pcm_record.c index 04289f36ec..a1b2afd1bf 100644 --- a/firmware/pcm_record.c +++ b/firmware/pcm_record.c | |||
@@ -55,9 +55,9 @@ | |||
55 | be shared semi-privately **/ | 55 | be shared semi-privately **/ |
56 | 56 | ||
57 | /* the registered callback function for when more data is available */ | 57 | /* the registered callback function for when more data is available */ |
58 | pcm_more_callback_type pcm_callback_more_ready = NULL; | 58 | volatile pcm_more_callback_type pcm_callback_more_ready = NULL; |
59 | /* DMA transfer in is currently active */ | 59 | /* DMA transfer in is currently active */ |
60 | bool pcm_recording = false; | 60 | volatile bool pcm_recording = false; |
61 | 61 | ||
62 | /* APIs implemented in the target-specific portion */ | 62 | /* APIs implemented in the target-specific portion */ |
63 | void pcm_rec_dma_start(const void *addr, size_t size); | 63 | void pcm_rec_dma_start(const void *addr, size_t size); |
diff --git a/firmware/target/coldfire/pcm-coldfire.c b/firmware/target/coldfire/pcm-coldfire.c index 9cd66d772a..a0d3b67f58 100644 --- a/firmware/target/coldfire/pcm-coldfire.c +++ b/firmware/target/coldfire/pcm-coldfire.c | |||
@@ -44,13 +44,13 @@ | |||
44 | /** Semi-private shared symbols **/ | 44 | /** Semi-private shared symbols **/ |
45 | 45 | ||
46 | /* the registered callback function to ask for more pcm data */ | 46 | /* the registered callback function to ask for more pcm data */ |
47 | extern pcm_more_callback_type pcm_callback_for_more; | 47 | extern volatile pcm_more_callback_type pcm_callback_for_more; |
48 | extern bool pcm_playing; | 48 | extern volatile bool pcm_playing; |
49 | extern bool pcm_paused; | 49 | extern volatile bool pcm_paused; |
50 | 50 | ||
51 | /* the registered callback function for when more data is available */ | 51 | /* the registered callback function for when more data is available */ |
52 | extern pcm_more_callback_type pcm_callback_more_ready; | 52 | extern volatile pcm_more_callback_type pcm_callback_more_ready; |
53 | extern bool pcm_recording; | 53 | extern volatile bool pcm_recording; |
54 | 54 | ||
55 | /* peaks */ | 55 | /* peaks */ |
56 | static int play_peak_left, play_peak_right; | 56 | static int play_peak_left, play_peak_right; |