Recording settings are now persistent. Added a Recording Settings menu

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2818 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Linus Nielsen Feltzing 2002-11-10 23:18:33 +00:00
parent 8e4a0e0aab
commit afe0da9e16
7 changed files with 251 additions and 103 deletions

View file

@ -1118,7 +1118,27 @@ desc: in the recording settings
eng: "Source"
new:
id: LANG_RECORDING_CHANNEL
id: LANG_RECORDING_CHANNELS
desc: in the recording settings
eng: "Channel"
eng: "Channels"
new:
id: LANG_RECORDING_SRC_MIC
desc: in the recording settings
eng: "Mic"
new:
id: LANG_RECORDING_SRC_LINE
desc: in the recording settings
eng: "Line In"
new:
id: LANG_RECORDING_SRC_DIGITAL
desc: in the recording settings
eng: "Digital"
new:
id: LANG_RECORDING_SETTINGS
desc: in the main menu
eng: "Recording settings"
new:

View file

@ -228,6 +228,7 @@ bool main_menu(void)
{ str(LANG_SOUND_SETTINGS), sound_menu },
{ str(LANG_GENERAL_SETTINGS), settings_menu },
#ifdef HAVE_MAS3587F
{ str(LANG_RECORDING_SETTINGS), recording_menu },
{ str(LANG_RECORDING), recording_screen },
#endif
#ifdef HAVE_LCD_BITMAP

View file

@ -35,6 +35,7 @@
#include "peakmeter.h"
#include "status.h"
#include "menu.h"
#include "sound_menu.h"
bool f2_rec_screen(void);
bool f3_rec_screen(void);
@ -46,14 +47,6 @@ extern int mp3buf_write;
extern int mp3buf_read;
extern bool recording;
int mic_gain = 8;
int left_gain = 2;
int right_gain = 2;
unsigned int recording_quality = 5;
unsigned int recording_frequency = 0;
unsigned int recording_channel_mode = 0;
unsigned int recording_source = 0;
#define SOURCE_MIC 0
#define SOURCE_LINE 1
#define SOURCE_SPDIF 2
@ -70,13 +63,15 @@ char *freq_str[6] =
static void set_gain(void)
{
if(recording_source == SOURCE_MIC)
if(global_settings.rec_source == SOURCE_MIC)
{
mpeg_set_recording_gain(left_gain, 0, mic_gain);
mpeg_set_recording_gain(global_settings.rec_left_gain, 0,
global_settings.rec_mic_gain);
}
else
{
mpeg_set_recording_gain(left_gain, right_gain, 0);
mpeg_set_recording_gain(global_settings.rec_left_gain,
global_settings.rec_right_gain, 0);
}
}
@ -107,7 +102,7 @@ int cursor;
void adjust_cursor(void)
{
if(recording_source == SOURCE_LINE)
if(global_settings.rec_source == SOURCE_LINE)
{
if(cursor < 0)
cursor = 0;
@ -140,8 +135,10 @@ bool recording_screen(void)
peak_meter_enabled = true;
mpeg_set_recording_options(recording_frequency, recording_quality,
recording_source, recording_channel_mode);
mpeg_set_recording_options(global_settings.rec_frequency,
global_settings.rec_quality,
global_settings.rec_source,
global_settings.rec_channels);
lcd_setfont(FONT_UI);
lcd_getstringsize("M", &w, &h);
@ -189,30 +186,37 @@ bool recording_screen(void)
switch(cursor)
{
case 0:
if(recording_source == SOURCE_MIC)
if(global_settings.rec_source == SOURCE_MIC)
{
mic_gain++;
if(mic_gain > mpeg_sound_max(SOUND_MIC_GAIN))
mic_gain = mpeg_sound_max(SOUND_MIC_GAIN);
global_settings.rec_mic_gain++;
if(global_settings.rec_mic_gain >
mpeg_sound_max(SOUND_MIC_GAIN))
global_settings.rec_mic_gain =
mpeg_sound_max(SOUND_MIC_GAIN);
}
else
{
gain = MAX(left_gain, right_gain) + 1;
gain = MAX(global_settings.rec_left_gain,
global_settings.rec_right_gain) + 1;
if(gain > mpeg_sound_max(SOUND_MIC_GAIN))
gain = mpeg_sound_max(SOUND_MIC_GAIN);
left_gain = gain;
right_gain = gain;
global_settings.rec_left_gain = gain;
global_settings.rec_right_gain = gain;
}
break;
case 1:
left_gain++;
if(left_gain > mpeg_sound_max(SOUND_LEFT_GAIN))
left_gain = mpeg_sound_max(SOUND_LEFT_GAIN);
global_settings.rec_left_gain++;
if(global_settings.rec_left_gain >
mpeg_sound_max(SOUND_LEFT_GAIN))
global_settings.rec_left_gain =
mpeg_sound_max(SOUND_LEFT_GAIN);
break;
case 2:
right_gain++;
if(right_gain > mpeg_sound_max(SOUND_RIGHT_GAIN))
right_gain = mpeg_sound_max(SOUND_RIGHT_GAIN);
global_settings.rec_right_gain++;
if(global_settings.rec_right_gain >
mpeg_sound_max(SOUND_RIGHT_GAIN))
global_settings.rec_right_gain =
mpeg_sound_max(SOUND_RIGHT_GAIN);
break;
}
set_gain();
@ -223,36 +227,50 @@ bool recording_screen(void)
switch(cursor)
{
case 0:
if(recording_source == SOURCE_MIC)
if(global_settings.rec_source == SOURCE_MIC)
{
mic_gain--;
if(mic_gain < mpeg_sound_min(SOUND_MIC_GAIN))
mic_gain = mpeg_sound_min(SOUND_MIC_GAIN);
global_settings.rec_mic_gain--;
if(global_settings.rec_mic_gain <
mpeg_sound_min(SOUND_MIC_GAIN))
global_settings.rec_mic_gain =
mpeg_sound_min(SOUND_MIC_GAIN);
}
else
{
gain = MAX(left_gain, right_gain) - 1;
gain = MAX(global_settings.rec_left_gain,
global_settings.rec_right_gain) - 1;
if(gain < mpeg_sound_min(SOUND_LEFT_GAIN))
gain = mpeg_sound_min(SOUND_LEFT_GAIN);
left_gain = gain;
right_gain = gain;
global_settings.rec_left_gain = gain;
global_settings.rec_right_gain = gain;
}
break;
case 1:
left_gain--;
if(left_gain < mpeg_sound_min(SOUND_LEFT_GAIN))
left_gain = mpeg_sound_min(SOUND_LEFT_GAIN);
global_settings.rec_left_gain--;
if(global_settings.rec_left_gain <
mpeg_sound_min(SOUND_LEFT_GAIN))
global_settings.rec_left_gain =
mpeg_sound_min(SOUND_LEFT_GAIN);
break;
case 2:
right_gain--;
if(right_gain < mpeg_sound_min(SOUND_MIC_GAIN))
right_gain = mpeg_sound_min(SOUND_MIC_GAIN);
global_settings.rec_right_gain--;
if(global_settings.rec_right_gain <
mpeg_sound_min(SOUND_MIC_GAIN))
global_settings.rec_right_gain =
mpeg_sound_min(SOUND_MIC_GAIN);
break;
}
set_gain();
update_countdown = 1; /* Update immediately */
break;
case BUTTON_F1:
if (recording_menu())
return SYS_USB_CONNECTED;
settings_save();
update_countdown = 1; /* Update immediately */
break;
case BUTTON_F2:
if (f2_rec_screen())
return SYS_USB_CONNECTED;
@ -282,18 +300,20 @@ bool recording_screen(void)
peak_meter_draw(0, 8 + h, LCD_WIDTH, h);
/* Show mic gain if input source is Mic */
if(recording_source == 0)
if(global_settings.rec_source == 0)
{
snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_GAIN),
fmt_gain(SOUND_MIC_GAIN, mic_gain,
fmt_gain(SOUND_MIC_GAIN,
global_settings.rec_mic_gain,
buf2, sizeof(buf2)));
lcd_puts(0, 3, buf);
}
else
{
if(recording_source == SOURCE_LINE)
if(global_settings.rec_source == SOURCE_LINE)
{
gain = MAX(left_gain, right_gain);
gain = MAX(global_settings.rec_left_gain,
global_settings.rec_right_gain);
snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_GAIN),
fmt_gain(SOUND_LEFT_GAIN, gain,
@ -301,12 +321,14 @@ bool recording_screen(void)
lcd_puts(0, 3, buf);
snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_LEFT),
fmt_gain(SOUND_LEFT_GAIN, left_gain,
fmt_gain(SOUND_LEFT_GAIN,
global_settings.rec_left_gain,
buf2, sizeof(buf2)));
lcd_puts(0, 4, buf);
snprintf(buf, 32, "%s: %s", str(LANG_RECORDING_RIGHT),
fmt_gain(SOUND_RIGHT_GAIN, right_gain,
fmt_gain(SOUND_RIGHT_GAIN,
global_settings.rec_right_gain,
buf2, sizeof(buf2)));
lcd_puts(0, 5, buf);
}
@ -314,14 +336,14 @@ bool recording_screen(void)
status_draw();
if(recording_source != SOURCE_SPDIF)
if(global_settings.rec_source != SOURCE_SPDIF)
put_cursorxy(0, 3 + cursor, true);
snprintf(buf, 32, "%s %s [%d]",
freq_str[recording_frequency],
recording_channel_mode?
freq_str[global_settings.rec_frequency],
global_settings.rec_channels?
str(LANG_CHANNEL_MONO):str(LANG_CHANNEL_STEREO),
recording_quality);
global_settings.rec_quality);
lcd_puts(0, 6, buf);
}
else
@ -357,7 +379,7 @@ bool f2_rec_screen(void)
/* Recording quality */
lcd_putsxy(0, LCD_HEIGHT/2 - h*2, str(LANG_RECORDING_QUALITY));
snprintf(buf, 32, "%d", recording_quality);
snprintf(buf, 32, "%d", global_settings.rec_quality);
lcd_putsxy(0, LCD_HEIGHT/2-h, buf);
lcd_bitmap(bitmap_icons_7x8[Icon_FastBackward],
LCD_WIDTH/2 - 16, LCD_HEIGHT/2 - 4, 7, 8, true);
@ -366,14 +388,14 @@ bool f2_rec_screen(void)
snprintf(buf, sizeof buf, "%s:", str(LANG_RECORDING_FREQUENCY));
lcd_getstringsize(buf,&w,&h);
lcd_putsxy((LCD_WIDTH-w)/2, LCD_HEIGHT - h*2, buf);
ptr = freq_str[recording_frequency];
ptr = freq_str[global_settings.rec_frequency];
lcd_getstringsize(ptr, &w, &h);
lcd_putsxy((LCD_WIDTH-w)/2, LCD_HEIGHT - h, ptr);
lcd_bitmap(bitmap_icons_7x8[Icon_DownArrow],
LCD_WIDTH/2 - 3, LCD_HEIGHT - h*3, 7, 8, true);
/* Channel mode */
switch ( recording_channel_mode ) {
switch ( global_settings.rec_channels ) {
case 0:
ptr = str(LANG_CHANNEL_STEREO);
break;
@ -383,9 +405,9 @@ bool f2_rec_screen(void)
break;
}
lcd_getstringsize(str(LANG_RECORDING_CHANNEL), &w, &h);
lcd_getstringsize(str(LANG_RECORDING_CHANNELS), &w, &h);
lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h*2,
str(LANG_RECORDING_CHANNEL));
str(LANG_RECORDING_CHANNELS));
lcd_getstringsize(str(LANG_F2_MODE), &w, &h);
lcd_putsxy(LCD_WIDTH - w, LCD_HEIGHT/2 - h, str(LANG_F2_MODE));
lcd_getstringsize(ptr, &w, &h);
@ -398,25 +420,25 @@ bool f2_rec_screen(void)
switch (button_get(true)) {
case BUTTON_LEFT:
case BUTTON_F2 | BUTTON_LEFT:
recording_quality++;
if(recording_quality > 7)
recording_quality = 0;
global_settings.rec_quality++;
if(global_settings.rec_quality > 7)
global_settings.rec_quality = 0;
used = true;
break;
case BUTTON_DOWN:
case BUTTON_F2 | BUTTON_DOWN:
recording_frequency++;
if(recording_frequency > 5)
recording_frequency = 0;
global_settings.rec_frequency++;
if(global_settings.rec_frequency > 5)
global_settings.rec_frequency = 0;
used = true;
break;
case BUTTON_RIGHT:
case BUTTON_F2 | BUTTON_RIGHT:
recording_channel_mode++;
if(recording_channel_mode > 1)
recording_channel_mode = 0;
global_settings.rec_channels++;
if(global_settings.rec_channels > 1)
global_settings.rec_channels = 0;
used = true;
break;
@ -436,27 +458,30 @@ bool f2_rec_screen(void)
}
}
mpeg_set_recording_options(recording_frequency, recording_quality,
recording_source, recording_channel_mode);
mpeg_set_recording_options(global_settings.rec_frequency,
global_settings.rec_quality,
global_settings.rec_source,
global_settings.rec_channels);
// settings_save();
set_gain();
settings_save();
lcd_setfont(FONT_UI);
return false;
}
char *src_str[] =
{
"Mic",
"Line In",
"Digital"
};
bool f3_rec_screen(void)
{
bool exit = false;
bool used = false;
int w, h;
char *src_str[] =
{
str(LANG_RECORDING_SRC_MIC),
str(LANG_RECORDING_SRC_LINE),
str(LANG_RECORDING_SRC_DIGITAL)
};
lcd_setfont(FONT_SYSFIXED);
lcd_getstringsize("A",&w,&h);
@ -469,7 +494,7 @@ bool f3_rec_screen(void)
/* Recording source */
lcd_putsxy(0, LCD_HEIGHT/2 - h*2, str(LANG_RECORDING_SOURCE));
ptr = src_str[recording_source];
ptr = src_str[global_settings.rec_source];
lcd_getstringsize(ptr, &w, &h);
lcd_putsxy(0, LCD_HEIGHT/2-h, ptr);
lcd_bitmap(bitmap_icons_7x8[Icon_FastBackward],
@ -480,25 +505,25 @@ bool f3_rec_screen(void)
switch (button_get(true)) {
case BUTTON_LEFT:
case BUTTON_F3 | BUTTON_LEFT:
recording_source++;
if(recording_source > 2)
recording_source = 0;
global_settings.rec_source++;
if(global_settings.rec_source > 2)
global_settings.rec_source = 0;
used = true;
break;
case BUTTON_DOWN:
case BUTTON_F3 | BUTTON_DOWN:
recording_frequency++;
if(recording_frequency > 5)
recording_frequency = 0;
global_settings.rec_frequency++;
if(global_settings.rec_frequency > 5)
global_settings.rec_frequency = 0;
used = true;
break;
case BUTTON_RIGHT:
case BUTTON_F3 | BUTTON_RIGHT:
recording_channel_mode++;
if(recording_channel_mode > 1)
recording_channel_mode = 0;
global_settings.rec_channels++;
if(global_settings.rec_channels > 1)
global_settings.rec_channels = 0;
used = true;
break;
@ -518,10 +543,14 @@ bool f3_rec_screen(void)
}
}
mpeg_set_recording_options(recording_frequency, recording_quality,
recording_source, recording_channel_mode);
mpeg_set_recording_options(global_settings.rec_frequency,
global_settings.rec_quality,
global_settings.rec_source,
global_settings.rec_channels);
// settings_save();
set_gain();
settings_save();
lcd_setfont(FONT_UI);
return false;

View file

@ -99,13 +99,15 @@ offset abs
peak_meter_dbfs (bit 7)
0x1f 0x33 <peak meter min either in -db or in percent>
0x20 0x34 <peak meter max either in -db or in percent>
0x21 0x35 <repeat mode>
0x21 0x35 <repeat mode (bit 0-1), rec. channels (bit 2),
mic gain (bit 4-7)>
0x22 0x36 <rec. quality (bit 0-2), source (bit 3-4), frequency (bit 5-7)>
0x23 0x37 <rec. left gain (bit 0-3)>
0x24 0x38 <rec. right gain (bit 0-3)>
<all unused space filled with 0xff>
the geeky but useless statistics part:
0x24 <total uptime in seconds: 32 bits uint, actually unused for now>
0x2a <checksum 2 bytes: xor of 0x0-0x29>
Config memory is reset to 0xff and initialized with 'factory defaults' if
@ -329,9 +331,16 @@ int settings_save( void )
(global_settings.peak_meter_dbfs ? 0x80 : 0);
config_block[0x1f] = (unsigned char)global_settings.peak_meter_min;
config_block[0x20] = (unsigned char)global_settings.peak_meter_max;
config_block[0x21] = (unsigned char)global_settings.repeat_mode;
memcpy(&config_block[0x24], &global_settings.total_uptime, 4);
config_block[0x21] = (unsigned char)
((global_settings.repeat_mode & 3) |
((global_settings.rec_channels & 1) << 2) |
((global_settings.rec_mic_gain & 0x0f) << 3));
config_block[0x22] = (unsigned char)
((global_settings.rec_quality & 7) |
((global_settings.rec_source & 1) << 3) |
((global_settings.rec_frequency & 7) << 5));
config_block[0x23] = (unsigned char)global_settings.rec_left_gain;
config_block[0x24] = (unsigned char)global_settings.rec_right_gain;
strncpy(&config_block[0xb8], global_settings.wps_file, MAX_FILENAME);
strncpy(&config_block[0xcc], global_settings.lang_file, MAX_FILENAME);
@ -565,10 +574,24 @@ void settings_load(void)
global_settings.peak_meter_max = config_block[0x20];
if (config_block[0x21] != 0xFF)
global_settings.repeat_mode = config_block[0x21];
{
global_settings.repeat_mode = config_block[0x21] & 3;
global_settings.rec_channels = (config_block[0x21] >> 2) & 1;
global_settings.rec_mic_gain = (config_block[0x21] >> 4) & 0x0f;
}
if (config_block[0x22] != 0xFF)
{
global_settings.rec_quality = config_block[0x22] & 7;
global_settings.rec_source = (config_block[0x22] >> 3) & 3;
global_settings.rec_frequency = (config_block[0x22] >> 5) & 7;
}
if (config_block[0x23] != 0xFF)
global_settings.rec_left_gain = config_block[0x23] & 0x0f;
if (config_block[0x24] != 0xFF)
memcpy(&global_settings.total_uptime, &config_block[0x24], 4);
global_settings.rec_right_gain = config_block[0x24] & 0x0f;
memcpy(&global_settings.resume_first_index, &config_block[0xF4], 4);
memcpy(&global_settings.resume_seed, &config_block[0xF8], 4);
@ -731,6 +754,13 @@ void settings_reset(void) {
global_settings.bass_boost = mpeg_sound_default(SOUND_SUPERBASS);
global_settings.avc = mpeg_sound_default(SOUND_AVC);
global_settings.channel_config = mpeg_sound_default(SOUND_CHANNELS);
global_settings.rec_quality = 5;
global_settings.rec_source = 0; /* 0=mic */
global_settings.rec_frequency = 0; /* 0=44.1kHz */
global_settings.rec_channels = 0; /* 0=Stereo */
global_settings.rec_mic_gain = 8;
global_settings.rec_left_gain = 2; /* 0dB */
global_settings.rec_right_gain = 2; /* 0dB */
global_settings.resume = RESUME_ASK;
global_settings.contrast = DEFAULT_CONTRAST_SETTING;
global_settings.poweroff = DEFAULT_POWEROFF_SETTING;
@ -744,7 +774,6 @@ void settings_reset(void) {
global_settings.repeat_mode = REPEAT_ALL;
global_settings.playlist_shuffle = false;
global_settings.discharge = 0;
global_settings.total_uptime = 0;
global_settings.timeformat = 0;
global_settings.volume_type = 0;
global_settings.battery_type = 0;

View file

@ -61,12 +61,27 @@ struct user_settings
int bass_boost; /* bass boost eq: 0-100 0=off 100=max */
int avc; /* auto volume correct: 0=disable, 1=2s 2=4s 3=8s */
int channel_config; /* Stereo, Mono, Mono left, Mono right */
int rec_quality; /* 0-7 */
int rec_source; /* 0=mic, 1=line, 2=S/PDIF */
int rec_frequency; /* 0 = 44.1kHz
1 = 48kHz
2 = 32kHz
3 = 22.05kHz
4 = 24kHz
5 = 16kHz */
int rec_channels; /* 0=Stereo, 1=Mono */
int rec_mic_gain; /* 0-15 */
int rec_left_gain; /* 0-15 */
int rec_right_gain; /* 0-15 */
/* device settings */
int contrast; /* lcd contrast: 0-100 0=low 100=high */
int poweroff; /* power off timer */
int backlight_timeout; /* backlight off timeout: 0-18 0=never,1=always,then according to timeout_values[] */
int backlight_timeout; /* backlight off timeout: 0-18 0=never,
1=always,
then according to timeout_values[] */
bool backlight_on_when_charging;
bool discharge; /* maintain charge of at least: false = 90%, true = 10% */
@ -115,8 +130,6 @@ struct user_settings
bool browse_current; /* 1=goto current song,
0=goto previous location */
/* geeky persistent statistics */
unsigned int total_uptime; /* total uptime since rockbox was first booted */
};
/* prototypes */

View file

@ -183,7 +183,42 @@ static bool avc(void)
return set_option(str(LANG_DECAY), &global_settings.avc,
names, 4, set_avc);
}
#endif /* ARCHOS_RECORDER */
static bool recsource(void)
{
char *names[] = {str(LANG_RECORDING_SRC_MIC), str(LANG_RECORDING_SRC_LINE),
str(LANG_RECORDING_SRC_DIGITAL) };
return set_option(str(LANG_RECORDING_SOURCE),
&global_settings.rec_source,
names, 3, NULL );
}
static bool recfrequency(void)
{
char *names[] = {"44.1kHz", "48kHz", "32kHz",
"22.05kHz", "24kHz", "16kHz"};
return set_option(str(LANG_RECORDING_FREQUENCY),
&global_settings.rec_frequency,
names, 6, NULL );
}
static bool recchannels(void)
{
char *names[] = {str(LANG_CHANNEL_STEREO), str(LANG_CHANNEL_MONO)};
return set_option(str(LANG_RECORDING_CHANNELS),
&global_settings.rec_channels,
names, 2, NULL );
}
static bool recquality(void)
{
return set_int(str(LANG_RECORDING_QUALITY), "",
&global_settings.rec_quality,
NULL, 1, 0, 7 );
}
#endif /* HAVE_MAS3587F */
static void set_chanconf(int val)
{
@ -221,3 +256,23 @@ bool sound_menu(void)
return result;
}
#ifdef HAVE_MAS3587F
bool recording_menu(void)
{
int m;
bool result;
struct menu_items items[] = {
{ str(LANG_RECORDING_QUALITY), recquality },
{ str(LANG_RECORDING_FREQUENCY), recfrequency },
{ str(LANG_RECORDING_SOURCE), recsource },
{ str(LANG_RECORDING_CHANNELS), recchannels },
};
m=menu_init( items, sizeof items / sizeof(struct menu_items) );
result = menu_run(m);
menu_exit(m);
return result;
}
#endif

View file

@ -22,5 +22,6 @@
#include "menu.h"
bool sound_menu(void);
bool recording_menu(void);
#endif