summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/playback.c27
-rw-r--r--firmware/pcm_playback.c6
-rw-r--r--firmware/pcm_record.c4
-rw-r--r--firmware/target/coldfire/pcm-coldfire.c10
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 */
51pcm_more_callback_type pcm_callback_for_more = NULL; 51volatile pcm_more_callback_type pcm_callback_for_more = NULL;
52bool pcm_playing = false; 52volatile bool pcm_playing = false;
53bool pcm_paused = false; 53volatile bool pcm_paused = false;
54 54
55void pcm_play_dma_start(const void *addr, size_t size); 55void pcm_play_dma_start(const void *addr, size_t size);
56void pcm_play_dma_stop(void); 56void 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 */
58pcm_more_callback_type pcm_callback_more_ready = NULL; 58volatile pcm_more_callback_type pcm_callback_more_ready = NULL;
59/* DMA transfer in is currently active */ 59/* DMA transfer in is currently active */
60bool pcm_recording = false; 60volatile bool pcm_recording = false;
61 61
62/* APIs implemented in the target-specific portion */ 62/* APIs implemented in the target-specific portion */
63void pcm_rec_dma_start(const void *addr, size_t size); 63void 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 */
47extern pcm_more_callback_type pcm_callback_for_more; 47extern volatile pcm_more_callback_type pcm_callback_for_more;
48extern bool pcm_playing; 48extern volatile bool pcm_playing;
49extern bool pcm_paused; 49extern 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 */
52extern pcm_more_callback_type pcm_callback_more_ready; 52extern volatile pcm_more_callback_type pcm_callback_more_ready;
53extern bool pcm_recording; 53extern volatile bool pcm_recording;
54 54
55/* peaks */ 55/* peaks */
56static int play_peak_left, play_peak_right; 56static int play_peak_left, play_peak_right;