Convert the sound menu to the new system
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12230 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
e645e2dcf2
commit
fe3cfcc9b2
7 changed files with 301 additions and 358 deletions
71
apps/menu.c
71
apps/menu.c
|
@ -43,6 +43,7 @@
|
|||
#include "misc.h"
|
||||
#include "action.h"
|
||||
#include "menus/exported_menus.h"
|
||||
#include "string.h"
|
||||
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
#include "icons.h"
|
||||
|
@ -370,11 +371,12 @@ static int current_subitems[MAX_MENU_SUBITEMS];
|
|||
static int current_subitems_count = 0;
|
||||
|
||||
void get_menu_callback(const struct menu_item_ex *m,
|
||||
menu_callback_type menu_callback)
|
||||
menu_callback_type *menu_callback)
|
||||
{
|
||||
if (m->flags&MENU_HAS_DESC)
|
||||
menu_callback= m->callback_and_desc->menu_callback;
|
||||
else menu_callback = m->menu_callback;
|
||||
*menu_callback= m->callback_and_desc->menu_callback;
|
||||
else
|
||||
*menu_callback = m->menu_callback;
|
||||
}
|
||||
|
||||
static int get_menu_selection(int selected_item, const struct menu_item_ex *menu)
|
||||
|
@ -403,7 +405,7 @@ static char * get_menu_item_name(int selected_item,void * data, char *buffer)
|
|||
if (type == MT_SETTING)
|
||||
{
|
||||
const struct settings_list *v
|
||||
= find_setting(menu->variable);
|
||||
= find_setting(menu->variable, NULL);
|
||||
if (v)
|
||||
return str(v->lang_id);
|
||||
else return "Not Done yet!";
|
||||
|
@ -419,7 +421,7 @@ static void init_menu_lists(const struct menu_item_ex *menu,
|
|||
current_subitems_count = 0;
|
||||
for (i=0; i<count; i++)
|
||||
{
|
||||
get_menu_callback(menu->submenus[i],menu_callback);
|
||||
get_menu_callback(menu->submenus[i],&menu_callback);
|
||||
if (menu_callback)
|
||||
{
|
||||
if (menu_callback(ACTION_REQUEST_MENUITEM,menu->submenus[i])
|
||||
|
@ -443,7 +445,7 @@ static void init_menu_lists(const struct menu_item_ex *menu,
|
|||
gui_synclist_limit_scroll(lists,true);
|
||||
gui_synclist_select_item(lists, selected);
|
||||
|
||||
get_menu_callback(menu,menu_callback);
|
||||
get_menu_callback(menu,&menu_callback);
|
||||
if (callback && menu_callback)
|
||||
menu_callback(ACTION_ENTER_MENUITEM,menu);
|
||||
}
|
||||
|
@ -505,7 +507,7 @@ int do_menu(const struct menu_item_ex *start_menu)
|
|||
continue;
|
||||
}
|
||||
|
||||
get_menu_callback(menu,menu_callback);
|
||||
get_menu_callback(menu,&menu_callback);
|
||||
if (menu_callback)
|
||||
{
|
||||
action = menu_callback(action,menu);
|
||||
|
@ -526,7 +528,7 @@ int do_menu(const struct menu_item_ex *start_menu)
|
|||
in_stringlist = false;
|
||||
if (stack_top > 0)
|
||||
{
|
||||
get_menu_callback(menu,menu_callback);
|
||||
get_menu_callback(menu,&menu_callback);
|
||||
if (menu_callback)
|
||||
{
|
||||
if (menu_callback(action,menu) ==
|
||||
|
@ -551,8 +553,9 @@ int do_menu(const struct menu_item_ex *start_menu)
|
|||
temp = menu->submenus[selected];
|
||||
if (in_stringlist)
|
||||
type = (menu->flags&MENU_TYPE_MASK);
|
||||
else type = (temp->flags&MENU_TYPE_MASK);
|
||||
get_menu_callback(temp,menu_callback);
|
||||
else
|
||||
type = (temp->flags&MENU_TYPE_MASK);
|
||||
get_menu_callback(temp, &menu_callback);
|
||||
if (menu_callback)
|
||||
{
|
||||
action = menu_callback(ACTION_ENTER_MENUITEM,temp);
|
||||
|
@ -584,8 +587,10 @@ int do_menu(const struct menu_item_ex *start_menu)
|
|||
break;
|
||||
case MT_SETTING:
|
||||
{
|
||||
int setting_id;
|
||||
const struct settings_list *setting = find_setting(
|
||||
temp->variable);
|
||||
temp->variable,
|
||||
&setting_id);
|
||||
if (setting)
|
||||
{
|
||||
if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING)
|
||||
|
@ -624,11 +629,10 @@ int do_menu(const struct menu_item_ex *start_menu)
|
|||
{
|
||||
var = (int*)setting->setting;
|
||||
}
|
||||
DEBUGF("%x\n",setting->flags);
|
||||
if (setting->flags&F_INT_SETTING)
|
||||
{DEBUGF("boo");
|
||||
{
|
||||
set_int(str(setting->lang_id),
|
||||
str(setting->int_setting->unit),
|
||||
NULL,
|
||||
setting->int_setting->unit,var,
|
||||
setting->int_setting->option_callback,
|
||||
setting->int_setting->step,
|
||||
|
@ -639,18 +643,41 @@ int do_menu(const struct menu_item_ex *start_menu)
|
|||
else if (setting->flags&F_CHOICE_SETTING)
|
||||
{
|
||||
static struct opt_items options[MAX_OPTIONS];
|
||||
static char buffer[1024];
|
||||
char *buf_start = buffer;
|
||||
int buf_free = 1024;
|
||||
int i,j, count = setting->choice_setting->count;
|
||||
for (i=0, j=0; i<count && i<MAX_OPTIONS; i++)
|
||||
{
|
||||
options[j].string =
|
||||
P2STR(setting->choice_setting->desc[i]);
|
||||
options[j].voice_id =
|
||||
P2ID(setting->choice_setting->desc[i]);
|
||||
j++;
|
||||
if (setting->flags&F_CHOICETALKS)
|
||||
{
|
||||
if (cfg_int_to_string(setting_id, i,
|
||||
buf_start, buf_free))
|
||||
{
|
||||
int len = strlen(buf_start) +1;
|
||||
options[j].string = buf_start;
|
||||
buf_start += len;
|
||||
buf_free -= len;
|
||||
options[j].voice_id =
|
||||
setting->choice_setting->talks[i];
|
||||
j++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
options[j].string =
|
||||
P2STR(setting->
|
||||
choice_setting->desc[i]);
|
||||
options[j].voice_id =
|
||||
P2ID(setting->
|
||||
choice_setting->desc[i]);
|
||||
j++;
|
||||
}
|
||||
}
|
||||
set_option(str(setting->lang_id), var, INT,
|
||||
options,count,
|
||||
setting->choice_setting->option_callback);
|
||||
options,j,
|
||||
setting->
|
||||
choice_setting->option_callback);
|
||||
}
|
||||
if (setting->flags&F_TEMPVAR)
|
||||
*(int*)setting->setting = temp_var;
|
||||
|
@ -675,7 +702,7 @@ int do_menu(const struct menu_item_ex *start_menu)
|
|||
}
|
||||
break;
|
||||
}
|
||||
get_menu_callback(temp,menu_callback);
|
||||
get_menu_callback(temp,&menu_callback);
|
||||
if (type != MT_MENU && menu_callback)
|
||||
menu_callback(ACTION_EXIT_MENUITEM,temp);
|
||||
}
|
||||
|
|
|
@ -27,6 +27,102 @@
|
|||
#include "settings.h"
|
||||
#include "menu.h"
|
||||
#include "sound_menu.h"
|
||||
#include "eq_menu.h"
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
#include "pcmbuf.h"
|
||||
#endif
|
||||
|
||||
MENUITEM_FUNCTION(sound_settings, ID2P(LANG_SOUND_SETTINGS), (menu_function)sound_menu, NULL);
|
||||
/***********************************/
|
||||
/* SOUND MENU */
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
int soundmenu_callback(int action,const struct menu_item_ex *this_item)
|
||||
{
|
||||
(void)this_item;
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_ENTER_MENUITEM: /* on entering an item */
|
||||
pcmbuf_set_low_latency(true);
|
||||
break;
|
||||
case ACTION_EXIT_MENUITEM: /* on exit */
|
||||
pcmbuf_set_low_latency(false);
|
||||
break;
|
||||
}
|
||||
return action;
|
||||
}
|
||||
#else
|
||||
#define soundmenu_callback NULL
|
||||
#endif
|
||||
|
||||
MENUITEM_SETTING(volume, &global_settings.volume, soundmenu_callback);
|
||||
|
||||
#ifndef HAVE_TLV320
|
||||
MENUITEM_SETTING(bass, &global_settings.bass, soundmenu_callback);
|
||||
MENUITEM_SETTING(treble, &global_settings.treble, soundmenu_callback);
|
||||
#endif
|
||||
|
||||
MENUITEM_SETTING(balance, &global_settings.balance, soundmenu_callback);
|
||||
MENUITEM_SETTING(channel_config, &global_settings.channel_config, soundmenu_callback);
|
||||
MENUITEM_SETTING(stereo_width, &global_settings.stereo_width, soundmenu_callback);
|
||||
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
/* Crossfeed Submenu */
|
||||
MENUITEM_SETTING(crossfeed, &global_settings.crossfeed, soundmenu_callback);
|
||||
MENUITEM_SETTING(crossfeed_direct_gain,
|
||||
&global_settings.crossfeed_direct_gain, soundmenu_callback);
|
||||
MENUITEM_SETTING(crossfeed_cross_gain,
|
||||
&global_settings.crossfeed_cross_gain, soundmenu_callback);
|
||||
MENUITEM_SETTING(crossfeed_hf_attenuation,
|
||||
&global_settings.crossfeed_hf_attenuation, soundmenu_callback);
|
||||
MENUITEM_SETTING(crossfeed_hf_cutoff,
|
||||
&global_settings.crossfeed_hf_cutoff, soundmenu_callback);
|
||||
MAKE_MENU(crossfeed_menu,ID2P(LANG_CROSSFEED),soundmenu_callback,
|
||||
&crossfeed, &crossfeed_direct_gain, &crossfeed_cross_gain,
|
||||
&crossfeed_hf_attenuation, &crossfeed_hf_cutoff);
|
||||
|
||||
MENUITEM_FUNCTION(equalizer_menu, ID2P(LANG_EQUALIZER),
|
||||
(int(*)(void))eq_menu, NULL);
|
||||
MENUITEM_SETTING(dithering_enabled,
|
||||
&global_settings.dithering_enabled, soundmenu_callback);
|
||||
#ifdef HAVE_WM8758
|
||||
MENUITEM_FUNCTION(hw_equalizer_menu, ID2P(LANG_EQUALIZER_HARDWARE),
|
||||
(int(*)(void))eq_hw_menu, NULL);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
||||
MENUITEM_SETTING(loudness, &global_settings.loudness, NULL);
|
||||
MENUITEM_SETTING(avc, &global_settings.avc, NULL);
|
||||
MENUITEM_SETTING(superbass, &global_settings.superbass, NULL);
|
||||
MENUITEM_SETTING(mdb_enable, &global_settings.mdb_enable, NULL);
|
||||
MENUITEM_SETTING(mdb_strength, &global_settings.mdb_strength, NULL);
|
||||
MENUITEM_SETTING(mdb_harmonics, &global_settings.mdb_harmonics, NULL);
|
||||
MENUITEM_SETTING(mdb_center, &global_settings.mdb_center, NULL);
|
||||
MENUITEM_SETTING(mdb_shape, &global_settings.mdb_shape, NULL);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
MAKE_MENU(sound_settings, ID2P(LANG_SOUND_SETTINGS), NULL,
|
||||
&volume,
|
||||
#ifndef HAVE_TLV320
|
||||
&bass,&treble,
|
||||
#endif
|
||||
&balance,&channel_config,&stereo_width
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
,&crossfeed_menu, &equalizer_menu,&dithering_enabled
|
||||
#endif
|
||||
#ifdef HAVE_WM8758
|
||||
,&hw_equalizer_menu
|
||||
#endif
|
||||
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
||||
,&loudness,&avc,&superbass,&mdb_enable,&mdb_strength
|
||||
,&mdb_harmonics,&mdb_center,&mdb_shape
|
||||
#endif
|
||||
);
|
||||
/* SOUND MENU */
|
||||
/***********************************/
|
||||
|
||||
bool sound_menu(void)
|
||||
{
|
||||
return do_menu(&sound_settings);
|
||||
}
|
||||
|
|
|
@ -395,7 +395,7 @@ bool settings_load_config(const char* file, bool apply)
|
|||
|
||||
/** Writing to a config file and saving settings **/
|
||||
|
||||
static bool cfg_int_to_string(int setting_id, int val, char* buf)
|
||||
bool cfg_int_to_string(int setting_id, int val, char* buf, int buf_len)
|
||||
{
|
||||
const char* start = settings[setting_id].cfg_vals;
|
||||
char* end = NULL;
|
||||
|
@ -410,11 +410,12 @@ static bool cfg_int_to_string(int setting_id, int val, char* buf)
|
|||
}
|
||||
end = strchr(start,',');
|
||||
if (end == NULL)
|
||||
strcpy(buf,start);
|
||||
strncpy(buf, start, buf_len);
|
||||
else
|
||||
{
|
||||
strncpy(buf, start, end-start);
|
||||
buf[end-start] = '\0';
|
||||
int len = (buf_len > (end-start))? end-start: buf_len;
|
||||
strncpy(buf, start, len);
|
||||
buf[len] = '\0';
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -496,12 +497,13 @@ static bool settings_write_config(char* filename, int options)
|
|||
}
|
||||
else
|
||||
{
|
||||
cfg_int_to_string(i,*(int*)settings[i].setting,value);
|
||||
cfg_int_to_string(i, *(int*)settings[i].setting,
|
||||
value, MAX_PATH);
|
||||
}
|
||||
break;
|
||||
case F_T_BOOL:
|
||||
cfg_int_to_string(i,
|
||||
*(bool*)settings[i].setting==false?0:1,value);
|
||||
*(bool*)settings[i].setting==false?0:1, value, MAX_PATH);
|
||||
break;
|
||||
case F_T_CHARPTR:
|
||||
case F_T_UCHARPTR:
|
||||
|
@ -923,13 +925,17 @@ void settings_reset(void) {
|
|||
}
|
||||
|
||||
/** Changing setting values **/
|
||||
const struct settings_list* find_setting(void* variable)
|
||||
const struct settings_list* find_setting(void* variable, int *id)
|
||||
{
|
||||
int i;
|
||||
for(i=0;i<nb_settings;i++)
|
||||
{
|
||||
if (settings[i].setting == variable)
|
||||
{
|
||||
if (id)
|
||||
*id = i;
|
||||
return &settings[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@ -939,7 +945,7 @@ void talk_setting(void *global_settings_variable)
|
|||
const struct settings_list *setting;
|
||||
if (global_settings.talk_menu == 0)
|
||||
return;
|
||||
setting = find_setting(global_settings_variable);
|
||||
setting = find_setting(global_settings_variable, NULL);
|
||||
if (setting == NULL)
|
||||
return;
|
||||
if (setting->lang_id)
|
||||
|
@ -1173,6 +1179,37 @@ static bool do_set_setting(const unsigned char* string, void *variable,
|
|||
|
||||
return false;
|
||||
}
|
||||
static const char *unit_strings[] =
|
||||
{
|
||||
[UNIT_INT]
|
||||
= "",
|
||||
[UNIT_MS]
|
||||
= "ms",
|
||||
[UNIT_SEC]
|
||||
= "s",
|
||||
[UNIT_MIN]
|
||||
= "min",
|
||||
[UNIT_HOUR]
|
||||
= "hr",
|
||||
[UNIT_KHZ]
|
||||
= "KHz",
|
||||
[UNIT_DB]
|
||||
= "dB",
|
||||
[UNIT_PERCENT]
|
||||
= "%",
|
||||
[UNIT_MAH]
|
||||
= "mAh",
|
||||
[UNIT_PIXEL]
|
||||
= "px",
|
||||
[UNIT_PER_SEC]
|
||||
= "per sec",
|
||||
[UNIT_HERTZ]
|
||||
= "Hz",
|
||||
[UNIT_MB]
|
||||
= "MB",
|
||||
[UNIT_KBIT]
|
||||
= "kb/s",
|
||||
};
|
||||
bool set_int(const unsigned char* string,
|
||||
const char* unit,
|
||||
int voice_unit,
|
||||
|
@ -1186,12 +1223,16 @@ bool set_int(const unsigned char* string,
|
|||
#if CONFIG_KEYPAD != PLAYER_PAD
|
||||
struct value_setting_data data = {
|
||||
INT,max, step, voice_unit,unit,formatter,NULL };
|
||||
if (unit == NULL)
|
||||
data.unit = unit_strings[voice_unit];
|
||||
return do_set_setting(string,variable,(max-min)/step + 1,
|
||||
(max-*variable)/step, &data,function);
|
||||
#else
|
||||
int count = (max-min)/step + 1;
|
||||
struct value_setting_data data = {
|
||||
INT,min, -step, voice_unit,unit,formatter,NULL };
|
||||
if (unit == NULL)
|
||||
data.unit = unit_strings[voice_unit];
|
||||
return do_set_setting(string,variable,count,
|
||||
count - ((max-*variable)/step), &data,function);
|
||||
#endif
|
||||
|
|
|
@ -224,7 +224,8 @@ struct opt_items {
|
|||
unsigned const char* string;
|
||||
long voice_id;
|
||||
};
|
||||
const struct settings_list* find_setting(void* variable);
|
||||
const struct settings_list* find_setting(void* variable, int *id);
|
||||
bool cfg_int_to_string(int setting_id, int val, char* buf, int buf_len);
|
||||
void talk_setting(void *global_settings_variable);
|
||||
bool set_sound(const unsigned char * string,
|
||||
int* variable, int setting);
|
||||
|
|
|
@ -93,8 +93,8 @@ static const char backlight_times_conf [] =
|
|||
#define FUNCTYPE(a) {.func = a}
|
||||
#define NODEFAULT INT(0)
|
||||
|
||||
#define SOUND_SETTING(flags,var,lang_id,setting) \
|
||||
{flags|F_T_INT|F_T_SOUND, GS(var),lang_id, NODEFAULT,#var,NULL,\
|
||||
#define SOUND_SETTING(flags,var,lang_id,name,setting) \
|
||||
{flags|F_T_INT|F_T_SOUND, GS(var),lang_id, NODEFAULT,name,NULL,\
|
||||
{.sound_setting=(struct sound_setting[]){{setting}}} }
|
||||
|
||||
#define BOOL_SETTING(flags,var,lang_id,default,name,cfgvals,yes,no,opt_cb) \
|
||||
|
@ -119,26 +119,73 @@ static const char backlight_times_conf [] =
|
|||
{flags|F_CHOICE_SETTING|F_T_INT, GS(var), lang_id, \
|
||||
INT(default), name, cfg_vals, \
|
||||
{.choice_setting = (struct choice_setting[]){ \
|
||||
{cb,count,(unsigned char*[]){__VA_ARGS__}}}}}
|
||||
|
||||
{cb, count, {.desc = (unsigned char*[]){__VA_ARGS__}}}}}}
|
||||
|
||||
#define STRINGCHOICE_SETTING(flags,var,lang_id,default,name,cfg_vals,cb,count,...) \
|
||||
{flags|F_CHOICE_SETTING|F_T_INT|F_CHOICETALKS, GS(var), lang_id, \
|
||||
INT(default), name, cfg_vals, \
|
||||
{.choice_setting = (struct choice_setting[]){ \
|
||||
{cb, count, {.talks = (int[]){__VA_ARGS__}}}}}}
|
||||
|
||||
#define INT_SETTING(flags, var, lang_id, default, name, cfg_vals, \
|
||||
unit, min, max, step, formatter, cb) \
|
||||
{flags|F_INT_SETTING|F_T_INT, GS(var), lang_id, INT(default), \
|
||||
name, cfg_vals, {.int_setting = (struct int_setting[]){ \
|
||||
{cb, unit, min, max, step, formatter}}}}
|
||||
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
static void crossfeed_format(char* buffer, int buffer_size, int value,
|
||||
const char* unit)
|
||||
{
|
||||
snprintf(buffer, buffer_size, "%s%d.%d %s", value == 0 ? " " : "-",
|
||||
value / 10, value % 10, unit);
|
||||
}
|
||||
static void crossfeed_cross_gain_helper(int val)
|
||||
{
|
||||
dsp_set_crossfeed_cross_params(val,
|
||||
val + global_settings.crossfeed_hf_attenuation,
|
||||
global_settings.crossfeed_hf_cutoff);
|
||||
}
|
||||
static void crossfeed_hf_att_helper(int val)
|
||||
{
|
||||
dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain,
|
||||
global_settings.crossfeed_cross_gain + val,
|
||||
global_settings.crossfeed_hf_cutoff);
|
||||
}
|
||||
static void crossfeed_hf_cutoff_helper(int val)
|
||||
{
|
||||
dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain,
|
||||
global_settings.crossfeed_cross_gain
|
||||
+ global_settings.crossfeed_hf_attenuation, val);
|
||||
}
|
||||
#endif
|
||||
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
||||
static void set_mdb_enable(bool value)
|
||||
{
|
||||
sound_set_mdb_enable((int)value);
|
||||
}
|
||||
static void set_superbass(bool value)
|
||||
{
|
||||
sound_set_superbass((int)value);
|
||||
}
|
||||
#endif
|
||||
|
||||
const struct settings_list settings[] = {
|
||||
/* sound settings */
|
||||
SOUND_SETTING(0,volume, LANG_VOLUME, SOUND_VOLUME),
|
||||
SOUND_SETTING(0,balance, LANG_BALANCE, SOUND_BALANCE),
|
||||
SOUND_SETTING(0,bass, LANG_BASS, SOUND_BASS),
|
||||
SOUND_SETTING(0,treble, LANG_TREBLE, SOUND_TREBLE),
|
||||
SOUND_SETTING(0,volume, LANG_VOLUME, "volume", SOUND_VOLUME),
|
||||
SOUND_SETTING(0,balance, LANG_BALANCE, "balance", SOUND_BALANCE),
|
||||
SOUND_SETTING(0,bass, LANG_BASS, "bass", SOUND_BASS),
|
||||
SOUND_SETTING(0,treble, LANG_TREBLE, "treble", SOUND_TREBLE),
|
||||
|
||||
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
||||
{ F_T_INT, GS(loudness), LANG_LOUDNESS, INT(0), "loudness", NULL, UNUSED },
|
||||
{ F_T_INT, GS(avc), LANG_AUTOVOL, INT(0), "auto volume",
|
||||
"off,20ms,2,4,8", UNUSED },
|
||||
OFFON_SETTING(0,superbass,LANG_SUPERBASS,false,"superbass",NULL),
|
||||
SOUND_SETTING(0,loudness, LANG_LOUDNESS, "loudness", SOUND_LOUDNESS),
|
||||
STRINGCHOICE_SETTING(0,avc,LANG_AUTOVOL,0,"auto volume",
|
||||
"off,20ms,4,4,8,", sound_set_avc, 5,
|
||||
LANG_OFF,TALK_ID(20, UNIT_MS),TALK_ID(2, UNIT_SEC),
|
||||
TALK_ID(4, UNIT_SEC),TALK_ID(8, UNIT_SEC)),
|
||||
OFFON_SETTING(0, superbass, LANG_SUPERBASS, false, "superbass", set_superbass),
|
||||
#endif
|
||||
|
||||
CHOICE_SETTING(0,channel_config,LANG_CHANNEL,0,"channels",
|
||||
"stereo,mono,custom,mono left,mono right,karaoke",
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
|
@ -149,7 +196,8 @@ const struct settings_list settings[] = {
|
|||
6, ID2P(LANG_CHANNEL_STEREO), ID2P(LANG_CHANNEL_MONO),
|
||||
ID2P(LANG_CHANNEL_CUSTOM), ID2P(LANG_CHANNEL_LEFT),
|
||||
ID2P(LANG_CHANNEL_RIGHT), ID2P(LANG_CHANNEL_KARAOKE)),
|
||||
SOUND_SETTING(0,stereo_width, LANG_STEREO_WIDTH, SOUND_STEREO_WIDTH),
|
||||
SOUND_SETTING(0,stereo_width, LANG_STEREO_WIDTH,
|
||||
"stereo_width", SOUND_STEREO_WIDTH),
|
||||
/* playback */
|
||||
OFFON_SETTING(0, resume, LANG_RESUME, false, "resume", NULL),
|
||||
OFFON_SETTING(0, playlist_shuffle, LANG_SHUFFLE, false, "shuffle", NULL),
|
||||
|
@ -377,13 +425,16 @@ const struct settings_list settings[] = {
|
|||
{F_T_INT,GS(peak_meter_max),LANG_PM_MAX,INT(0),"peak meter max",NULL,UNUSED},
|
||||
#endif
|
||||
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
||||
{F_T_INT,GS(mdb_strength),LANG_MDB_STRENGTH,INT(0),
|
||||
"mdb strength",NULL,UNUSED},
|
||||
{F_T_INT,GS(mdb_harmonics),LANG_MDB_HARMONICS,INT(0),
|
||||
"mdb harmonics",NULL,UNUSED},
|
||||
{F_T_INT,GS(mdb_center),LANG_MDB_CENTER,INT(0),"mdb center",NULL,UNUSED},
|
||||
{F_T_INT,GS(mdb_shape),LANG_MDB_SHAPE,INT(0),"mdb shape",NULL,UNUSED},
|
||||
OFFON_SETTING(0,mdb_enable,LANG_MDB_ENABLE,false,"mdb enable",NULL),
|
||||
SOUND_SETTING(0, mdb_strength, LANG_MDB_STRENGTH,
|
||||
"mdb strength", SOUND_MDB_STRENGTH),
|
||||
SOUND_SETTING(0, mdb_harmonics, LANG_MDB_HARMONICS,
|
||||
"mdb harmonics", SOUND_MDB_HARMONICS),
|
||||
SOUND_SETTING(0, mdb_center, LANG_MDB_CENTER,
|
||||
"mdb center", SOUND_MDB_CENTER),
|
||||
SOUND_SETTING(0, mdb_shape, LANG_MDB_SHAPE,
|
||||
"mdb shape", SOUND_MDB_SHAPE),
|
||||
OFFON_SETTING(0, mdb_enable, LANG_MDB_ENABLE,
|
||||
false, "mdb enable", set_mdb_enable),
|
||||
#endif
|
||||
#if CONFIG_CODEC == MAS3507D
|
||||
OFFON_SETTING(0,line_in,LANG_LINE_IN,false,"line in",NULL),
|
||||
|
@ -520,18 +571,22 @@ const struct settings_list settings[] = {
|
|||
{F_T_INT,GS(crossfade_fade_out_mixmode),
|
||||
LANG_CROSSFADE_FADE_OUT_MODE,INT(0),
|
||||
"crossfade fade out mode","crossfade,mix",UNUSED},
|
||||
|
||||
|
||||
/* crossfeed */
|
||||
OFFON_SETTING(0,crossfeed,LANG_CROSSFEED,false,"crossfeed",NULL),
|
||||
{F_T_INT,GS(crossfeed_direct_gain),LANG_CROSSFEED_DIRECT_GAIN,INT(15),
|
||||
"crossfeed direct gain",NULL,UNUSED},
|
||||
{F_T_INT,GS(crossfeed_cross_gain),LANG_CROSSFEED_CROSS_GAIN,INT(60),
|
||||
"crossfeed cross gain",NULL,UNUSED},
|
||||
{F_T_INT,GS(crossfeed_hf_attenuation),LANG_CROSSFEED_HF_ATTENUATION,INT(160),
|
||||
"crossfeed hf attenuation",NULL,UNUSED},
|
||||
{F_T_INT,GS(crossfeed_hf_cutoff),LANG_CROSSFEED_HF_CUTOFF,INT(700),
|
||||
"crossfeed hf cutoff",NULL,UNUSED},
|
||||
|
||||
OFFON_SETTING(0,crossfeed, LANG_CROSSFEED, false,
|
||||
"crossfeed", dsp_set_crossfeed),
|
||||
INT_SETTING(0, crossfeed_direct_gain, LANG_CROSSFEED_DIRECT_GAIN, 15,
|
||||
"crossfeed direct gain", NULL, UNIT_DB, 0, 60, 5,
|
||||
crossfeed_format, dsp_set_crossfeed_direct_gain),
|
||||
INT_SETTING(0, crossfeed_cross_gain, LANG_CROSSFEED_CROSS_GAIN, 60,
|
||||
"crossfeed cross gain", NULL, UNIT_DB, 30, 120, 5,
|
||||
crossfeed_format, crossfeed_cross_gain_helper),
|
||||
INT_SETTING(0, crossfeed_hf_attenuation, LANG_CROSSFEED_HF_ATTENUATION, 160,
|
||||
"crossfeed hf attenuation", NULL, UNIT_DB, 60, 240, 5,
|
||||
crossfeed_format, crossfeed_hf_att_helper),
|
||||
INT_SETTING(0, crossfeed_hf_cutoff, LANG_CROSSFEED_HF_CUTOFF,700,
|
||||
"crossfeed hf cutoff", NULL, UNIT_HERTZ, 500, 2000, 100,
|
||||
crossfeed_format, crossfeed_hf_cutoff_helper),
|
||||
/* equalizer */
|
||||
OFFON_SETTING(0,eq_enabled,LANG_EQUALIZER_ENABLED,false,"eq enabled",NULL),
|
||||
{F_T_INT,GS(eq_precut),LANG_EQUALIZER_PRECUT,INT(0),
|
||||
|
@ -571,8 +626,8 @@ const struct settings_list settings[] = {
|
|||
"eq band 4 gain",NULL,UNUSED},
|
||||
|
||||
/* dithering */
|
||||
OFFON_SETTING(0,dithering_enabled,LANG_DITHERING,
|
||||
false,"dithering enabled",NULL),
|
||||
OFFON_SETTING(0, dithering_enabled, LANG_DITHERING,
|
||||
false, "dithering enabled", dsp_dither_enable),
|
||||
#endif
|
||||
#ifdef HAVE_DIRCACHE
|
||||
OFFON_SETTING(0,dircache,LANG_DIRCACHE_ENABLE,false,"dircache",NULL),
|
||||
|
|
|
@ -64,22 +64,26 @@ struct filename_setting {
|
|||
#define F_FILENAME 0x40
|
||||
|
||||
struct int_setting {
|
||||
void (*option_callback)(int);
|
||||
int unit;
|
||||
int min;
|
||||
int max;
|
||||
int step;
|
||||
void (*formatter)(char*, int, int, const char*);
|
||||
void (*option_callback)(int);
|
||||
int unit;
|
||||
int min;
|
||||
int max;
|
||||
int step;
|
||||
void (*formatter)(char*, int, int, const char*);
|
||||
};
|
||||
#define F_INT_SETTING 0x80
|
||||
|
||||
struct choice_setting {
|
||||
void (*option_callback)(int);
|
||||
int count;
|
||||
unsigned char **desc;
|
||||
void (*option_callback)(int);
|
||||
int count;
|
||||
union {
|
||||
unsigned char **desc;
|
||||
int *talks;
|
||||
};
|
||||
};
|
||||
#define F_CHOICE_SETTING 0x100
|
||||
|
||||
#define F_CHOICETALKS 0x200 /* uses .talks in the above struct for the talks */
|
||||
/* and cfg_vals for the strings to display */
|
||||
/* these use the _isfunc_type type for the function */
|
||||
/* typedef int (*_isfunc_type)(void); */
|
||||
#define F_MIN_ISFUNC 0x100000 /* min(above) is function pointer to above type */
|
||||
|
@ -96,10 +100,10 @@ struct choice_setting {
|
|||
- number of bytes for a NVRAM setting is changed
|
||||
- a NVRAM setting is removed
|
||||
*/
|
||||
#define F_TEMPVAR 0x200 /* used if the setting should be set using a temp var */
|
||||
#define F_TEMPVAR 0x400 /* used if the setting should be set using a temp var */
|
||||
|
||||
struct settings_list {
|
||||
uint32_t flags; /* ____ ____ TFFF ____ NNN_ __TC IFRB STTT */
|
||||
uint32_t flags; /* ____ ____ TFFF ____ NNN_ _TVC IFRB STTT */
|
||||
void *setting;
|
||||
int lang_id; /* -1 for none */
|
||||
union storage_type default_val;
|
||||
|
|
|
@ -61,201 +61,6 @@
|
|||
#endif
|
||||
#include "action.h"
|
||||
|
||||
static bool volume(void)
|
||||
{
|
||||
return set_sound(str(LANG_VOLUME), &global_settings.volume, SOUND_VOLUME);
|
||||
}
|
||||
|
||||
static bool balance(void)
|
||||
{
|
||||
return set_sound(str(LANG_BALANCE), &global_settings.balance,
|
||||
SOUND_BALANCE);
|
||||
}
|
||||
|
||||
#ifndef HAVE_TLV320
|
||||
static bool bass(void)
|
||||
{
|
||||
return set_sound(str(LANG_BASS), &global_settings.bass, SOUND_BASS);
|
||||
}
|
||||
|
||||
static bool treble(void)
|
||||
{
|
||||
return set_sound(str(LANG_TREBLE), &global_settings.treble, SOUND_TREBLE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
static void crossfeed_format(char* buffer, int buffer_size, int value,
|
||||
const char* unit)
|
||||
{
|
||||
snprintf(buffer, buffer_size, "%s%d.%d %s", value == 0 ? " " : "-",
|
||||
value / 10, value % 10, unit);
|
||||
}
|
||||
|
||||
static bool crossfeed_enabled(void)
|
||||
{
|
||||
bool result = set_bool_options(str(LANG_CROSSFEED),
|
||||
&global_settings.crossfeed,
|
||||
STR(LANG_ON),
|
||||
STR(LANG_OFF),
|
||||
NULL);
|
||||
|
||||
dsp_set_crossfeed(global_settings.crossfeed);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool crossfeed_direct_gain(void)
|
||||
{
|
||||
return set_int(str(LANG_CROSSFEED_DIRECT_GAIN), str(LANG_UNIT_DB),
|
||||
UNIT_DB, &global_settings.crossfeed_direct_gain,
|
||||
&dsp_set_crossfeed_direct_gain, 5, 0, 60, crossfeed_format);
|
||||
}
|
||||
|
||||
static void crossfeed_cross_gain_helper(int val)
|
||||
{
|
||||
dsp_set_crossfeed_cross_params(val,
|
||||
val + global_settings.crossfeed_hf_attenuation,
|
||||
global_settings.crossfeed_hf_cutoff);
|
||||
}
|
||||
|
||||
static bool crossfeed_cross_gain(void)
|
||||
{
|
||||
return set_int(str(LANG_CROSSFEED_CROSS_GAIN), str(LANG_UNIT_DB),
|
||||
UNIT_DB, &global_settings.crossfeed_cross_gain,
|
||||
&crossfeed_cross_gain_helper, 5, 30, 120, crossfeed_format);
|
||||
}
|
||||
|
||||
static void crossfeed_hf_att_helper(int val)
|
||||
{
|
||||
dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain,
|
||||
global_settings.crossfeed_cross_gain + val,
|
||||
global_settings.crossfeed_hf_cutoff);
|
||||
}
|
||||
|
||||
static bool crossfeed_hf_attenuation(void)
|
||||
{
|
||||
return set_int(str(LANG_CROSSFEED_HF_ATTENUATION), str(LANG_UNIT_DB),
|
||||
UNIT_DB, &global_settings.crossfeed_hf_attenuation,
|
||||
&crossfeed_hf_att_helper, 5, 60, 240, crossfeed_format);
|
||||
}
|
||||
|
||||
static void crossfeed_hf_cutoff_helper(int val)
|
||||
{
|
||||
dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain,
|
||||
global_settings.crossfeed_cross_gain + global_settings.crossfeed_hf_attenuation, val);
|
||||
}
|
||||
|
||||
static bool crossfeed_hf_cutoff(void)
|
||||
{
|
||||
return set_int(str(LANG_CROSSFEED_HF_CUTOFF), str(LANG_UNIT_HERTZ),
|
||||
UNIT_HERTZ, &global_settings.crossfeed_hf_cutoff, &crossfeed_hf_cutoff_helper, 100, 500, 2000,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static bool crossfeed_menu(void)
|
||||
{
|
||||
int m;
|
||||
bool result;
|
||||
static const struct menu_item items[] = {
|
||||
{ ID2P(LANG_CROSSFEED), crossfeed_enabled },
|
||||
{ ID2P(LANG_CROSSFEED_DIRECT_GAIN), crossfeed_direct_gain },
|
||||
{ ID2P(LANG_CROSSFEED_CROSS_GAIN), crossfeed_cross_gain },
|
||||
{ ID2P(LANG_CROSSFEED_HF_ATTENUATION), crossfeed_hf_attenuation },
|
||||
{ ID2P(LANG_CROSSFEED_HF_CUTOFF), crossfeed_hf_cutoff },
|
||||
};
|
||||
|
||||
m=menu_init(items, sizeof(items) / sizeof(*items), NULL,
|
||||
NULL, NULL, NULL);
|
||||
result = menu_run(m);
|
||||
menu_exit(m);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool dithering_enable(void)
|
||||
{
|
||||
return set_bool_options(str(LANG_DITHERING),
|
||||
&global_settings.dithering_enabled,
|
||||
STR(LANG_SET_BOOL_YES),
|
||||
STR(LANG_SET_BOOL_NO),
|
||||
dsp_dither_enable);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
||||
static bool loudness(void)
|
||||
{
|
||||
return set_sound(str(LANG_LOUDNESS), &global_settings.loudness,
|
||||
SOUND_LOUDNESS);
|
||||
}
|
||||
|
||||
static bool mdb_strength(void)
|
||||
{
|
||||
return set_sound(str(LANG_MDB_STRENGTH), &global_settings.mdb_strength,
|
||||
SOUND_MDB_STRENGTH);
|
||||
}
|
||||
|
||||
static bool mdb_harmonics(void)
|
||||
{
|
||||
return set_sound(str(LANG_MDB_HARMONICS), &global_settings.mdb_harmonics,
|
||||
SOUND_MDB_HARMONICS);
|
||||
}
|
||||
|
||||
static bool mdb_center(void)
|
||||
{
|
||||
return set_sound(str(LANG_MDB_CENTER), &global_settings.mdb_center,
|
||||
SOUND_MDB_CENTER);
|
||||
}
|
||||
|
||||
static bool mdb_shape(void)
|
||||
{
|
||||
return set_sound(str(LANG_MDB_SHAPE), &global_settings.mdb_shape,
|
||||
SOUND_MDB_SHAPE);
|
||||
}
|
||||
|
||||
static void set_mdb_enable(bool value)
|
||||
{
|
||||
sound_set_mdb_enable((int)value);
|
||||
}
|
||||
|
||||
static bool mdb_enable(void)
|
||||
{
|
||||
return set_bool_options(str(LANG_MDB_ENABLE),
|
||||
&global_settings.mdb_enable,
|
||||
STR(LANG_SET_BOOL_YES),
|
||||
STR(LANG_SET_BOOL_NO),
|
||||
set_mdb_enable);
|
||||
}
|
||||
|
||||
static void set_superbass(bool value)
|
||||
{
|
||||
sound_set_superbass((int)value);
|
||||
}
|
||||
|
||||
static bool superbass(void)
|
||||
{
|
||||
return set_bool_options(str(LANG_SUPERBASS),
|
||||
&global_settings.superbass,
|
||||
STR(LANG_SET_BOOL_YES),
|
||||
STR(LANG_SET_BOOL_NO),
|
||||
set_superbass);
|
||||
}
|
||||
|
||||
static bool avc(void)
|
||||
{
|
||||
static const struct opt_items names[] = {
|
||||
{ STR(LANG_OFF) },
|
||||
{ "20ms", TALK_ID(20, UNIT_MS) },
|
||||
{ "2s", TALK_ID(2, UNIT_SEC) },
|
||||
{ "4s", TALK_ID(4, UNIT_SEC) },
|
||||
{ "8s", TALK_ID(8, UNIT_SEC) }
|
||||
};
|
||||
return set_option(str(LANG_DECAY), &global_settings.avc, INT,
|
||||
names, 5, sound_set_avc);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_RECORDING
|
||||
static bool recsource(void)
|
||||
{
|
||||
|
@ -684,93 +489,7 @@ static bool agc_cliptime(void)
|
|||
#endif /* HAVE_AGC */
|
||||
#endif /* HAVE_RECORDING */
|
||||
|
||||
static bool chanconf(void)
|
||||
{
|
||||
static const struct opt_items names[] = {
|
||||
{ STR(LANG_CHANNEL_STEREO) },
|
||||
{ STR(LANG_CHANNEL_MONO) },
|
||||
{ STR(LANG_CHANNEL_CUSTOM) },
|
||||
{ STR(LANG_CHANNEL_LEFT) },
|
||||
{ STR(LANG_CHANNEL_RIGHT) },
|
||||
{ STR(LANG_CHANNEL_KARAOKE) }
|
||||
};
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
return set_option(str(LANG_CHANNEL), &global_settings.channel_config, INT,
|
||||
names, 6, channels_set);
|
||||
#else
|
||||
return set_option(str(LANG_CHANNEL), &global_settings.channel_config, INT,
|
||||
names, 6, sound_set_channels);
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool stereo_width(void)
|
||||
{
|
||||
return set_sound(str(LANG_STEREO_WIDTH), &global_settings.stereo_width,
|
||||
SOUND_STEREO_WIDTH);
|
||||
}
|
||||
|
||||
bool sound_menu(void)
|
||||
{
|
||||
int m;
|
||||
bool done = false;
|
||||
int selected;
|
||||
static const struct menu_item items[] = {
|
||||
{ ID2P(LANG_VOLUME), volume },
|
||||
#ifndef HAVE_TLV320
|
||||
{ ID2P(LANG_BASS), bass },
|
||||
{ ID2P(LANG_TREBLE), treble },
|
||||
#endif
|
||||
{ ID2P(LANG_BALANCE), balance },
|
||||
{ ID2P(LANG_CHANNEL_MENU), chanconf },
|
||||
{ ID2P(LANG_STEREO_WIDTH), stereo_width },
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
{ ID2P(LANG_CROSSFEED), crossfeed_menu },
|
||||
{ ID2P(LANG_EQUALIZER), eq_menu },
|
||||
{ ID2P(LANG_DITHERING), dithering_enable },
|
||||
#endif
|
||||
#ifdef HAVE_WM8758
|
||||
{ ID2P(LANG_EQUALIZER_HARDWARE), eq_hw_menu },
|
||||
#endif
|
||||
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
||||
{ ID2P(LANG_LOUDNESS), loudness },
|
||||
{ ID2P(LANG_AUTOVOL), avc },
|
||||
{ ID2P(LANG_SUPERBASS), superbass },
|
||||
{ ID2P(LANG_MDB_ENABLE), mdb_enable },
|
||||
{ ID2P(LANG_MDB_STRENGTH), mdb_strength },
|
||||
{ ID2P(LANG_MDB_HARMONICS), mdb_harmonics },
|
||||
{ ID2P(LANG_MDB_CENTER), mdb_center },
|
||||
{ ID2P(LANG_MDB_SHAPE), mdb_shape },
|
||||
#endif
|
||||
};
|
||||
|
||||
m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
|
||||
NULL, NULL, NULL);
|
||||
while (!done)
|
||||
{
|
||||
switch (selected=menu_show(m))
|
||||
{
|
||||
case MENU_SELECTED_EXIT:
|
||||
case MENU_ATTACHED_USB:
|
||||
done = true;
|
||||
break;
|
||||
default:
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
pcmbuf_set_low_latency(true);
|
||||
#endif
|
||||
if (items[selected].function &&
|
||||
items[selected].function())
|
||||
done = true;
|
||||
|
||||
#if CONFIG_CODEC == SWCODEC
|
||||
pcmbuf_set_low_latency(false);
|
||||
#endif
|
||||
gui_syncstatusbar_draw(&statusbars, true);
|
||||
}
|
||||
}
|
||||
menu_exit(m);
|
||||
|
||||
return selected == MENU_SELECTED_EXIT ? false : true;
|
||||
}
|
||||
|
||||
#ifdef HAVE_RECORDING
|
||||
enum trigger_menu_option
|
||||
|
|
Loading…
Reference in a new issue