summaryrefslogtreecommitdiff
path: root/apps/recorder/pcm_record.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/recorder/pcm_record.c')
-rw-r--r--apps/recorder/pcm_record.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/apps/recorder/pcm_record.c b/apps/recorder/pcm_record.c
index 90a6163b8f..d904be9a4e 100644
--- a/apps/recorder/pcm_record.c
+++ b/apps/recorder/pcm_record.c
@@ -257,20 +257,9 @@ enum
257/*******************************************************************/ 257/*******************************************************************/
258 258
259/* Callback for when more data is ready - called in interrupt context */ 259/* Callback for when more data is ready - called in interrupt context */
260static void pcm_rec_have_more(int status, void **start, size_t *size) 260static void pcm_rec_have_more(void **start, size_t *size)
261{ 261{
262 if (status < 0) 262 if (!dma_lock)
263 {
264 /* some error condition */
265 if (status == DMA_REC_ERROR_DMA)
266 {
267 /* Flush recorded data to disk and stop recording */
268 queue_post(&pcmrec_queue, PCMREC_STOP, 0);
269 return;
270 }
271 /* else try again next transmission - frame is invalid */
272 }
273 else if (!dma_lock)
274 { 263 {
275 /* advance write position */ 264 /* advance write position */
276 int next_pos = (dma_wr_pos + PCM_CHUNK_SIZE) & PCM_CHUNK_MASK; 265 int next_pos = (dma_wr_pos + PCM_CHUNK_SIZE) & PCM_CHUNK_MASK;
@@ -287,6 +276,23 @@ static void pcm_rec_have_more(int status, void **start, size_t *size)
287 *size = PCM_CHUNK_SIZE; 276 *size = PCM_CHUNK_SIZE;
288} /* pcm_rec_have_more */ 277} /* pcm_rec_have_more */
289 278
279static enum pcm_dma_status pcm_rec_status_callback(enum pcm_dma_status status)
280{
281 if (status < PCM_DMAST_OK)
282 {
283 /* some error condition */
284 if (status == PCM_DMAST_ERR_DMA)
285 {
286 /* Flush recorded data to disk and stop recording */
287 queue_post(&pcmrec_queue, PCMREC_STOP, 0);
288 return status;
289 }
290 /* else try again next transmission - frame is invalid */
291 }
292
293 return PCM_DMAST_OK;
294} /* pcm_rec_status_callback */
295
290static void reset_hardware(void) 296static void reset_hardware(void)
291{ 297{
292 /* reset pcm to defaults */ 298 /* reset pcm to defaults */
@@ -1239,8 +1245,8 @@ static void pcmrec_set_recording_options(
1239 { 1245 {
1240 /* start DMA transfer */ 1246 /* start DMA transfer */
1241 dma_lock = pre_record_ticks == 0; 1247 dma_lock = pre_record_ticks == 0;
1242 pcm_record_data(pcm_rec_have_more, GET_PCM_CHUNK(dma_wr_pos), 1248 pcm_record_data(pcm_rec_have_more, pcm_rec_status_callback,
1243 PCM_CHUNK_SIZE); 1249 GET_PCM_CHUNK(dma_wr_pos), PCM_CHUNK_SIZE);
1244 } 1250 }
1245 else 1251 else
1246 { 1252 {