summaryrefslogtreecommitdiff
path: root/apps/recorder/recording.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/recorder/recording.c')
-rw-r--r--apps/recorder/recording.c578
1 files changed, 415 insertions, 163 deletions
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index e6b06d5..080cafc 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -24,12 +24,14 @@
#include <stdlib.h>
#include "system.h"
+#include "power.h"
#include "lcd.h"
#include "led.h"
#include "mpeg.h"
#include "audio.h"
#if CONFIG_CODEC == SWCODEC
#include "pcm_record.h"
+#include "playback.h"
#endif
#ifdef HAVE_UDA1380
#include "uda1380.h"
@@ -37,7 +39,7 @@
#ifdef HAVE_TLV320
#include "tlv320.h"
#endif
-
+#include "recording.h"
#include "mp3_playback.h"
#include "mas.h"
#include "button.h"
@@ -66,6 +68,7 @@
#include "splash.h"
#include "screen_access.h"
#include "action.h"
+#include "radio.h"
#ifdef HAVE_RECORDING
#define PM_HEIGHT ((LCD_HEIGHT >= 72) ? 2 : 1)
@@ -73,21 +76,6 @@
bool f2_rec_screen(void);
bool f3_rec_screen(void);
-#define SOURCE_MIC 0
-#define SOURCE_LINE 1
-#ifdef HAVE_SPDIF_IN
-#define SOURCE_SPDIF 2
-#define MAX_SOURCE SOURCE_SPDIF
-#else
-#define MAX_SOURCE SOURCE_LINE
-#endif
-
-#if CONFIG_CODEC == SWCODEC
-#define REC_FILE_ENDING ".wav"
-#else
-#define REC_FILE_ENDING ".mp3"
-#endif
-
#define MAX_FILE_SIZE 0x7F800000 /* 2 GB - 4 MB */
int screen_update = NB_SCREENS;
@@ -102,6 +90,19 @@ const char* const freq_str[6] =
"16kHz"
};
+#if CONFIG_CODEC == SWCODEC
+#define REC_ENCODER_ID(q) \
+ rec_quality_info_afmt[q]
+#define REC_QUALITY_LABEL(q) \
+ (audio_formats[REC_ENCODER_ID(q)].label)
+#define REC_FILE_ENDING(q) \
+ (audio_formats[REC_ENCODER_ID(q)].ext)
+#else
+/* default record file extension for HWCODEC */
+#define REC_QUALITY_LABEL(q) "MP3"
+#define REC_FILE_ENDING(q) ".mp3"
+#endif
+
#ifdef HAVE_AGC
/* Timing counters:
* peak_time is incremented every 0.2s, every 2nd run of record screen loop.
@@ -161,13 +162,14 @@ static short agc_maxgain;
static void set_gain(void)
{
- if(global_settings.rec_source == SOURCE_MIC)
+ if(global_settings.rec_source == AUDIO_SRC_MIC)
{
audio_set_recording_gain(global_settings.rec_mic_gain,
0, AUDIO_GAIN_MIC);
}
else
{
+ /* AUDIO_SRC_LINEIN, AUDIO_SRC_SPDIF, AUDIO_SRC_FMRADIO */
audio_set_recording_gain(global_settings.rec_left_gain,
global_settings.rec_right_gain,
AUDIO_GAIN_LINEIN);
@@ -217,12 +219,16 @@ bool agc_gain_is_max(bool left, bool right)
if (agc_preset == 0)
return false;
- if (global_settings.rec_source == SOURCE_LINE)
+ switch (global_settings.rec_source)
{
+ case AUDIO_SRC_LINEIN:
+#ifdef HAVE_FMRADIO_IN
+ case AUDIO_SRC_FMRADIO:
+#endif
gain_current_l = global_settings.rec_left_gain;
gain_current_r = global_settings.rec_right_gain;
- } else
- {
+ break;
+ default:
gain_current_l = global_settings.rec_mic_gain;
gain_current_r = global_settings.rec_mic_gain;
}
@@ -235,13 +241,16 @@ void change_recording_gain(bool increment, bool left, bool right)
{
int factor = (increment ? 1 : -1);
- if (global_settings.rec_source == SOURCE_LINE)
+ switch (global_settings.rec_source)
{
+ case AUDIO_SRC_LINEIN:
+#ifdef HAVE_FMRADIO_IN
+ case AUDIO_SRC_FMRADIO:
+#endif
if(left) global_settings.rec_left_gain += factor;
if (right) global_settings.rec_right_gain += factor;
- }
- else
- {
+ break;
+ default:
global_settings.rec_mic_gain += factor;
}
}
@@ -443,12 +452,15 @@ void adjust_cursor(void)
#ifdef HAVE_AGC
switch(global_settings.rec_source)
{
- case SOURCE_MIC:
+ case AUDIO_SRC_MIC:
if(cursor == 2)
cursor = 4;
else if(cursor == 3)
cursor = 1;
- case SOURCE_LINE:
+ case AUDIO_SRC_LINEIN:
+#ifdef HAVE_FMRADIO_IN
+ case AUDIO_SRC_FMRADIO:
+#endif
max_cursor = 5;
break;
default:
@@ -458,10 +470,13 @@ void adjust_cursor(void)
#else
switch(global_settings.rec_source)
{
- case SOURCE_MIC:
+ case AUDIO_SRC_MIC:
max_cursor = 1;
break;
- case SOURCE_LINE:
+ case AUDIO_SRC_LINEIN:
+#ifdef HAVE_FMRADIO_IN
+ case AUDIO_SRC_FMRADIO:
+#endif
max_cursor = 3;
break;
default:
@@ -481,10 +496,13 @@ char *rec_create_filename(char *buffer)
else
strncpy(buffer, rec_base_directory, MAX_PATH);
+
#ifdef CONFIG_RTC
- create_datetime_filename(buffer, buffer, "R", REC_FILE_ENDING);
+ create_datetime_filename(buffer, buffer, "R",
+ REC_FILE_ENDING(global_settings.rec_quality));
#else
- create_numbered_filename(buffer, buffer, "rec_", REC_FILE_ENDING, 4);
+ create_numbered_filename(buffer, buffer, "rec_",
+ REC_FILE_ENDING(global_settings.rec_quality), 4);
#endif
return buffer;
}
@@ -515,8 +533,190 @@ int rec_create_directory(void)
return 0;
}
+#if CONFIG_CODEC == SWCODEC && !defined(SIMULATOR)
+/**
+ * Selects an audio source for recording or playback
+ * powers/unpowers related devices.
+ * Here because it calls app code and used only for HAVE_RECORDING atm.
+ * Would like it in pcm_record.c.
+ */
+#if defined(HAVE_UDA1380)
+#define ac_disable_recording uda1380_disable_recording
+#define ac_enable_recording uda1380_enable_recording
+#define ac_set_monitor uda1380_set_monitor
+#elif defined(HAVE_TLV320)
+#define ac_disable_recording tlv320_disable_recording
+#define ac_enable_recording tlv320_enable_recording
+#define ac_set_monitor tlv320_set_monitor
+#endif
+
+void rec_set_source(int source, int flags)
+{
+ /* Prevent pops from unneeded switching */
+ static int last_source = AUDIO_SRC_PLAYBACK;
+#ifdef HAVE_TLV320
+ static bool last_recording = false;
+#endif
+
+ bool recording = flags & SRCF_RECORDING;
+ /* Default to peakmeter record. */
+ bool pm_playback = false;
+ bool pm_enabled = true;
+
+ /** Do power up/down of associated device(s) **/
+
+#ifdef HAVE_SPDIF_IN
+ if ((source == AUDIO_SRC_SPDIF) != (source == last_source))
+ cpu_boost(source == AUDIO_SRC_SPDIF);
+
+#ifdef HAVE_SPDIF_POWER
+ /* Check if S/PDIF output power should be switched off or on. NOTE: assumes
+ both optical in and out is controlled by the same power source, which is
+ the case on H1x0. */
+ spdif_power_enable((source == AUDIO_SRC_SPDIF) ||
+ global_settings.spdif_enable);
+#endif
+#endif
+
+#ifdef CONFIG_TUNER
+ /* Switch radio off or on per source and flags. */
+ if (source != AUDIO_SRC_FMRADIO)
+ radio_stop();
+ else if (flags & SRCF_FMRADIO_PAUSED)
+ radio_pause();
+ else
+ radio_start();
+#endif
+
+ switch (source)
+ {
+ default: /* playback - no recording */
+ pm_playback = true;
+ if (source == last_source)
+ break;
+ ac_disable_recording();
+ ac_set_monitor(false);
+ pcm_rec_mux(0); /* line in */
+ break;
+
+ case AUDIO_SRC_MIC: /* recording only */
+ if (source == last_source)
+ break;
+ ac_enable_recording(true); /* source mic */
+ pcm_rec_mux(0); /* line in */
+ break;
+
+ case AUDIO_SRC_LINEIN: /* recording only */
+ if (source == last_source)
+ break;
+ pcm_rec_mux(0); /* line in */
+ ac_enable_recording(false); /* source line */
+ break;
+
+#ifdef HAVE_SPDIF_IN
+ case AUDIO_SRC_SPDIF: /* recording only */
+ if (recording)
+ {
+ /* This was originally done in audio_set_recording_options only */
+#ifdef HAVE_SPDIF_POWER
+ EBU1CONFIG = global_settings.spdif_enable ? (1 << 2) : 0;
+ /* Input source is EBUin1, Feed-through monitoring if desired */
+#else
+ EBU1CONFIG = (1 << 2);
+ /* Input source is EBUin1, Feed-through monitoring */
+#endif
+ }
+
+ if (source != last_source)
+ uda1380_disable_recording();
+ break;
+#endif /* HAVE_SPDIF_IN */
+
+#ifdef HAVE_FMRADIO_IN
+ case AUDIO_SRC_FMRADIO:
+ if (!recording)
+ {
+ audio_set_recording_gain(sound_default(SOUND_LEFT_GAIN),
+ sound_default(SOUND_RIGHT_GAIN), AUDIO_GAIN_LINEIN);
+ pm_playback = true;
+ pm_enabled = false;
+ }
+
+ pcm_rec_mux(1); /* fm radio */
+
+#ifdef HAVE_UDA1380
+ if (source == last_source)
+ break;
+ /* I2S recording and playback */
+ uda1380_enable_recording(false); /* source line */
+ uda1380_set_monitor(true);
+#endif
+#ifdef HAVE_TLV320
+ /* I2S recording and analog playback */
+ if (source == last_source && recording == last_recording)
+ break;
+
+ last_recording = recording;
+
+ if (recording)
+ tlv320_enable_recording(false); /* source line */
+ else
+ {
+ tlv320_disable_recording();
+ tlv320_set_monitor(true); /* analog bypass */
+ }
+#endif
+ break;
+/* #elif defined(CONFIG_TUNER) */
+/* Have radio but cannot record it */
+/* case AUDIO_SRC_FMRADIO: */
+/* break; */
+#endif /* HAVE_FMRADIO_IN */
+ } /* end switch */
+
+ peak_meter_playback(pm_playback);
+ peak_meter_enabled = pm_enabled;
+
+ last_source = source;
+} /* rec_set_source */
+#endif /* CONFIG_CODEC == SWCODEC && !defined(SIMULATOR) */
+
+/* steal the mp3 buffer then actually set options */
+void rec_set_recording_options(int frequency, int quality,
+ int source, int source_flags,
+ int channel_mode, bool editable,
+ int prerecord_time)
+{
+#if CONFIG_CODEC != SWCODEC
+ if (global_settings.rec_prerecord_time)
+#endif
+ talk_buffer_steal(); /* will use the mp3 buffer */
+
+#if CONFIG_CODEC == SWCODEC
+ rec_set_source(source, source_flags | SRCF_RECORDING);
+#else
+ (void)source_flags;
+#endif
+
+ audio_set_recording_options(frequency, quality, source,
+ channel_mode, editable, prerecord_time);
+}
+
static char path_buffer[MAX_PATH];
+/* steals mp3 buffer, creates unique filename and starts recording */
+void rec_record(void)
+{
+ talk_buffer_steal(); /* we use the mp3 buffer */
+ audio_record(rec_create_filename(path_buffer));
+}
+
+/* creates unique filename and starts recording */
+void rec_new_file(void)
+{
+ audio_new_file(rec_create_filename(path_buffer));
+}
+
/* used in trigger_listerner and recording_screen */
static unsigned int last_seconds = 0;
@@ -533,16 +733,16 @@ static void trigger_listener(int trigger_status)
if((audio_status() & AUDIO_STATUS_RECORD) != AUDIO_STATUS_RECORD)
{
talk_buffer_steal(); /* we use the mp3 buffer */
- audio_record(rec_create_filename(path_buffer));
-
- /* give control to mpeg thread so that it can start recording*/
+ rec_record();
+ /* give control to mpeg thread so that it can start
+ recording */
yield(); yield(); yield();
}
/* if we're already recording this is a retrigger */
else
{
- audio_new_file(rec_create_filename(path_buffer));
+ rec_new_file();
/* tell recording_screen to reset the time */
last_seconds = 0;
}
@@ -563,10 +763,9 @@ static void trigger_listener(int trigger_status)
}
}
-bool recording_screen(void)
+bool recording_screen(bool no_source)
{
long button;
- long lastbutton = BUTTON_NONE;
bool done = false;
char buf[32];
char buf2[32];
@@ -575,11 +774,19 @@ bool recording_screen(void)
bool have_recorded = false;
unsigned int seconds;
int hours, minutes;
- char path_buffer[MAX_PATH];
char filename[13];
bool been_in_usb_mode = false;
int last_audio_stat = -1;
int audio_stat;
+#ifdef HAVE_FMRADIO_IN
+ /* Radio is left on if:
+ * 1) Is was on at the start and the initial source is FM Radio
+ * 2) 1) and the source was never changed to something else
+ */
+ int radio_status = (global_settings.rec_source != AUDIO_SRC_FMRADIO) ?
+ FMRADIO_OFF : get_radio_status();
+#endif
+ int talk_menu = global_settings.talk_menu;
#if CONFIG_LED == LED_REAL
bool led_state = false;
int led_countdown = 2;
@@ -608,6 +815,18 @@ bool recording_screen(void)
ata_set_led_enabled(false);
#endif
+#if CONFIG_CODEC == SWCODEC
+ audio_stop();
+ voice_stop();
+ /* recording_menu gets messed up: so reset talk_menu */
+ talk_menu = global_settings.talk_menu;
+ global_settings.talk_menu = 0;
+#else
+ /* Yes, we use the D/A for monitoring */
+ peak_meter_enabled = true;
+ peak_meter_playback(true);
+#endif
+
#ifndef SIMULATOR
audio_init_recording(talk_get_bufsize());
#else
@@ -616,44 +835,19 @@ bool recording_screen(void)
sound_set_volume(global_settings.volume);
-#if CONFIG_CODEC == SWCODEC
- audio_stop();
- /* Set peak meter to recording mode */
- peak_meter_playback(false);
-
-#if defined(HAVE_SPDIF_IN) && !defined(SIMULATOR)
- if (global_settings.rec_source == SOURCE_SPDIF)
- cpu_boost(true);
-#endif
-
-#else
- /* Yes, we use the D/A for monitoring */
- peak_meter_playback(true);
-#endif
- peak_meter_enabled = true;
#ifdef HAVE_AGC
peak_meter_get_peakhold(&peak_l, &peak_r);
#endif
-#if CONFIG_CODEC != SWCODEC
- if (global_settings.rec_prerecord_time)
-#endif
- talk_buffer_steal(); /* will use the mp3 buffer */
-
-#if defined(HAVE_SPDIF_POWER) && !defined(SIMULATOR)
- /* Tell recording whether we want S/PDIF power enabled at all times */
- audio_set_spdif_power_setting(global_settings.spdif_enable);
-#endif
-
- audio_set_recording_options(global_settings.rec_frequency,
- global_settings.rec_quality,
- global_settings.rec_source,
- global_settings.rec_channels,
- global_settings.rec_editable,
- global_settings.rec_prerecord_time);
+ rec_set_recording_options(global_settings.rec_frequency,
+ global_settings.rec_quality,
+ global_settings.rec_source,
+ 0,
+ global_settings.rec_channels,
+ global_settings.rec_editable,
+ global_settings.rec_prerecord_time);
set_gain();
-
settings_apply_trigger();
#ifdef HAVE_AGC
@@ -663,7 +857,7 @@ bool recording_screen(void)
agc_preset_str[3] = str(LANG_AGC_DJSET);
agc_preset_str[4] = str(LANG_AGC_MEDIUM);
agc_preset_str[5] = str(LANG_AGC_VOICE);
- if (global_settings.rec_source == SOURCE_MIC) {
+ if (global_settings.rec_source == AUDIO_SRC_MIC) {
agc_preset = global_settings.rec_agc_preset_mic;
agc_maxgain = global_settings.rec_agc_maxgain_mic;
}
@@ -697,11 +891,7 @@ bool recording_screen(void)
while(!done)
{
-#if CONFIG_CODEC == SWCODEC
- audio_stat = pcm_rec_status();
-#else
audio_stat = audio_status();
-#endif
#if CONFIG_LED == LED_REAL
@@ -794,8 +984,8 @@ bool recording_screen(void)
}
else
{
- peak_meter_playback(true);
#if CONFIG_CODEC != SWCODEC
+ peak_meter_playback(true);
peak_meter_enabled = false;
#endif
done = true;
@@ -815,14 +1005,13 @@ bool recording_screen(void)
/* manual recording */
have_recorded = true;
talk_buffer_steal(); /* we use the mp3 buffer */
- audio_record(rec_create_filename(path_buffer));
+ rec_record();
last_seconds = 0;
- if (global_settings.talk_menu)
+ if (talk_menu)
{ /* no voice possible here, but a beep */
audio_beep(HZ/2); /* longer beep on start */
}
}
-
/* this is triggered recording */
else
{
@@ -838,7 +1027,7 @@ bool recording_screen(void)
/*if new file button pressed, start new file */
if (button == ACTION_REC_NEWFILE)
{
- audio_new_file(rec_create_filename(path_buffer));
+ rec_new_file();
last_seconds = 0;
}
else
@@ -847,7 +1036,7 @@ bool recording_screen(void)
if(audio_stat & AUDIO_STATUS_PAUSE)
{
audio_resume_recording();
- if (global_settings.talk_menu)
+ if (talk_menu)
{ /* no voice possible here, but a beep */
audio_beep(HZ/4); /* short beep on resume */
}
@@ -883,7 +1072,7 @@ bool recording_screen(void)
sound_set_volume(global_settings.volume);
break;
case 1:
- if(global_settings.rec_source == SOURCE_MIC)
+ if(global_settings.rec_source == AUDIO_SRC_MIC)
{
if(global_settings.rec_mic_gain <
sound_max(SOUND_MIC_GAIN))
@@ -913,7 +1102,7 @@ bool recording_screen(void)
case 4:
agc_preset = MIN(agc_preset + 1, AGC_MODE_SIZE);
agc_enable = (agc_preset != 0);
- if (global_settings.rec_source == SOURCE_MIC) {
+ if (global_settings.rec_source == AUDIO_SRC_MIC) {
global_settings.rec_agc_preset_mic = agc_preset;
agc_maxgain = global_settings.rec_agc_maxgain_mic;
} else {
@@ -922,7 +1111,7 @@ bool recording_screen(void)
}
break;
case 5:
- if (global_settings.rec_source == SOURCE_MIC)
+ if (global_settings.rec_source == AUDIO_SRC_MIC)
{
agc_maxgain = MIN(agc_maxgain + 1,
sound_max(SOUND_MIC_GAIN));
@@ -951,7 +1140,7 @@ bool recording_screen(void)
sound_set_volume(global_settings.volume);
break;
case 1:
- if(global_settings.rec_source == SOURCE_MIC)
+ if(global_settings.rec_source == AUDIO_SRC_MIC)
{
if(global_settings.rec_mic_gain >
sound_min(SOUND_MIC_GAIN))
@@ -981,7 +1170,7 @@ bool recording_screen(void)
case 4:
agc_preset = MAX(agc_preset - 1, 0);
agc_enable = (agc_preset != 0);
- if (global_settings.rec_source == SOURCE_MIC) {
+ if (global_settings.rec_source == AUDIO_SRC_MIC) {
global_settings.rec_agc_preset_mic = agc_preset;
agc_maxgain = global_settings.rec_agc_maxgain_mic;
} else {
@@ -990,7 +1179,7 @@ bool recording_screen(void)
}
break;
case 5:
- if (global_settings.rec_source == SOURCE_MIC)
+ if (global_settings.rec_source == AUDIO_SRC_MIC)
{
agc_maxgain = MAX(agc_maxgain - 1,
sound_min(SOUND_MIC_GAIN));
@@ -1012,49 +1201,73 @@ bool recording_screen(void)
case ACTION_STD_MENU:
if(audio_stat != AUDIO_STATUS_RECORD)
{
+#ifdef HAVE_FMRADIO_IN
+ const int prev_rec_source = global_settings.rec_source;
+#endif
+
#if CONFIG_LED == LED_REAL
/* led is restored at begin of loop / end of function */
led(false);
#endif
- if (recording_menu(false))
+ if (recording_menu(no_source))
{
- return SYS_USB_CONNECTED;
+ done = true;
+ been_in_usb_mode = true;
+#ifdef HAVE_FMRADIO_IN
+ radio_status = FMRADIO_OFF;
+#endif
}
- settings_save();
+ else
+ {
+ settings_save();
+
+#ifdef HAVE_FMRADIO_IN
+ /* If input changes away from FM Radio, radio will
+ remain off when recording screen closes. */
+ if (global_settings.rec_source != prev_rec_source
+ && prev_rec_source == AUDIO_SRC_FMRADIO)
+ radio_status = FMRADIO_OFF;
+#endif
-#if CONFIG_CODEC != SWCODEC
- if (global_settings.rec_prerecord_time)
+#if CONFIG_CODEC == SWCODEC
+ /* reinit after submenu exit */
+ audio_close_recording();
+ audio_init_recording(talk_get_bufsize());
#endif
- talk_buffer_steal(); /* will use the mp3 buffer */
-
- audio_set_recording_options(global_settings.rec_frequency,
- global_settings.rec_quality,
- global_settings.rec_source,
- global_settings.rec_channels,
- global_settings.rec_editable,
- global_settings.rec_prerecord_time);
+ rec_set_recording_options(
+ global_settings.rec_frequency,
+ global_settings.rec_quality,
+ global_settings.rec_source,
+ 0,
+ global_settings.rec_channels,
+ global_settings.rec_editable,
+ global_settings.rec_prerecord_time);
+
#ifdef HAVE_AGC
- if (global_settings.rec_source == SOURCE_MIC) {
- agc_preset = global_settings.rec_agc_preset_mic;
- agc_maxgain = global_settings.rec_agc_maxgain_mic;
- }
- else {
- agc_preset = global_settings.rec_agc_preset_line;
- agc_maxgain = global_settings.rec_agc_maxgain_line;
- }
+ if (global_settings.rec_source == AUDIO_SRC_MIC) {
+ agc_preset = global_settings.rec_agc_preset_mic;
+ agc_maxgain = global_settings.rec_agc_maxgain_mic;
+ }
+ else {
+ agc_preset = global_settings.rec_agc_preset_line;
+ agc_maxgain = global_settings.rec_agc_maxgain_line;
+ }
#endif
- adjust_cursor();
- set_gain();
- update_countdown = 1; /* Update immediately */
+ adjust_cursor();
+ set_gain();
+ update_countdown = 1; /* Update immediately */
- FOR_NB_SCREENS(i)
- {
- screens[i].setfont(FONT_SYSFIXED);
- screens[i].setmargins(global_settings.invert_cursor ? 0 : w, 8);
+ FOR_NB_SCREENS(i)
+ {
+ screens[i].setfont(FONT_SYSFIXED);
+ screens[i].setmargins(
+ global_settings.invert_cursor ? 0 : w, 8);
+ }
}
}
break;
+
#if CONFIG_KEYPAD == RECORDER_PAD
case ACTION_REC_F2:
if(audio_stat != AUDIO_STATUS_RECORD)
@@ -1076,7 +1289,7 @@ bool recording_screen(void)
case ACTION_REC_F3:
if(audio_stat & AUDIO_STATUS_RECORD)
{
- audio_new_file(rec_create_filename(path_buffer));
+ rec_new_file();
last_seconds = 0;
}
else
@@ -1097,7 +1310,7 @@ bool recording_screen(void)
}
}
break;
-#endif
+#endif /* CONFIG_KEYPAD == RECORDER_PAD */
case SYS_USB_CONNECTED:
/* Only accept USB connection when not recording */
@@ -1106,6 +1319,9 @@ bool recording_screen(void)
default_event_handler(SYS_USB_CONNECTED);
done = true;
been_in_usb_mode = true;
+#ifdef HAVE_FMRADIO_IN
+ radio_status = FMRADIO_OFF;
+#endif
}
break;
@@ -1113,8 +1329,6 @@ bool recording_screen(void)
default_event_handler(button);
break;
}
- if (button != BUTTON_NONE)
- lastbutton = button;
#ifdef HAVE_AGC
peak_read = !peak_read;
@@ -1230,7 +1444,7 @@ bool recording_screen(void)
if (!(global_settings.rec_split_type)
|| (num_recorded_bytes >= MAX_FILE_SIZE))
{
- audio_new_file(rec_create_filename(path_buffer));
+ rec_new_file();
last_seconds = 0;
}
else
@@ -1259,8 +1473,9 @@ bool recording_screen(void)
screens[i].puts(0, filename_offset[i] + PM_HEIGHT + 2, buf);
}
- if(global_settings.rec_source == SOURCE_MIC)
- {
+ if(global_settings.rec_source == AUDIO_SRC_MIC)
+ {
+ /* Draw MIC recording gain */
snprintf(buf, 32, "%s:%s", str(LANG_SYSFONT_RECORDING_GAIN),
fmt_gain(SOUND_MIC_GAIN,
global_settings.rec_mic_gain,
@@ -1278,8 +1493,13 @@ bool recording_screen(void)
PM_HEIGHT + 3, buf);
}
}
- else if(global_settings.rec_source == SOURCE_LINE)
+ else if(global_settings.rec_source == AUDIO_SRC_LINEIN
+#ifdef HAVE_FMRADIO_IN
+ || global_settings.rec_source == AUDIO_SRC_FMRADIO
+#endif
+ )
{
+ /* Draw LINE or FMRADIO recording gain */
snprintf(buf, 32, "%s:%s",
str(LANG_SYSFONT_RECORDING_LEFT),
fmt_gain(SOUND_LEFT_GAIN,
@@ -1319,14 +1539,23 @@ bool recording_screen(void)
FOR_NB_SCREENS(i)
{
- if (global_settings.rec_source == SOURCE_LINE)
+ switch (global_settings.rec_source)
+ {
+ case AUDIO_SRC_LINEIN:
+#ifdef HAVE_FMRADIO_IN
+ case AUDIO_SRC_FMRADIO:
+#endif
line[i] = 5;
- else if (global_settings.rec_source == SOURCE_MIC)
+ break;
+ case AUDIO_SRC_MIC:
line[i] = 4;
+ break;
#ifdef HAVE_SPDIF_IN
- else if (global_settings.rec_source == SOURCE_SPDIF)
+ case AUDIO_SRC_SPDIF:
line[i] = 3;
+ break;
#endif
+ } /* end switch */
#ifdef HAVE_AGC
if (screens[i].height < h * (2 + filename_offset[i] + PM_HEIGHT + line[i]))
{
@@ -1358,7 +1587,7 @@ bool recording_screen(void)
snprintf(buf, 32, "%s: %s",
str(LANG_RECORDING_AGC_PRESET),
agc_preset_str[agc_preset]);
- else if (global_settings.rec_source == SOURCE_MIC)
+ else if (global_settings.rec_source == AUDIO_SRC_MIC)
snprintf(buf, 32, "%s: %s%s",
str(LANG_RECORDING_AGC_PRESET),
agc_preset_str[agc_preset],
@@ -1382,8 +1611,12 @@ bool recording_screen(void)
screens[i].puts_style_offset(0, filename_offset[i] +
PM_HEIGHT + line[i], buf, STYLE_INVERT,0);
}
- else if ((global_settings.rec_source == SOURCE_MIC)
- || (global_settings.rec_source == SOURCE_LINE))
+ else if (global_settings.rec_source == AUDIO_SRC_MIC
+ || global_settings.rec_source == AUDIO_SRC_LINEIN
+#ifdef HAVE_FMRADIO_IN
+ || global_settings.rec_source == AUDIO_SRC_FMRADIO
+#endif
+ )
{
for(i = 0; i < screen_update; i++) {
if (display_agc[i]) {
@@ -1393,7 +1626,7 @@ bool recording_screen(void)
}
}
- if (global_settings.rec_source == SOURCE_MIC)
+ if (global_settings.rec_source == AUDIO_SRC_MIC)
{
if(agc_maxgain < (global_settings.rec_mic_gain))
change_recording_gain(false, true, true);
@@ -1418,7 +1651,7 @@ bool recording_screen(void)
filename_offset[i] +
PM_HEIGHT + 3, true);
- if(global_settings.rec_source != SOURCE_MIC)
+ if(global_settings.rec_source != AUDIO_SRC_MIC)
{
for(i = 0; i < screen_update; i++)
screen_put_cursorxy(&screens[i], 0,
@@ -1456,14 +1689,14 @@ bool recording_screen(void)
}
/* Can't measure S/PDIF sample rate on Archos yet */
#if (CONFIG_CODEC != MAS3587F) && defined(HAVE_SPDIF_IN) && !defined(SIMULATOR)
- if (global_settings.rec_source == SOURCE_SPDIF)
+ if (global_settings.rec_source == AUDIO_SRC_SPDIF)
snprintf(spdif_sfreq, 8, "%dHz", audio_get_spdif_sample_rate());
#else
(void)spdif_sfreq;
#endif
snprintf(buf, 32, "%s %s",
#if (CONFIG_CODEC != MAS3587F) && defined(HAVE_SPDIF_IN) && !defined(SIMULATOR)
- global_settings.rec_source == SOURCE_SPDIF ?
+ global_settings.rec_source == AUDIO_SRC_SPDIF ?
spdif_sfreq :
#endif
freq_str[global_settings.rec_frequency],
@@ -1473,8 +1706,8 @@ bool recording_screen(void)
for(i = 0; i < screen_update; i++) {
#ifdef HAVE_AGC
- if ((global_settings.rec_source == SOURCE_MIC)
- || (global_settings.rec_source == SOURCE_LINE))
+ if ((global_settings.rec_source == AUDIO_SRC_MIC)
+ || (global_settings.rec_source == AUDIO_SRC_LINEIN))
screens[i].puts(0, filename_offset[i] + PM_HEIGHT + line[i] + 1, buf);
else
#endif
@@ -1484,6 +1717,14 @@ bool recording_screen(void)
#ifdef HAVE_AGC
hist_time++;
#endif
+
+#if CONFIG_CODEC == SWCODEC
+ snprintf(buf, 32, "%s",
+ REC_QUALITY_LABEL(global_settings.rec_quality));
+ for(i = 0; i < screen_update; i++)
+ screens[i].puts(0, filename_offset[i] + PM_HEIGHT + 6, buf);
+#endif
+
for(i = 0; i < screen_update; i++)
{
gui_statusbar_draw(&(statusbars.statusbars[i]), true);
@@ -1506,7 +1747,7 @@ bool recording_screen(void)
{
done = true;
}
- }
+ } /* end while(!done) */
#if CONFIG_CODEC == SWCODEC
@@ -1531,18 +1772,26 @@ bool recording_screen(void)
}
}
-#if CONFIG_CODEC == SWCODEC
+#if CONFIG_CODEC == SWCODEC
audio_stop_recording();
audio_close_recording();
-#if defined(HAVE_SPDIF_IN) && !defined(SIMULATOR)
- if (global_settings.rec_source == SOURCE_SPDIF)
- cpu_boost(false);
+#ifdef HAVE_FMRADIO_IN
+ if (radio_status != FMRADIO_OFF)
+ /* Restore radio playback - radio_status should be unchanged if started
+ through fm radio screen (barring usb connect) */
+ rec_set_source(AUDIO_SRC_FMRADIO, (radio_status & FMRADIO_PAUSED) ?
+ SRCF_FMRADIO_PAUSED : SRCF_FMRADIO_PLAYING);
+ else
#endif
+ /* Go back to playback mode */
+ rec_set_source(AUDIO_SRC_PLAYBACK, SRCF_PLAYBACK);
-#else
+ /* restore talk_menu setting */
+ global_settings.talk_menu = talk_menu;
+#else /* !SWCODEC */
audio_init_playback();
-#endif
+#endif /* CONFIG_CODEC == SWCODEC */
/* make sure the trigger is really turned off */
peak_meter_trigger(false);
@@ -1560,7 +1809,7 @@ bool recording_screen(void)
ata_set_led_enabled(true);
#endif
return been_in_usb_mode;
-}
+} /* recording_screen */
#if CONFIG_KEYPAD == RECORDER_PAD
bool f2_rec_screen(void)
@@ -1680,15 +1929,13 @@ bool f2_rec_screen(void)
}
}
- if (global_settings.rec_prerecord_time)
- talk_buffer_steal(); /* will use the mp3 buffer */
-
- audio_set_recording_options(global_settings.rec_frequency,
- global_settings.rec_quality,
- global_settings.rec_source,
- global_settings.rec_channels,
- global_settings.rec_editable,
- global_settings.rec_prerecord_time);
+ rec_set_recording_options(global_settings.rec_frequency,
+ global_settings.rec_quality,
+ global_settings.rec_source,
+ 0,
+ global_settings.rec_channels,
+ global_settings.rec_editable,
+ global_settings.rec_prerecord_time);
set_gain();
@@ -1760,7 +2007,7 @@ bool f3_rec_screen(void)
case BUTTON_LEFT:
case BUTTON_F3 | BUTTON_LEFT:
global_settings.rec_source++;
- if(global_settings.rec_source > MAX_SOURCE)
+ if(global_settings.rec_source > AUDIO_SRC_MAX)
global_settings.rec_source = 0;
used = true;
break;
@@ -1782,16 +2029,13 @@ bool f3_rec_screen(void)
}
}
- if (global_settings.rec_prerecord_time)
- talk_buffer_steal(); /* will use the mp3 buffer */
-
- audio_set_recording_options(global_settings.rec_frequency,
- global_settings.rec_quality,
- global_settings.rec_source,
- global_settings.rec_channels,
- global_settings.rec_editable,
- global_settings.rec_prerecord_time);
-
+ rec_set_recording_options(global_settings.rec_frequency,
+ global_settings.rec_quality,
+ global_settings.rec_source,
+ 0,
+ global_settings.rec_channels,
+ global_settings.rec_editable,
+ global_settings.rec_prerecord_time);
set_gain();
@@ -1801,7 +2045,7 @@ bool f3_rec_screen(void)
return false;
}
-#endif /* #ifdef RECORDER_PAD */
+#endif /* CONFIG_KEYPAD == RECORDER_PAD */
#if CONFIG_CODEC == SWCODEC
void audio_beep(int duration)
@@ -1831,6 +2075,14 @@ unsigned long audio_num_recorded_bytes(void)
return 5 * 1024 * 1024;
}
+#if CONFIG_CODEC == SWCODEC
+void rec_set_source(int source, int flags)
+{
+ source = source;
+ flags = flags;
+}
+#endif
+
void audio_set_recording_options(int frequency, int quality,
int source, int channel_mode,
bool editable, int prerecord_time)