Second step of the voice-UI: Option values are spoken, if they are translatable strings.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4383 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jörg Hohensohn 2004-03-15 08:27:51 +00:00
parent 38ac78ae97
commit 42ffbf9bbc
7 changed files with 299 additions and 127 deletions

View file

@ -28,9 +28,6 @@ struct menu_items {
bool (*function) (void); /* return true if USB was connected */
};
/* convenience macro to have both string and ID as arguments */
#define STR(id) str(id), id
int menu_init(struct menu_items* items, int count, int (*callback) (int keycode, int menu));
void menu_exit(int menu);

View file

@ -50,9 +50,11 @@ static bool save_playlist(void)
static bool recurse_directory(void)
{
char* names[] = { str(LANG_OFF),
str(LANG_ON),
str(LANG_RESUME_SETTING_ASK) };
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ STR(LANG_ON) },
{ STR(LANG_RESUME_SETTING_ASK)},
};
return set_option( str(LANG_RECURSE_DIRECTORY),
&global_settings.recursive_dir_insert, INT, names, 3,

View file

@ -792,9 +792,9 @@ static bool show_indices(void)
/* How to display a track */
static bool track_display(void)
{
char* names[] = {
str(LANG_DISPLAY_TRACK_NAME_ONLY),
str(LANG_DISPLAY_FULL_PATH)
struct opt_items names[] = {
{ STR(LANG_DISPLAY_TRACK_NAME_ONLY) },
{ STR(LANG_DISPLAY_FULL_PATH) }
};
return set_option(str(LANG_TRACK_DISPLAY),

View file

@ -32,6 +32,7 @@
#include "lcd.h"
#include "mpeg.h"
#include "mp3_playback.h"
#include "talk.h"
#include "string.h"
#include "ata.h"
#include "fat.h"
@ -1643,8 +1644,10 @@ void settings_reset(void) {
bool set_bool(char* string, bool* variable )
{
return set_bool_options(string, variable, str(LANG_SET_BOOL_YES),
str(LANG_SET_BOOL_NO), NULL);
return set_bool_options(string, variable,
STR(LANG_SET_BOOL_YES),
STR(LANG_SET_BOOL_NO),
NULL);
}
/* wrapper to convert from int param to bool param in set_option */
@ -1658,9 +1661,11 @@ void bool_funcwrapper(int value)
}
bool set_bool_options(char* string, bool* variable,
char* yes_str, char* no_str, void (*function)(bool))
char* yes_str, int yes_voice,
char* no_str, int no_voice,
void (*function)(bool))
{
char* names[] = { no_str, yes_str };
struct opt_items names[] = { {no_str, no_voice}, {yes_str, yes_voice} };
bool result;
boolfunction = function;
@ -1775,13 +1780,14 @@ bool set_int(char* string,
code. */
bool set_option(char* string, void* variable, enum optiontype type,
char* options[], int numoptions, void (*function)(int))
struct opt_items* options, int numoptions, void (*function)(int))
{
bool done = false;
int button;
int* intvar = (int*)variable;
bool* boolvar = (bool*)variable;
int oldval = 0;
int index, oldindex = -1; /* remember what we said */
if (type==INT)
oldval=*intvar;
@ -1799,7 +1805,13 @@ bool set_option(char* string, void* variable, enum optiontype type,
lcd_puts_scroll(0, 0, string);
while ( !done ) {
lcd_puts(0, 1, options[type==INT ? *intvar : (int)*boolvar]);
index = type==INT ? *intvar : (int)*boolvar;
lcd_puts(0, 1, options[index].string);
if (index != oldindex)
{
talk_id(options[index].voice_id, false);
oldindex = index;
}
#ifdef HAVE_LCD_BITMAP
status_draw(true);
#endif

View file

@ -60,6 +60,9 @@
#define FF_REWIND_45000 12
#define FF_REWIND_60000 13
/* convenience macro to have both string and ID as arguments */
#define STR(id) str(id), id
struct user_settings
{
@ -203,6 +206,11 @@ struct user_settings
enum optiontype { INT, BOOL };
struct opt_items {
char* string;
int voice_id;
};
/* prototypes */
int settings_save(void);
@ -215,11 +223,13 @@ void settings_display(void);
bool settings_load_config(char* file);
bool settings_save_config(void);
bool set_bool_options(char* string, bool* variable,
char* yes_str, char* no_str, void (*function)(bool));
char* yes_str, int yes_voice,
char* no_str, int no_voice,
void (*function)(bool));
bool set_bool(char* string, bool* variable );
bool set_option(char* string, void* variable, enum optiontype type,
char* options[], int numoptions, void (*function)(int));
struct opt_items* options, int numoptions, void (*function)(int));
bool set_int(char* string, char* unit, int* variable,
void (*function)(int), int step, int min, int max );
bool set_time(char* string, int timedate[]);

View file

@ -55,8 +55,8 @@ static bool car_adapter_mode(void)
{
return set_bool_options( str(LANG_CAR_ADAPTER_MODE),
&global_settings.car_adapter_mode,
str(LANG_SET_BOOL_YES),
str(LANG_SET_BOOL_NO),
STR(LANG_SET_BOOL_YES),
STR(LANG_SET_BOOL_NO),
set_car_adapter_mode);
}
@ -92,8 +92,8 @@ static bool invert(void)
{
bool rc = set_bool_options(str(LANG_INVERT),
&global_settings.invert,
str(LANG_INVERT_LCD_INVERSE),
str(LANG_INVERT_LCD_NORMAL),
STR(LANG_INVERT_LCD_INVERSE),
STR(LANG_INVERT_LCD_NORMAL),
lcd_set_invert_display);
return rc;
}
@ -105,8 +105,8 @@ static bool invert_cursor(void)
{
return set_bool_options(str(LANG_INVERT_CURSOR),
&global_settings.invert_cursor,
str(LANG_INVERT_CURSOR_BAR),
str(LANG_INVERT_CURSOR_POINTER),
STR(LANG_INVERT_CURSOR_BAR),
STR(LANG_INVERT_CURSOR_POINTER),
NULL);
}
@ -129,9 +129,10 @@ static bool flip_display(void)
*/
static bool battery_type(void)
{
char* names[] = { str(LANG_DISPLAY_GRAPHIC),
str(LANG_DISPLAY_NUMERIC) };
struct opt_items names[] = {
{ STR(LANG_DISPLAY_GRAPHIC) },
{ STR(LANG_DISPLAY_NUMERIC) }
};
return set_option( str(LANG_BATTERY_DISPLAY),
&global_settings.battery_type, INT, names, 2, NULL);
}
@ -141,9 +142,10 @@ static bool battery_type(void)
*/
static bool volume_type(void)
{
char* names[] = { str(LANG_DISPLAY_GRAPHIC),
str(LANG_DISPLAY_NUMERIC) };
struct opt_items names[] = {
{ STR(LANG_DISPLAY_GRAPHIC) },
{ STR(LANG_DISPLAY_NUMERIC) }
};
return set_option( str(LANG_VOLUME_DISPLAY), &global_settings.volume_type,
INT, names, 2, NULL);
}
@ -163,11 +165,25 @@ static bool peak_meter_fps_menu(void) {
*/
static bool peak_meter_hold(void) {
bool retval = false;
char* names[] = { str(LANG_OFF),
"200 ms ", "300 ms ", "500 ms ", "1 s ", "2 s ",
"3 s ", "4 s ", "5 s ", "6 s ", "7 s",
"8 s", "9 s", "10 s", "15 s", "20 s",
"30 s", "1 min"
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ "200 ms " , -1 },
{ "300 ms " , -1 },
{ "500 ms " , -1 },
{ "1 s " , -1 },
{ "2 s " , -1 },
{ "3 s " , -1 },
{ "4 s " , -1 },
{ "5 s " , -1 },
{ "6 s " , -1 },
{ "7 s" , -1 },
{ "8 s" , -1 },
{ "9 s" , -1 },
{ "10 s" , -1 },
{ "15 s" , -1 },
{ "20 s" , -1 },
{ "30 s" , -1 },
{ "1 min" , -1 }
};
retval = set_option( str(LANG_PM_PEAK_HOLD),
&global_settings.peak_meter_hold, INT, names,
@ -186,14 +202,33 @@ static bool peak_meter_hold(void) {
static bool peak_meter_clip_hold(void) {
bool retval = false;
char* names[] = { str(LANG_PM_ETERNAL),
"1s ", "2s ", "3s ", "4s ", "5s ",
"6s ", "7s ", "8s ", "9s ", "10s",
"15s", "20s", "25s", "30s", "45s",
"60s", "90s", "2min", "3min", "5min",
"10min", "20min", "45min", "90min"
struct opt_items names[] = {
{ STR(LANG_PM_ETERNAL) },
{ "1s " , -1 },
{ "2s " , -1 },
{ "3s " , -1 },
{ "4s " , -1 },
{ "5s " , -1 },
{ "6s " , -1 },
{ "7s " , -1 },
{ "8s " , -1 },
{ "9s " , -1 },
{ "10s" , -1 },
{ "15s" , -1 },
{ "20s" , -1 },
{ "25s" , -1 },
{ "30s" , -1 },
{ "45s" , -1 },
{ "60s" , -1 },
{ "90s" , -1 },
{ "2min" , -1 },
{ "3min" , -1 },
{ "5min" , -1 },
{ "10min" , -1 },
{ "20min" , -1 },
{ "45min" , -1 },
{ "90min" , -1 }
};
retval = set_option( str(LANG_PM_CLIP_HOLD),
&global_settings.peak_meter_clip_hold, INT, names,
25, peak_meter_set_clip_hold);
@ -235,7 +270,7 @@ static bool peak_meter_scale(void) {
bool use_dbfs = global_settings.peak_meter_dbfs;
retval = set_bool_options(str(LANG_PM_SCALE),
&use_dbfs,
str(LANG_PM_DBFS), str(LANG_PM_LINEAR),
STR(LANG_PM_DBFS), STR(LANG_PM_LINEAR),
NULL);
/* has the user really changed the scale? */
@ -348,7 +383,7 @@ static bool peak_meter_performance(void) {
bool retval = false;
retval = set_bool_options(str(LANG_PM_PERFORMANCE),
&global_settings.peak_meter_performance,
str(LANG_PM_HIGH_PERFORMANCE), str(LANG_PM_ENERGY_SAVER),
STR(LANG_PM_HIGH_PERFORMANCE), STR(LANG_PM_ENERGY_SAVER),
NULL);
if (global_settings.peak_meter_performance) {
@ -395,10 +430,11 @@ static bool shuffle(void)
static bool repeat_mode(void)
{
bool result;
char* names[] = { str(LANG_OFF),
str(LANG_REPEAT_ALL),
str(LANG_REPEAT_ONE) };
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ STR(LANG_REPEAT_ALL) },
{ STR(LANG_REPEAT_ONE) }
};
int old_repeat = global_settings.repeat_mode;
result = set_option( str(LANG_REPEAT), &global_settings.repeat_mode,
@ -417,11 +453,12 @@ static bool play_selected(void)
static bool dir_filter(void)
{
char* names[] = { str(LANG_FILTER_ALL),
str(LANG_FILTER_SUPPORTED),
str(LANG_FILTER_MUSIC),
str(LANG_FILTER_PLAYLIST) };
struct opt_items names[] = {
{ STR(LANG_FILTER_ALL) },
{ STR(LANG_FILTER_SUPPORTED) },
{ STR(LANG_FILTER_MUSIC) },
{ STR(LANG_FILTER_PLAYLIST) }
};
return set_option( str(LANG_FILTER), &global_settings.dirfilter, INT,
names, 4, NULL );
}
@ -433,23 +470,25 @@ static bool sort_case(void)
static bool resume(void)
{
char* names[] = { str(LANG_SET_BOOL_NO),
str(LANG_RESUME_SETTING_ASK),
str(LANG_RESUME_SETTING_ASK_ONCE),
str(LANG_SET_BOOL_YES) };
struct opt_items names[] = {
{ STR(LANG_SET_BOOL_NO) },
{ STR(LANG_RESUME_SETTING_ASK) },
{ STR(LANG_RESUME_SETTING_ASK_ONCE) },
{ STR(LANG_SET_BOOL_YES) }
};
return set_option( str(LANG_RESUME), &global_settings.resume, INT,
names, 4, NULL );
}
static bool autocreatebookmark(void)
{
char* names[] = { str(LANG_SET_BOOL_NO),
str(LANG_SET_BOOL_YES),
str(LANG_RESUME_SETTING_ASK),
str(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_YES),
str(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_ASK) };
struct opt_items names[] = {
{ STR(LANG_SET_BOOL_NO) },
{ STR(LANG_SET_BOOL_YES) },
{ STR(LANG_RESUME_SETTING_ASK) },
{ STR(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_YES) },
{ STR(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_ASK) }
};
return set_option( str(LANG_BOOKMARK_SETTINGS_AUTOCREATE),
&global_settings.autocreatebookmark, INT,
names, 5, NULL );
@ -457,10 +496,11 @@ static bool autocreatebookmark(void)
static bool autoloadbookmark(void)
{
char* names[] = { str(LANG_SET_BOOL_NO),
str(LANG_SET_BOOL_YES),
str(LANG_RESUME_SETTING_ASK) };
struct opt_items names[] = {
{ STR(LANG_SET_BOOL_NO) },
{ STR(LANG_SET_BOOL_YES) },
{ STR(LANG_RESUME_SETTING_ASK) }
};
return set_option( str(LANG_BOOKMARK_SETTINGS_AUTOLOAD),
&global_settings.autoloadbookmark, INT,
names, 3, NULL );
@ -468,10 +508,11 @@ static bool autoloadbookmark(void)
static bool useMRB(void)
{
char* names[] = { str(LANG_SET_BOOL_NO),
str(LANG_SET_BOOL_YES),
str(LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY)};
struct opt_items names[] = {
{ STR(LANG_SET_BOOL_NO) },
{ STR(LANG_SET_BOOL_YES) },
{ STR(LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY) }
};
return set_option( str(LANG_BOOKMARK_SETTINGS_MAINTAIN_RECENT_BOOKMARKS),
&global_settings.usemrb, INT,
names, 3, NULL );
@ -486,23 +527,50 @@ static bool backlight_on_when_charging(void)
static bool backlight_timer(void)
{
char* names[] = { str(LANG_OFF), str(LANG_ON),
"1s ", "2s ", "3s ", "4s ", "5s ",
"6s ", "7s ", "8s ", "9s ", "10s",
"15s", "20s", "25s", "30s", "45s",
"60s", "90s"};
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ STR(LANG_ON) },
{ "1s ", -1 },
{ "2s ", -1 },
{ "3s ", -1 },
{ "4s ", -1 },
{ "5s ", -1 },
{ "6s ", -1 },
{ "7s ", -1 },
{ "8s ", -1 },
{ "9s ", -1 },
{ "10s", -1 },
{ "15s", -1 },
{ "20s", -1 },
{ "25s", -1 },
{ "30s", -1 },
{ "45s", -1 },
{ "60s", -1 },
{ "90s", -1 }
};
return set_option(str(LANG_BACKLIGHT), &global_settings.backlight_timeout,
INT, names, 19, backlight_set_timeout );
}
static bool poweroff_idle_timer(void)
{
char* names[] = { str(LANG_OFF),
"1m ", "2m ", "3m ", "4m ", "5m ",
"6m ", "7m ", "8m ", "9m ", "10m",
"15m", "30m", "45m", "60m"};
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ "1m ", -1 },
{ "2m ", -1 },
{ "3m ", -1 },
{ "4m ", -1 },
{ "5m ", -1 },
{ "6m ", -1 },
{ "7m ", -1 },
{ "8m ", -1 },
{ "9m ", -1 },
{ "10m", -1 },
{ "15m", -1 },
{ "30m", -1 },
{ "45m", -1 },
{ "60m", -1 }
};
return set_option(str(LANG_POWEROFF_IDLE), &global_settings.poweroff,
INT, names, 15, set_poweroff_timeout);
}
@ -541,8 +609,14 @@ static bool bidir_limit(void)
#ifdef HAVE_LCD_CHARCELLS
static bool jump_scroll(void)
{
char* names[] = { str(LANG_OFF), str(LANG_ONE_TIME), "2",
"3", "4", str(LANG_ALWAYS)};
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ STR(LANG_ONE_TIME) },
{ "2", -1 },
{ "3", -1 },
{ "4", -1 },
{ STR(LANG_ALWAYS) }
};
bool ret;
ret=set_option(str(LANG_JUMP_SCROLL), &global_settings.jump_scroll,
INT, names, 6, lcd_jump_scroll);
@ -667,9 +741,10 @@ static bool timedate_set(void)
static bool timeformat_set(void)
{
char* names[] = { str(LANG_24_HOUR_CLOCK),
str(LANG_12_HOUR_CLOCK) };
struct opt_items names[] = {
{ STR(LANG_24_HOUR_CLOCK) },
{ STR(LANG_12_HOUR_CLOCK) }
};
return set_option(str(LANG_TIMEFORMAT), &global_settings.timeformat,
INT, names, 2, NULL);
}
@ -722,11 +797,22 @@ static bool buffer_margin(void)
static bool ff_rewind_min_step(void)
{
char* names[] = { "1s", "2s", "3s", "4s",
"5s", "6s", "8s", "10s",
"15s", "20s", "25s", "30s",
"45s", "60s" };
struct opt_items names[] = {
{ "1s", -1 },
{ "2s", -1 },
{ "3s", -1 },
{ "4s", -1 },
{ "5s", -1 },
{ "6s", -1 },
{ "8s", -1 },
{ "10s", -1 },
{ "15s", -1 },
{ "20s", -1 },
{ "25s", -1 },
{ "30s", -1 },
{ "45s", -1 },
{ "60s", -1 }
};
return set_option(str(LANG_FFRW_STEP), &global_settings.ff_rewind_min_step,
INT, names, 14, NULL );
}
@ -739,11 +825,24 @@ static bool set_fade_on_stop(void)
static bool ff_rewind_accel(void)
{
char* names[] = { str(LANG_OFF), "2x/1s", "2x/2s", "2x/3s",
"2x/4s", "2x/5s", "2x/6s", "2x/7s",
"2x/8s", "2x/9s", "2x/10s", "2x/11s",
"2x/12s", "2x/13s", "2x/14s", "2x/15s", };
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ "2x/1s", -1 },
{ "2x/2s", -1 },
{ "2x/3s", -1 },
{ "2x/4s", -1 },
{ "2x/5s", -1 },
{ "2x/6s", -1 },
{ "2x/7s", -1 },
{ "2x/8s", -1 },
{ "2x/9s", -1 },
{ "2x/10s", -1 },
{ "2x/11s", -1 },
{ "2x/12s", -1 },
{ "2x/13s", -1 },
{ "2x/14s", -1 },
{ "2x/15s", -1 }
};
return set_option(str(LANG_FFRW_ACCEL), &global_settings.ff_rewind_accel,
INT, names, 16, NULL );
}

View file

@ -181,15 +181,23 @@ static void set_avc(int val)
static bool avc(void)
{
char* names[] = { str(LANG_OFF), "2s", "4s", "8s" };
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ "2s", -1 },
{ "4s", -1 },
{ "8s", -1 }
};
return set_option(str(LANG_DECAY), &global_settings.avc, INT,
names, 4, set_avc);
}
static bool recsource(void)
{
char *names[] = {str(LANG_RECORDING_SRC_MIC), str(LANG_RECORDING_SRC_LINE),
str(LANG_RECORDING_SRC_DIGITAL) };
struct opt_items 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, INT,
names, 3, NULL );
@ -197,9 +205,14 @@ static bool recsource(void)
static bool recfrequency(void)
{
char *names[] = {"44.1kHz", "48kHz", "32kHz",
"22.05kHz", "24kHz", "16kHz"};
struct opt_items names[] = {
{ "44.1kHz", -1 },
{ "48kHz", -1 },
{ "32kHz", -1 },
{ "22.05kHz", -1 },
{ "24kHz", -1 },
{ "16kHz", -1 }
};
return set_option(str(LANG_RECORDING_FREQUENCY),
&global_settings.rec_frequency, INT,
names, 6, NULL );
@ -207,8 +220,10 @@ static bool recfrequency(void)
static bool recchannels(void)
{
char *names[] = {str(LANG_CHANNEL_STEREO), str(LANG_CHANNEL_MONO)};
struct opt_items names[] = {
{ STR(LANG_CHANNEL_STEREO) },
{ STR(LANG_CHANNEL_MONO) }
};
return set_option(str(LANG_RECORDING_CHANNELS),
&global_settings.rec_channels, INT,
names, 2, NULL );
@ -229,13 +244,22 @@ static bool receditable(void)
static bool rectimesplit(void)
{
char *names[] = {
str(LANG_OFF), "00:05","00:10","00:15",
"00:30","01:00","02:00","04:00",
"06:00","08:00","10:00","12:00",
"18:00","24:00"
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ "00:05" , -1 },
{ "00:10" , -1 },
{ "00:15" , -1 },
{ "00:30" , -1 },
{ "01:00" , -1 },
{ "02:00" , -1 },
{ "04:00" , -1 },
{ "06:00" , -1 },
{ "08:00" , -1 },
{ "10:00" , -1 },
{ "12:00" , -1 },
{ "18:00" , -1 },
{ "24:00" , -1 }
};
return set_option(str(LANG_RECORD_TIMESPLIT),
&global_settings.rec_timesplit, INT,
names, 14, NULL );
@ -243,13 +267,39 @@ static bool rectimesplit(void)
static bool recprerecord(void)
{
char *names[] = {
str(LANG_OFF),"1s","2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s",
"10s", "11s", "12s", "13s", "14s", "15s", "16s", "17s", "18s", "19s",
"20s", "21s", "22s", "23s", "24s", "25s", "26s", "27s", "28s", "29s",
"30s"
struct opt_items names[] = {
{ STR(LANG_OFF) },
{ "1s", -1 },
{ "2s", -1 },
{ "3s", -1 },
{ "4s", -1 },
{ "5s", -1 },
{ "6s", -1 },
{ "7s", -1 },
{ "8s", -1 },
{ "9s", -1 },
{ "10s", -1 },
{ "11s", -1 },
{ "12s", -1 },
{ "13s", -1 },
{ "14s", -1 },
{ "15s", -1 },
{ "16s", -1 },
{ "17s", -1 },
{ "18s", -1 },
{ "19s", -1 },
{ "10s", -1 },
{ "21s", -1 },
{ "22s", -1 },
{ "23s", -1 },
{ "24s", -1 },
{ "25s", -1 },
{ "26s", -1 },
{ "27s", -1 },
{ "28s", -1 },
{ "29s", -1 },
{ "30s", -1 }
};
return set_option(str(LANG_RECORD_PRERECORD_TIME),
&global_settings.rec_prerecord_time, INT,
names, 31, NULL );
@ -257,10 +307,10 @@ static bool recprerecord(void)
static bool recdirectory(void)
{
char *names[] = {
rec_base_directory, str(LANG_RECORD_CURRENT_DIR)
struct opt_items names[] = {
{ rec_base_directory, -1 },
{ STR(LANG_RECORD_CURRENT_DIR) }
};
return set_option(str(LANG_RECORD_DIRECTORY),
&global_settings.rec_directory, INT,
names, 2, NULL );
@ -275,16 +325,18 @@ static void set_chanconf(int val)
static bool chanconf(void)
{
char *names[] = {
str(LANG_CHANNEL_STEREO),
struct opt_items names[] = {
{ STR(LANG_CHANNEL_STEREO) },
#ifdef HAVE_LCD_CHARCELLS
str(LANG_CHANNEL_STEREO_NARROW_PLAYER),
{ STR(LANG_CHANNEL_STEREO_NARROW_PLAYER) },
#else
str(LANG_CHANNEL_STEREO_NARROW_RECORDER),
{ STR(LANG_CHANNEL_STEREO_NARROW_RECORDER) },
#endif
str(LANG_CHANNEL_MONO),
str(LANG_CHANNEL_LEFT), str(LANG_CHANNEL_RIGHT),
str(LANG_CHANNEL_KARAOKE), str(LANG_CHANNEL_STEREO_WIDE)
{ STR(LANG_CHANNEL_MONO) },
{ STR(LANG_CHANNEL_LEFT) },
{ STR(LANG_CHANNEL_RIGHT) },
{ STR(LANG_CHANNEL_KARAOKE) },
{ STR(LANG_CHANNEL_STEREO_WIDE) }
};
return set_option(str(LANG_CHANNEL), &global_settings.channel_config, INT,
names, 7, set_chanconf );