forked from len0rd/rockbox
SWCODEC: More recording simplifications and less UI hanging in some cases using queue_send.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11781 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
02aeacbafa
commit
98fa14bfd1
1 changed files with 16 additions and 37 deletions
|
|
@ -62,7 +62,6 @@ volatile bool pcm_recording = false;
|
|||
/** General recording state **/
|
||||
static bool is_recording; /* We are recording */
|
||||
static bool is_paused; /* We have paused */
|
||||
static bool is_stopping; /* We are currently stopping */
|
||||
static unsigned long errors; /* An error has occured */
|
||||
static unsigned long warnings; /* Warning */
|
||||
|
||||
|
|
@ -237,7 +236,6 @@ enum
|
|||
PCMREC_OPTIONS, /* set recording options */
|
||||
PCMREC_START, /* start recording */
|
||||
PCMREC_STOP, /* stop the current recording */
|
||||
PCMREC_FINISH_STOP, /* finish the stopping recording */
|
||||
PCMREC_PAUSE, /* pause the current recording */
|
||||
PCMREC_RESUME, /* resume the current recording */
|
||||
PCMREC_NEW_FILE, /* start new file */
|
||||
|
|
@ -1038,6 +1036,8 @@ static void pcmrec_new_stream(const char *filename, /* next file name */
|
|||
|
||||
if (start)
|
||||
{
|
||||
char buf[MAX_PATH]; /* place to copy in case we're full */
|
||||
|
||||
if (!(flags & CHUNKF_PRERECORD))
|
||||
{
|
||||
/* get stats on data added to start - sort of a prerecord operation */
|
||||
|
|
@ -1070,6 +1070,11 @@ static void pcmrec_new_stream(const char *filename, /* next file name */
|
|||
if (fnq_add_fn == pcmrec_fnq_add_filename && pcmrec_fnq_is_full())
|
||||
{
|
||||
logf("fnq full");
|
||||
/* make a local copy of filename and let sender go as this
|
||||
flush will hang the screen for a bit otherwise */
|
||||
strncpy(buf, filename, MAX_PATH);
|
||||
filename = buf;
|
||||
queue_reply(&pcmrec_queue, NULL);
|
||||
pcmrec_flush(-1);
|
||||
}
|
||||
|
||||
|
|
@ -1115,7 +1120,6 @@ static void pcmrec_init(void)
|
|||
|
||||
is_recording = false;
|
||||
is_paused = false;
|
||||
is_stopping = false;
|
||||
|
||||
buffer = audio_get_recording_buffer(&rec_buffer_size);
|
||||
|
||||
|
|
@ -1183,6 +1187,8 @@ static void pcmrec_set_recording_options(struct audio_recording_options *options
|
|||
/* apply pcm settings to hardware */
|
||||
pcm_apply_settings(true);
|
||||
|
||||
queue_reply(&pcmrec_queue, NULL); /* Release sender */
|
||||
|
||||
if (audio_load_encoder(enc_config.afmt))
|
||||
{
|
||||
/* start DMA transfer */
|
||||
|
|
@ -1195,7 +1201,6 @@ static void pcmrec_set_recording_options(struct audio_recording_options *options
|
|||
logf("set rec opt: enc load failed");
|
||||
errors |= PCMREC_E_LOAD_ENCODER;
|
||||
}
|
||||
|
||||
} /* pcmrec_set_recording_options */
|
||||
|
||||
/* PCMREC_START/PCMREC_NEW_FILE - start recording (not gapless)
|
||||
|
|
@ -1306,33 +1311,12 @@ static void pcmrec_stop(void)
|
|||
if (!is_recording)
|
||||
{
|
||||
logf("not recording");
|
||||
goto not_recording_or_stopping;
|
||||
}
|
||||
else if (is_stopping)
|
||||
{
|
||||
logf("already stopping");
|
||||
goto not_recording_or_stopping;
|
||||
goto not_recording;
|
||||
}
|
||||
|
||||
is_stopping = true;
|
||||
dma_lock = true; /* lock dma write position */
|
||||
queue_post(&pcmrec_queue, PCMREC_FINISH_STOP, NULL);
|
||||
dma_lock = true; /* lock dma write position */
|
||||
queue_reply(&pcmrec_queue, NULL);
|
||||
|
||||
not_recording_or_stopping:
|
||||
logf("pcmrec_stop done");
|
||||
} /* pcmrec_stop */
|
||||
|
||||
/* PCMREC_FINISH_STOP */
|
||||
static void pcmrec_finish_stop(void)
|
||||
{
|
||||
logf("pcmrec_finish_stop");
|
||||
|
||||
if (!is_stopping)
|
||||
{
|
||||
logf("not stopping");
|
||||
goto not_stopping;
|
||||
}
|
||||
|
||||
/* flush all available data first to avoid overflow while waiting
|
||||
for encoding to finish */
|
||||
pcmrec_flush(-1);
|
||||
|
|
@ -1367,12 +1351,11 @@ static void pcmrec_finish_stop(void)
|
|||
|
||||
is_recording = false;
|
||||
is_paused = false;
|
||||
is_stopping = false;
|
||||
dma_lock = pre_record_ticks == 0;
|
||||
|
||||
not_stopping:
|
||||
logf("pcmrec_finish_stop done");
|
||||
} /* pcmrec_finish_stop */
|
||||
not_recording:
|
||||
logf("pcmrec_stop done");
|
||||
} /* pcmrec_stop */
|
||||
|
||||
/* PCMREC_PAUSE */
|
||||
static void pcmrec_pause(void)
|
||||
|
|
@ -1430,7 +1413,7 @@ static void pcmrec_thread(void)
|
|||
|
||||
while(1)
|
||||
{
|
||||
if (is_recording && !is_stopping)
|
||||
if (is_recording)
|
||||
{
|
||||
/* Poll periodically to flush data */
|
||||
queue_wait_w_tmo(&pcmrec_queue, &ev, HZ/5);
|
||||
|
|
@ -1471,10 +1454,6 @@ static void pcmrec_thread(void)
|
|||
pcmrec_stop();
|
||||
break;
|
||||
|
||||
case PCMREC_FINISH_STOP:
|
||||
pcmrec_finish_stop();
|
||||
break;
|
||||
|
||||
case PCMREC_PAUSE:
|
||||
pcmrec_pause();
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue