summaryrefslogtreecommitdiff
path: root/firmware/pcm_record.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/pcm_record.c')
-rw-r--r--firmware/pcm_record.c42
1 files changed, 16 insertions, 26 deletions
diff --git a/firmware/pcm_record.c b/firmware/pcm_record.c
index 379adc3a9c..a72641baa6 100644
--- a/firmware/pcm_record.c
+++ b/firmware/pcm_record.c
@@ -55,13 +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 */
58volatile pcm_more_callback_type pcm_callback_more_ready = NULL; 58volatile pcm_more_callback_type2 pcm_callback_more_ready = NULL;
59/* DMA transfer in is currently active */ 59/* DMA transfer in is currently active */
60volatile bool pcm_recording = false; 60volatile bool pcm_recording = false;
61
62/* APIs implemented in the target-specific portion */
63void pcm_rec_dma_start(const void *addr, size_t size);
64void pcm_rec_dma_stop(void);
65 61
66/** General recording state **/ 62/** General recording state **/
67static bool is_recording; /* We are recording */ 63static bool is_recording; /* We are recording */
@@ -225,16 +221,16 @@ static void pcm_thread_wait_for_stop(void)
225/*******************************************************************/ 221/*******************************************************************/
226 222
227/* Callback for when more data is ready */ 223/* Callback for when more data is ready */
228static void pcm_rec_have_more(unsigned char **data, size_t *size) 224static int pcm_rec_have_more(int status)
229{ 225{
230 if (*size != 0) 226 if (status < 0)
231 { 227 {
232 /* some error condition */ 228 /* some error condition */
233 if (*size == DMA_REC_ERROR_DMA) 229 if (status == DMA_REC_ERROR_DMA)
234 { 230 {
235 /* Flush recorded data to disk and stop recording */ 231 /* Flush recorded data to disk and stop recording */
236 queue_post(&pcmrec_queue, PCMREC_STOP, NULL); 232 queue_post(&pcmrec_queue, PCMREC_STOP, NULL);
237 return; 233 return -1;
238 } 234 }
239 /* else try again next transmission */ 235 /* else try again next transmission */
240 } 236 }
@@ -243,9 +239,9 @@ static void pcm_rec_have_more(unsigned char **data, size_t *size)
243 /* advance write position */ 239 /* advance write position */
244 dma_wr_pos = (dma_wr_pos + PCM_CHUNK_SIZE) & PCM_CHUNK_MASK; 240 dma_wr_pos = (dma_wr_pos + PCM_CHUNK_SIZE) & PCM_CHUNK_MASK;
245 } 241 }
246 242
247 *data = (unsigned char *)GET_PCM_CHUNK(dma_wr_pos); 243 pcm_record_more(GET_PCM_CHUNK(dma_wr_pos), PCM_CHUNK_SIZE);
248 *size = PCM_CHUNK_SIZE; 244 return 0;
249} /* pcm_rec_have_more */ 245} /* pcm_rec_have_more */
250 246
251/** pcm_rec_* group **/ 247/** pcm_rec_* group **/
@@ -423,9 +419,9 @@ void audio_set_recording_options(struct audio_recording_options *options)
423 if (audio_load_encoder(enc_config.afmt)) 419 if (audio_load_encoder(enc_config.afmt))
424 { 420 {
425 /* start DMA transfer */ 421 /* start DMA transfer */
426 pcm_record_data(pcm_rec_have_more, NULL, 0);
427 /* do unlock after starting to prevent preincrement of dma_wr_pos */
428 dma_lock = pre_record_ticks == 0; 422 dma_lock = pre_record_ticks == 0;
423 pcm_record_data(pcm_rec_have_more, GET_PCM_CHUNK(dma_wr_pos),
424 PCM_CHUNK_SIZE);
429 } 425 }
430 else 426 else
431 { 427 {
@@ -1621,20 +1617,14 @@ size_t enc_unget_pcm_data(size_t size)
1621 * Functions that do not require targeted implementation but only a targeted 1617 * Functions that do not require targeted implementation but only a targeted
1622 * interface 1618 * interface
1623 */ 1619 */
1624void pcm_record_data(pcm_more_callback_type more_ready, 1620void pcm_record_data(pcm_more_callback_type2 more_ready,
1625 unsigned char *start, size_t size) 1621 void *start, size_t size)
1626{ 1622{
1627 pcm_callback_more_ready = more_ready;
1628
1629 if (!(start && size)) 1623 if (!(start && size))
1630 { 1624 return;
1631 size = 0;
1632 if (more_ready)
1633 more_ready(&start, &size);
1634 }
1635 1625
1636 if (start && size) 1626 pcm_callback_more_ready = more_ready;
1637 pcm_rec_dma_start(start, size); 1627 pcm_rec_dma_start(start, size);
1638} /* pcm_record_data */ 1628} /* pcm_record_data */
1639 1629
1640void pcm_stop_recording(void) 1630void pcm_stop_recording(void)