summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/misc.h6
-rw-r--r--apps/plugin.c24
-rw-r--r--apps/plugin.h40
-rw-r--r--apps/recorder/recording.c127
4 files changed, 110 insertions, 87 deletions
diff --git a/apps/misc.h b/apps/misc.h
index b0adb92..25937fa 100644
--- a/apps/misc.h
+++ b/apps/misc.h
@@ -38,9 +38,9 @@ char *output_dyn_value(char *buf, int buf_size, int value,
* less than zero to number automatically. The final number used will also
* be returned in *num. If *num is >= 0 then *num will be incremented by
* one. */
-#if CONFIG_CODEC == SWCODEC && defined(HAVE_RECORDING) && (CONFIG_RTC == 0)
-/* this feature is needed by SWCODEC recording without a RTC to prevent
- disk access when changing files */
+#if defined(HAVE_RECORDING) && (CONFIG_RTC == 0)
+/* this feature is needed by recording without a RTC to prevent disk access
+ when changing files */
#define IF_CNFN_NUM_(...) __VA_ARGS__
#define IF_CNFN_NUM
#else
diff --git a/apps/plugin.c b/apps/plugin.c
index ca0b8a2..e81ae25 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -104,6 +104,7 @@ static const struct plugin_api rockbox_api = {
lcd_get_background,
lcd_bitmap_part,
lcd_bitmap,
+ lcd_get_backdrop,
lcd_set_backdrop,
#endif
#if LCD_DEPTH == 16
@@ -217,6 +218,7 @@ static const struct plugin_api rockbox_api = {
#endif
ata_spindown,
reload_directory,
+ create_numbered_filename,
/* dir */
PREFIX(opendir),
@@ -241,6 +243,7 @@ static const struct plugin_api rockbox_api = {
&current_tick,
default_event_handler,
default_event_handler_ex,
+ threads,
create_thread,
remove_thread,
reset_poweroff_timer,
@@ -403,8 +406,12 @@ static const struct plugin_api rockbox_api = {
gui_syncstatusbar_draw,
/* options */
set_option,
+ set_bool_options,
set_int,
set_bool,
+#ifdef HAVE_LCD_COLOR
+ set_color,
+#endif
/* action handling */
get_custom_action,
@@ -470,12 +477,6 @@ static const struct plugin_api rockbox_api = {
wheel_status,
wheel_send_events,
#endif
-#if LCD_DEPTH > 1
- lcd_get_backdrop,
-#endif
-
- /* new stuff at the end, sort into place next time
- the API gets incompatible */
#ifdef IRIVER_H100_SERIES
/* Routines for the iriver_flash -plugin. */
@@ -483,7 +484,8 @@ static const struct plugin_api rockbox_api = {
detect_flashed_ramimage,
detect_flashed_romimage,
#endif
-
+ /* new stuff at the end, sort into place next time
+ the API gets incompatible */
#if NUM_CORES > 1
spinlock_init,
spinlock_lock,
@@ -492,14 +494,8 @@ static const struct plugin_api rockbox_api = {
#if (CONFIG_CODEC == SWCODEC)
codec_load_file,
- get_metadata,
get_codec_filename,
-#endif
- threads,
- create_numbered_filename,
- set_bool_options,
-#ifdef HAVE_LCD_COLOR
- set_color,
+ get_metadata,
#endif
};
diff --git a/apps/plugin.h b/apps/plugin.h
index 29e7f5d..a95d80b 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -115,12 +115,12 @@
#define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */
-#define PLUGIN_API_VERSION 59
+#define PLUGIN_API_VERSION 60
/* 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 PLUGIN_MIN_API_VERSION 58
+#define PLUGIN_MIN_API_VERSION 60
/* plugin return codes */
enum plugin_status {
@@ -179,6 +179,7 @@ struct plugin_api {
int stride, int x, int y, int width, int height);
void (*lcd_bitmap)(const fb_data *src, int x, int y, int width,
int height);
+ fb_data* (*lcd_get_backdrop)(void);
void (*lcd_set_backdrop)(fb_data* backdrop);
#endif
#if LCD_DEPTH == 16
@@ -310,6 +311,9 @@ struct plugin_api {
#endif
void (*ata_spindown)(int seconds);
void (*reload_directory)(void);
+ char *(*create_numbered_filename)(char *buffer, const char *path,
+ const char *prefix, const char *suffix,
+ int numberlen IF_CNFN_NUM_(, int *num));
/* dir */
DIR* (*PREFIX(opendir))(const char* name);
@@ -333,6 +337,7 @@ struct plugin_api {
long* current_tick;
long (*default_event_handler)(long event);
long (*default_event_handler_ex)(long event, void (*callback)(void *), void *parameter);
+ struct thread_entry* threads;
struct thread_entry* (*create_thread)(void (*function)(void), void* stack,
int stack_size, const char *name
IF_PRIO(, int priority)
@@ -507,11 +512,19 @@ struct plugin_api {
bool (*set_option)(const char* string, void* variable,
enum optiontype type, const struct opt_items* options,
int numoptions, void (*function)(int));
+ bool (*set_bool_options)(const char* string, bool* variable,
+ const char* yes_str, int yes_voice,
+ const char* no_str, int no_voice,
+ void (*function)(bool));
bool (*set_int)(const unsigned char* string, const char* unit, int voice_unit,
int* variable, void (*function)(int), int step, int min,
int max, void (*formatter)(char*, int, int, const char*) );
bool (*set_bool)(const char* string, bool* variable );
+#ifdef HAVE_LCD_COLOR
+ bool (*set_color)(struct screen *display, char *title, unsigned *color,
+ unsigned banned_color);
+#endif
/* action handling */
int (*get_custom_action)(int context,int timeout,
const struct button_mapping* (*get_context_map)(int));
@@ -587,11 +600,6 @@ struct plugin_api {
int (*wheel_status)(void);
void (*wheel_send_events)(bool send);
#endif
-#if LCD_DEPTH > 1
- fb_data* (*lcd_get_backdrop)(void);
-#endif
- /* new stuff at the end, sort into place next time
- the API gets incompatible */
#ifdef IRIVER_H100_SERIES
/* Routines for the iriver_flash -plugin. */
@@ -599,6 +607,8 @@ struct plugin_api {
bool (*detect_flashed_ramimage)(void);
bool (*detect_flashed_romimage)(void);
#endif
+ /* new stuff at the end, sort into place next time
+ the API gets incompatible */
#if NUM_CORES > 1
void (*spinlock_init)(struct mutex *m);
@@ -608,23 +618,9 @@ struct plugin_api {
#if (CONFIG_CODEC == SWCODEC)
int (*codec_load_file)(const char* codec, struct codec_api *api);
+ const char *(*get_codec_filename)(int cod_spec);
bool (*get_metadata)(struct track_info* track, int fd, const char* trackname,
bool v1first);
- const char *(*get_codec_filename)(int cod_spec);
-#endif
- struct thread_entry* threads;
-
- char *(*create_numbered_filename)(char *buffer, const char *path,
- const char *prefix, const char *suffix,
- int numberlen IF_CNFN_NUM_(, int *num));
-
- bool (*set_bool_options)(const char* string, bool* variable,
- const char* yes_str, int yes_voice,
- const char* no_str, int no_voice,
- void (*function)(bool));
-#ifdef HAVE_LCD_COLOR
- bool (*set_color)(struct screen *display, char *title, unsigned *color,
- unsigned banned_color);
#endif
};
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index f7ceb50..17ed105 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -70,11 +70,20 @@
#include "radio.h"
#ifdef HAVE_RECORDING
-static bool in_screen = false;
-
+/* recording screen status flags */
+enum rec_status_flags
+{
+ RCSTAT_IN_RECSCREEN = 0x00000001,
+ RCSTAT_BEEN_IN_USB_MODE = 0x00000002,
+ RCSTAT_CREATED_DIRECTORY = 0x00000004,
+ RCSTAT_HAVE_RECORDED = 0x00000008,
+};
+
+static int rec_status = 0;
+
bool in_recording_screen(void)
{
- return in_screen;
+ return (rec_status & RCSTAT_IN_RECSCREEN) != 0;
}
#define PM_HEIGHT ((LCD_HEIGHT >= 72) ? 2 : 1)
@@ -92,13 +101,13 @@ static bool remote_display_on = true;
#endif
/** File name creation **/
-#if CONFIG_CODEC == SWCODEC
-
-#ifdef IF_CNFN_NUM
+#if CONFIG_RTC == 0
/* current file number to assist in creating unique numbered filenames
without actually having to create the file on disk */
static int file_number = -1;
-#endif /* IF_CNFN_NUM */
+#endif /* CONFIG_RTC */
+
+#if CONFIG_CODEC == SWCODEC
#define REC_FILE_ENDING(rec_format) \
(audio_formats[rec_format_afmt[rec_format]].ext_list)
@@ -511,16 +520,26 @@ char *rec_create_filename(char *buffer)
snprintf(ext, sizeof(ext), ".%s",
REC_FILE_ENDING(global_settings.rec_format));
-#if CONFIG_RTC
+#if CONFIG_RTC == 0
+ return create_numbered_filename(buffer, buffer, "rec_", ext, 4,
+ &file_number);
+#else
/* We'll wait at least up to the start of the next second so no duplicate
names are created */
return create_datetime_filename(buffer, buffer, "R", ext, true);
-#else
- return create_numbered_filename(buffer, buffer, "rec_", ext, 4
- IF_CNFN_NUM_(, &file_number));
#endif
}
+#if CONFIG_RTC == 0
+/* Hit disk to get a starting filename for the type */
+void rec_init_filename(void)
+{
+ file_number = -1;
+ rec_create_filename(path_buffer);
+ file_number--;
+}
+#endif
+
int rec_create_directory(void)
{
int rc;
@@ -594,7 +613,6 @@ void rec_record(void)
#if CONFIG_CODEC != SWCODEC
talk_buffer_steal(); /* we use the mp3 buffer */
#endif
- IF_CNFN_NUM_(file_number = -1;) /* Hit disk for number */
audio_record(rec_create_filename(path_buffer));
}
@@ -617,12 +635,15 @@ static void trigger_listener(int trigger_status)
switch (trigger_status)
{
case TRIG_GO:
- if((audio_status() & AUDIO_STATUS_RECORD) != AUDIO_STATUS_RECORD)
+ if(!(audio_status() & AUDIO_STATUS_RECORD))
{
+ rec_status |= RCSTAT_HAVE_RECORDED;
rec_record();
+#if CONFIG_CODEC != SWCODEC
/* give control to mpeg thread so that it can start
recording */
yield(); yield(); yield();
+#endif
}
/* if we're already recording this is a retrigger */
@@ -648,11 +669,7 @@ static void trigger_listener(int trigger_status)
switch(global_settings.rec_trigger_type)
{
case 0: /* Stop */
-#if CONFIG_CODEC == SWCODEC
audio_stop_recording();
-#else
- audio_stop();
-#endif
break;
case 1: /* Pause */
@@ -686,11 +703,9 @@ bool recording_screen(bool no_source)
char buf2[32];
int w, h;
int update_countdown = 1;
- bool have_recorded = false;
unsigned int seconds;
int hours, minutes;
char filename[13];
- bool been_in_usb_mode = false;
int last_audio_stat = -1;
int audio_stat;
#if CONFIG_CODEC == SWCODEC
@@ -733,7 +748,7 @@ bool recording_screen(bool no_source)
struct audio_recording_options rec_options;
- in_screen = true;
+ rec_status = RCSTAT_IN_RECSCREEN;
cursor = 0;
#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR)
ata_set_led_enabled(false);
@@ -761,6 +776,15 @@ bool recording_screen(bool no_source)
rec_set_recording_options(&rec_options);
set_gain();
+
+ if(rec_create_directory() > 0)
+ rec_status |= RCSTAT_CREATED_DIRECTORY;
+
+#if CONFIG_RTC == 0
+ /* Create new filename for recording start */
+ rec_init_filename();
+#endif
+
settings_apply_trigger();
#ifdef HAVE_AGC
@@ -788,9 +812,7 @@ bool recording_screen(bool no_source)
filename_offset[i] = ((screens[i].height >= 80) ? 1 : 0);
pm_y[i] = 8 + h * (2 + filename_offset[i]);
}
-
- if(rec_create_directory() > 0)
- have_recorded = true;
+
#ifdef HAVE_REMOTE_LCD
if (!remote_display_on)
{
@@ -859,9 +881,9 @@ bool recording_screen(bool no_source)
if (last_audio_stat != audio_stat)
{
- if (audio_stat == AUDIO_STATUS_RECORD)
+ if (audio_stat & AUDIO_STATUS_RECORD)
{
- have_recorded = true;
+ rec_status |= RCSTAT_HAVE_RECORDED;
}
last_audio_stat = audio_stat;
}
@@ -926,7 +948,7 @@ bool recording_screen(bool no_source)
(peak_meter_trigger_status() != TRIG_OFF))
{
/* manual recording */
- have_recorded = true;
+ rec_status |= RCSTAT_HAVE_RECORDED;
rec_record();
last_seconds = 0;
if (global_settings.talk_menu)
@@ -1119,7 +1141,11 @@ bool recording_screen(bool no_source)
break;
case ACTION_STD_MENU:
+#if CONFIG_CODEC == SWCODEC
+ if(!(audio_stat & AUDIO_STATUS_RECORD))
+#else
if(audio_stat != AUDIO_STATUS_RECORD)
+#endif
{
#ifdef HAVE_FMRADIO_REC
const int prev_rec_source = global_settings.rec_source;
@@ -1132,7 +1158,7 @@ bool recording_screen(bool no_source)
if (recording_menu(no_source))
{
done = true;
- been_in_usb_mode = true;
+ rec_status |= RCSTAT_BEEN_IN_USB_MODE;
#ifdef HAVE_FMRADIO_REC
radio_status = FMRADIO_OFF;
#endif
@@ -1152,11 +1178,18 @@ bool recording_screen(bool no_source)
audio_close_recording();
audio_init_recording(0);
#endif
+
rec_init_recording_options(&rec_options);
rec_set_recording_options(&rec_options);
if(rec_create_directory() > 0)
- have_recorded = true;
+ rec_status |= RCSTAT_CREATED_DIRECTORY;
+
+#if CONFIG_CODEC == SWCODEC && CONFIG_RTC == 0
+ /* If format changed, a new number is required */
+ rec_init_filename();
+#endif
+
#ifdef HAVE_AGC
if (global_settings.rec_source == AUDIO_SRC_MIC) {
agc_preset = global_settings.rec_agc_preset_mic;
@@ -1192,7 +1225,7 @@ bool recording_screen(bool no_source)
#endif
if (f2_rec_screen())
{
- have_recorded = true;
+ rec_status |= RCSTAT_HAVE_RECORDED;
done = true;
}
else
@@ -1208,31 +1241,28 @@ bool recording_screen(bool no_source)
}
else
{
- if(audio_stat != AUDIO_STATUS_RECORD)
- {
#if (CONFIG_LED == LED_REAL)
- /* led is restored at begin of loop / end of function */
- led(false);
+ /* led is restored at begin of loop / end of function */
+ led(false);
#endif
- if (f3_rec_screen())
- {
- have_recorded = true;
- done = true;
- }
- else
- update_countdown = 1; /* Update immediately */
+ if (f3_rec_screen())
+ {
+ rec_status |= RCSTAT_HAVE_RECORDED;
+ done = true;
}
+ else
+ update_countdown = 1; /* Update immediately */
}
break;
#endif /* CONFIG_KEYPAD == RECORDER_PAD */
case SYS_USB_CONNECTED:
/* Only accept USB connection when not recording */
- if(audio_stat != AUDIO_STATUS_RECORD)
+ if(!(audio_stat & AUDIO_STATUS_RECORD))
{
default_event_handler(SYS_USB_CONNECTED);
done = true;
- been_in_usb_mode = true;
+ rec_status |= RCSTAT_BEEN_IN_USB_MODE;
#ifdef HAVE_FMRADIO_REC
radio_status = FMRADIO_OFF;
#endif
@@ -1467,12 +1497,11 @@ bool recording_screen(bool no_source)
{
switch (global_settings.rec_source)
{
-#if defined(HAVE_LINE_REC) || defined(HAVE_FMRADIO_REC)
HAVE_LINE_REC_(case AUDIO_SRC_LINEIN:)
HAVE_FMRADIO_REC_(case AUDIO_SRC_FMRADIO:)
line[i] = 5;
break;
-#endif
+
case AUDIO_SRC_MIC:
line[i] = 4;
break;
@@ -1678,7 +1707,7 @@ bool recording_screen(bool no_source)
break;
}
}
-
+
#if CONFIG_CODEC == SWCODEC
audio_stop_recording();
audio_close_recording();
@@ -1704,13 +1733,15 @@ bool recording_screen(bool no_source)
peak_meter_trigger(false);
peak_meter_set_trigger_listener(NULL);
- in_screen = false;
+ rec_status &= ~RCSTAT_IN_RECSCREEN;
sound_settings_apply();
FOR_NB_SCREENS(i)
screens[i].setfont(FONT_UI);
- if (have_recorded)
+ /* if the directory was created or recording happened, make sure the
+ browser is updated */
+ if (rec_status & (RCSTAT_CREATED_DIRECTORY | RCSTAT_HAVE_RECORDED))
reload_directory();
#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR)
@@ -1719,7 +1750,7 @@ bool recording_screen(bool no_source)
settings_save();
- return been_in_usb_mode;
+ return (rec_status & RCSTAT_BEEN_IN_USB_MODE) != 0;
} /* recording_screen */
#if CONFIG_KEYPAD == RECORDER_PAD