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 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;
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index a2d09e7..8b5479c 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -48,9 +48,9 @@
be shared semi-privately **/
/* the registered callback function to ask for more mp3 data */
-pcm_more_callback_type pcm_callback_for_more = NULL;
-bool pcm_playing = false;
-bool pcm_paused = false;
+volatile pcm_more_callback_type pcm_callback_for_more = NULL;
+volatile bool pcm_playing = false;
+volatile bool pcm_paused = false;
void pcm_play_dma_start(const void *addr, size_t size);
void pcm_play_dma_stop(void);
diff --git a/firmware/pcm_record.c b/firmware/pcm_record.c
index 04289f3..a1b2afd 100644
--- a/firmware/pcm_record.c
+++ b/firmware/pcm_record.c
@@ -55,9 +55,9 @@
be shared semi-privately **/
/* 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 */
-bool pcm_recording = false;
+volatile bool pcm_recording = false;
/* APIs implemented in the target-specific portion */
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 9cd66d7..a0d3b67 100644
--- a/firmware/target/coldfire/pcm-coldfire.c
+++ b/firmware/target/coldfire/pcm-coldfire.c
@@ -44,13 +44,13 @@
/** Semi-private shared symbols **/
/* the registered callback function to ask for more pcm data */
-extern pcm_more_callback_type pcm_callback_for_more;
-extern bool pcm_playing;
-extern bool pcm_paused;
+extern volatile pcm_more_callback_type pcm_callback_for_more;
+extern volatile bool pcm_playing;
+extern volatile bool pcm_paused;
/* the registered callback function for when more data is available */
-extern pcm_more_callback_type pcm_callback_more_ready;
-extern bool pcm_recording;
+extern volatile pcm_more_callback_type pcm_callback_more_ready;
+extern volatile bool pcm_recording;
/* peaks */
static int play_peak_left, play_peak_right;