diff options
Diffstat (limited to 'firmware/pcm_record.c')
-rw-r--r-- | firmware/pcm_record.c | 42 |
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 */ |
58 | volatile pcm_more_callback_type pcm_callback_more_ready = NULL; | 58 | volatile pcm_more_callback_type2 pcm_callback_more_ready = NULL; |
59 | /* DMA transfer in is currently active */ | 59 | /* DMA transfer in is currently active */ |
60 | volatile bool pcm_recording = false; | 60 | volatile bool pcm_recording = false; |
61 | |||
62 | /* APIs implemented in the target-specific portion */ | ||
63 | void pcm_rec_dma_start(const void *addr, size_t size); | ||
64 | void pcm_rec_dma_stop(void); | ||
65 | 61 | ||
66 | /** General recording state **/ | 62 | /** General recording state **/ |
67 | static bool is_recording; /* We are recording */ | 63 | static 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 */ |
228 | static void pcm_rec_have_more(unsigned char **data, size_t *size) | 224 | static 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 | */ |
1624 | void pcm_record_data(pcm_more_callback_type more_ready, | 1620 | void 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 | ||
1640 | void pcm_stop_recording(void) | 1630 | void pcm_stop_recording(void) |