summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-03-04 04:16:53 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-03-04 04:16:53 +0000
commit598629c3bf4bf683812c374af7791f06777873f7 (patch)
tree8525f563adc7656a9a00e793fe14e6a9bb48fdef /apps
parenta61a7fa7aea82a2ead1b0c4ac4b476254589b959 (diff)
downloadrockbox-598629c3bf4bf683812c374af7791f06777873f7.zip
rockbox-598629c3bf4bf683812c374af7791f06777873f7.tar.gz
rockbox-598629c3bf4bf683812c374af7791f06777873f7.tar.bz2
rockbox-598629c3bf4bf683812c374af7791f06777873f7.tar.xz
SWCODEC Recording Codecs: Fix problems with hanging recording screen (chiefly on x5) when no voice file present and source is not FMRadio. Caused by extra audio stops causing encoder to unload prematurely. Fix is to have separate stop flags for each codec type to prevent collisions. Also now safe to plug into USB when recording and encoder will stay loaded and not be stopped by the call to audio_stop_playback. Additional discovery: playback will not be able to restart after a USB plug during recording. Probably an old bug. I recommend in the future that recording have higher priority on system resources than playback and playback be denied access explicitly if recording requires them. Codec API becomes incompatible so do full updates.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12579 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/codecs.c5
-rw-r--r--apps/codecs.h5
-rw-r--r--apps/codecs/aiff_enc.c4
-rw-r--r--apps/codecs/mp3_enc.c4
-rw-r--r--apps/codecs/wav_enc.c4
-rw-r--r--apps/codecs/wavpack_enc.c6
-rw-r--r--apps/playback.c20
7 files changed, 19 insertions, 29 deletions
diff --git a/apps/codecs.c b/apps/codecs.c
index 09fd6e5..0c6ddd0 100644
--- a/apps/codecs.c
+++ b/apps/codecs.c
@@ -215,14 +215,15 @@ struct codec_api ci = {
#endif
#if defined(HAVE_RECORDING) && !defined(SIMULATOR)
- false,
+ false, /* stop_encoder */
+ 0, /* enc_codec_loaded */
enc_get_inputs,
enc_set_parameters,
enc_get_chunk,
enc_finish_chunk,
enc_pcm_buf_near_empty,
enc_get_pcm_data,
- enc_unget_pcm_data
+ enc_unget_pcm_data,
#endif
/* new stuff at the end, sort into place next time
diff --git a/apps/codecs.h b/apps/codecs.h
index 3d7ead1..6710afd 100644
--- a/apps/codecs.h
+++ b/apps/codecs.h
@@ -90,12 +90,12 @@
#define CODEC_ENC_MAGIC 0x52454E43 /* RENC */
/* increase this every time the api struct changes */
-#define CODEC_API_VERSION 14
+#define CODEC_API_VERSION 15
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */
-#define CODEC_MIN_API_VERSION 14
+#define CODEC_MIN_API_VERSION 15
/* codec return codes */
enum codec_status {
@@ -303,6 +303,7 @@ struct codec_api {
#endif
#if defined(HAVE_RECORDING) && !defined(SIMULATOR)
+ volatile bool stop_encoder;
volatile int enc_codec_loaded; /* <0=error, 0=pending, >0=ok */
void (*enc_get_inputs)(struct enc_inputs *inputs);
void (*enc_set_parameters)(struct enc_parameters *params);
diff --git a/apps/codecs/aiff_enc.c b/apps/codecs/aiff_enc.c
index 02d159e..1de25a4 100644
--- a/apps/codecs/aiff_enc.c
+++ b/apps/codecs/aiff_enc.c
@@ -354,7 +354,7 @@ enum codec_status codec_main(void)
#endif
/* main encoding loop */
- while(!ci->stop_codec)
+ while(!ci->stop_encoder)
{
uint32_t *src;
@@ -362,7 +362,7 @@ enum codec_status codec_main(void)
{
struct enc_chunk_hdr *chunk;
- if (ci->stop_codec)
+ if (ci->stop_encoder)
break;
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/apps/codecs/mp3_enc.c b/apps/codecs/mp3_enc.c
index 81ea47e..daa6cfe 100644
--- a/apps/codecs/mp3_enc.c
+++ b/apps/codecs/mp3_enc.c
@@ -2482,7 +2482,7 @@ enum codec_status codec_main(void)
#endif
/* main encoding loop */
- while (!ci->stop_codec)
+ while (!ci->stop_encoder)
{
char *buffer;
@@ -2490,7 +2490,7 @@ enum codec_status codec_main(void)
{
struct enc_chunk_hdr *chunk;
- if (ci->stop_codec)
+ if (ci->stop_encoder)
break;
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/apps/codecs/wav_enc.c b/apps/codecs/wav_enc.c
index 622ff3a..e14b04d 100644
--- a/apps/codecs/wav_enc.c
+++ b/apps/codecs/wav_enc.c
@@ -342,7 +342,7 @@ enum codec_status codec_main(void)
#endif
/* main encoding loop */
- while(!ci->stop_codec)
+ while(!ci->stop_encoder)
{
uint32_t *src;
@@ -350,7 +350,7 @@ enum codec_status codec_main(void)
{
struct enc_chunk_hdr *chunk;
- if (ci->stop_codec)
+ if (ci->stop_encoder)
break;
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
diff --git a/apps/codecs/wavpack_enc.c b/apps/codecs/wavpack_enc.c
index 547d309..de8fe80 100644
--- a/apps/codecs/wavpack_enc.c
+++ b/apps/codecs/wavpack_enc.c
@@ -408,7 +408,7 @@ enum codec_status codec_main(void)
#endif
/* main encoding loop */
- while(!ci->stop_codec)
+ while(!ci->stop_encoder)
{
uint8_t *src;
@@ -419,7 +419,7 @@ enum codec_status codec_main(void)
uint8_t *dst;
uint8_t *src_end;
- if(ci->stop_codec)
+ if(ci->stop_encoder)
break;
abort_chunk = true;
@@ -455,7 +455,7 @@ enum codec_status codec_main(void)
chunk->num_pcm += PCM_SAMP_PER_CHUNK/4;
ci->yield();
/* could've been stopped in some way */
- abort_chunk = ci->stop_codec ||
+ abort_chunk = ci->stop_encoder ||
(chunk->flags & CHUNKF_ABORT);
}
diff --git a/apps/playback.c b/apps/playback.c
index d09d672..1b7aa68 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -138,10 +138,6 @@ enum {
#if MEM > 8
Q_AUDIO_FILL_BUFFER_IF_ACTIVE_ATA,
#endif
-#ifdef AUDIO_HAVE_RECORDING
- Q_AUDIO_LOAD_ENCODER,
-#endif
-
#if 0
Q_CODEC_REQUEST_PENDING,
#endif
@@ -525,8 +521,8 @@ bool audio_load_encoder(int afmt)
audio_remove_encoder();
ci.enc_codec_loaded = 0; /* clear any previous error condition */
- LOGFQUEUE("audio > Q_AUDIO_LOAD_ENCODER");
- queue_post(&audio_queue, Q_AUDIO_LOAD_ENCODER, (intptr_t)enc_fn);
+ LOGFQUEUE("codec > Q_ENCODER_LOAD_DISK");
+ queue_post(&codec_queue, Q_ENCODER_LOAD_DISK, (intptr_t)enc_fn);
while (ci.enc_codec_loaded == 0)
yield();
@@ -547,7 +543,7 @@ void audio_remove_encoder(void)
if (ci.enc_codec_loaded <= 0)
return;
- ci.stop_codec = true;
+ ci.stop_encoder = true;
while (ci.enc_codec_loaded > 0)
yield();
#endif
@@ -2003,7 +1999,7 @@ static void codec_thread(void)
#endif
logf("loading encoder");
set_current_codec(CODEC_IDX_AUDIO);
- ci.stop_codec = false;
+ ci.stop_encoder = false;
status = codec_load_file((const char *)ev.data, &ci);
#ifdef PLAYBACK_VOICE
mutex_unlock(&mutex_codecthread);
@@ -3691,14 +3687,6 @@ static void audio_thread(void)
playlist_update_resume_info(audio_current_track());
break ;
-#ifdef AUDIO_HAVE_RECORDING
- case Q_AUDIO_LOAD_ENCODER:
- LOGFQUEUE("audio < Q_AUDIO_LOAD_ENCODER");
- LOGFQUEUE("audio > codec Q_ENCODER_LOAD_DISK");
- queue_post(&codec_queue, Q_ENCODER_LOAD_DISK, ev.data);
- break;
-#endif
-
#ifndef SIMULATOR
case SYS_USB_CONNECTED:
LOGFQUEUE("audio < SYS_USB_CONNECTED");