1
0
Fork 0
forked from len0rd/rockbox

Corrected the bug with boolean settings (the inverted screen that couldn't be turned back to normal) added full multi-screen sound setting support

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7761 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Kevin Ferrare 2005-11-06 03:18:34 +00:00
parent ec8f328d89
commit 9b5264d37f
6 changed files with 261 additions and 211 deletions

View file

@ -44,6 +44,7 @@ void gui_select_init_numeric(struct gui_select * select,
select->min_value=min_value; select->min_value=min_value;
select->max_value=max_value+1; select->max_value=max_value+1;
select->option=init_value; select->option=init_value;
select->nb_decimals=0;
select->step=step; select->step=step;
select->extra_string=unit; select->extra_string=unit;
select->formatter=formatter; select->formatter=formatter;
@ -62,6 +63,7 @@ void gui_select_init_items(struct gui_select * select,
select->min_value=0; select->min_value=0;
select->max_value=nb_items; select->max_value=nb_items;
select->option=selected; select->option=selected;
select->nb_decimals=0;
select->step=1; select->step=1;
select->formatter=NULL; select->formatter=NULL;
select->items=items; select->items=items;

View file

@ -80,6 +80,7 @@ struct gui_select
int max_value; int max_value;
int step; int step;
int option; int option;
int nb_decimals;
const char * extra_string; const char * extra_string;
/* In the case the option is a number */ /* In the case the option is a number */
void (*formatter)(char* dest, void (*formatter)(char* dest,

View file

@ -1418,12 +1418,14 @@ bool set_int(const char* string,
gui_syncselect_draw(&select); gui_syncselect_draw(&select);
talk_unit(voice_unit, *variable); talk_unit(voice_unit, *variable);
if ( function ) if ( function )
function(gui_select_get_selected(&select)); function(*variable);
} }
gui_syncstatusbar_draw(&statusbars, false); gui_syncstatusbar_draw(&statusbars, false);
if(gui_select_is_canceled(&select)) if(gui_select_is_canceled(&select))
{ {
*variable=oldvalue; *variable=oldvalue;
if ( function )
function(*variable);
return false; return false;
} }
if(default_event_handler(button) == SYS_USB_CONNECTED) if(default_event_handler(button) == SYS_USB_CONNECTED)
@ -1446,11 +1448,14 @@ bool set_int(const char* string,
else \ else \
*(bool *)dest=value?true:false *(bool *)dest=value?true:false
#define set_int_fromtype(type, dest, var) \ #define type_fromvoidptr(type, value) \
if (type == INT) \ (type == INT)? \
dest=*(int *)var; \ (int)(*(int*)(value)) \
else \ : \
dest=*(bool *)var?1:0 (bool)(*(bool*)(value))
#define get_int_fromtype(type, var) \
(type == INT)?*(int *)var:(*(bool *)var?1:0)
bool set_option(const char* string, void* variable, enum optiontype type, bool set_option(const char* string, void* variable, enum optiontype type,
const struct opt_items* options, int numoptions, void (*function)(int)) const struct opt_items* options, int numoptions, void (*function)(int))
@ -1458,12 +1463,12 @@ bool set_option(const char* string, void* variable, enum optiontype type,
int button; int button;
int oldvalue; int oldvalue;
/* oldvalue=*variable; */ /* oldvalue=*variable; */
set_int_fromtype(type, oldvalue, variable); oldvalue=get_int_fromtype(type, variable);
struct gui_select select; struct gui_select select;
gui_select_init_items(&select, string, oldvalue, options, numoptions); gui_select_init_items(&select, string, oldvalue, options, numoptions);
gui_syncselect_draw(&select); gui_syncselect_draw(&select);
if (global_settings.talk_menu) if (global_settings.talk_menu)
talk_id(options[gui_select_get_selected(&select)].voice_id, false); talk_id(options[gui_select_get_selected(&select)].voice_id, true);
while ( !gui_select_is_validated(&select) ) while ( !gui_select_is_validated(&select) )
{ {
gui_syncstatusbar_draw(&statusbars, true); gui_syncstatusbar_draw(&statusbars, true);
@ -1476,13 +1481,15 @@ bool set_option(const char* string, void* variable, enum optiontype type,
if (global_settings.talk_menu) if (global_settings.talk_menu)
talk_id(options[gui_select_get_selected(&select)].voice_id, false); talk_id(options[gui_select_get_selected(&select)].voice_id, false);
if ( function ) if ( function )
function(*(int *)variable); function(type_fromvoidptr(type, variable));
} }
gui_syncstatusbar_draw(&statusbars, false); gui_syncstatusbar_draw(&statusbars, false);
if(gui_select_is_canceled(&select)) if(gui_select_is_canceled(&select))
{ {
/* *variable=oldvalue; */ /* *variable=oldvalue; */
set_type_fromint(type, variable, oldvalue); set_type_fromint(type, variable, oldvalue);
if ( function )
function(type_fromvoidptr(type, variable));
return false; return false;
} }
if(default_event_handler(button) == SYS_USB_CONNECTED) if(default_event_handler(button) == SYS_USB_CONNECTED)

View file

@ -50,104 +50,41 @@ static const char* const fmt[] =
"%d.%02d %s " /* 2 decimals */ "%d.%02d %s " /* 2 decimals */
}; };
int selected_setting; /* Used by the callback */
void dec_sound_formatter(char *buffer, int buffer_size, int val, const char * unit)
{
val = sound_val2phys(selected_setting, val);
int integer = val / 10;
int dec = val % 10;
snprintf(buffer, buffer_size, "%d.%d %s", integer, dec, unit);
}
bool set_sound(const char* string, bool set_sound(const char* string,
int* variable, int* variable,
int setting) int setting)
{ {
bool done = false;
bool changed = true;
int min, max;
int val;
int numdec;
int integer;
int dec;
const char* unit;
char str[32];
int talkunit = UNIT_INT; int talkunit = UNIT_INT;
int steps; const char* unit = sound_unit(setting);
int button; int numdec = sound_numdecimals(setting);
int steps = sound_steps(setting);
unit = sound_unit(setting); int min = sound_min(setting);
numdec = sound_numdecimals(setting); int max = sound_max(setting);
steps = sound_steps(setting); void(*sound_callback)(int)=sound_get_fn(setting);
min = sound_min(setting);
max = sound_max(setting);
if (*unit == 'd') /* crude reconstruction */ if (*unit == 'd') /* crude reconstruction */
talkunit = UNIT_DB; talkunit = UNIT_DB;
else if (*unit == '%') else if (*unit == '%')
talkunit = UNIT_PERCENT; talkunit = UNIT_PERCENT;
else if (*unit == 'H') else if (*unit == 'H')
talkunit = UNIT_HERTZ; talkunit = UNIT_HERTZ;
if(!numdec)
#ifdef HAVE_LCD_BITMAP return set_int(string, unit, talkunit, variable, sound_callback,
if(global_settings.statusbar) steps, min, max, NULL );
lcd_setmargins(0, STATUSBAR_HEIGHT);
else else
lcd_setmargins(0, 0); {/* Decimal number */
#endif selected_setting=setting;
lcd_clear_display(); return set_int(string, unit, talkunit, variable, sound_callback,
lcd_puts_scroll(0,0,string); steps, min, max, &dec_sound_formatter );
while (!done) {
if (changed) {
val = sound_val2phys(setting, *variable);
if(numdec)
{
integer = val / (10 * numdec);
dec = val % (10 * numdec);
snprintf(str,sizeof str, fmt[numdec], integer, dec, unit);
}
else
{
snprintf(str,sizeof str,"%d %s ", val, unit);
}
if (global_settings.talk_menu)
talk_value(val, talkunit, false); /* speak it */
}
lcd_puts(0,1,str);
status_draw(true);
lcd_update();
changed = false;
button = button_get_w_tmo(HZ/2);
switch( button ) {
case SETTINGS_INC:
case SETTINGS_INC | BUTTON_REPEAT:
(*variable)+=steps;
if(*variable > max )
*variable = max;
changed = true;
break;
case SETTINGS_DEC:
case SETTINGS_DEC | BUTTON_REPEAT:
(*variable)-=steps;
if(*variable < min )
*variable = min;
changed = true;
break;
case SETTINGS_OK:
case SETTINGS_CANCEL:
#ifdef SETTINGS_OK2
case SETTINGS_OK2:
#endif
#ifdef SETTINGS_CANCEL2
case SETTINGS_CANCEL2:
#endif
done = true;
break;
default:
if(default_event_handler(button) == SYS_USB_CONNECTED)
return true;
break;
}
if (changed)
sound_set(setting, *variable);
} }
lcd_stop_scroll();
return false;
} }
static bool volume(void) static bool volume(void)

View file

@ -45,6 +45,26 @@
#define SOUND_CHAN_MONO_RIGHT 4 #define SOUND_CHAN_MONO_RIGHT 4
#define SOUND_CHAN_KARAOKE 5 #define SOUND_CHAN_KARAOKE 5
#ifndef SIMULATOR
void sound_set_volume(int value);
void sound_set_balance(int value);
void sound_set_bass(int value);
void sound_set_treble(int value);
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
void sound_set_loudness(int value);
void sound_set_avc(int value);
void sound_set_mdb_strength(int value);
void sound_set_mdb_harmonics(int value);
void sound_set_mdb_center(int value);
void sound_set_mdb_shape(int value);
void sound_set_mdb_enable(int value);
void sound_set_superbass(int value);
#endif /* (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */
void sound_set_channels(int value);
void sound_set_stereo_width(int value);
#endif
void (*sound_get_fn(int setting))(int value);
void sound_set(int setting, int value); void sound_set(int setting, int value);
int sound_min(int setting); int sound_min(int setting);
int sound_max(int setting); int sound_max(int setting);

View file

@ -494,145 +494,228 @@ unsigned long mdb_shape_shadow = 0;
unsigned long loudness_shadow = 0; unsigned long loudness_shadow = 0;
#endif #endif
void sound_set(int setting, int value) #ifndef SIMULATOR
{
#ifdef SIMULATOR
setting = value;
#else
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
int tmp;
#endif
void sound_set_volume(int value)
{
if(!audio_is_initialized) if(!audio_is_initialized)
return; return;
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
int tmp = 0x7f00 * value / 100;
mas_codec_writereg(0x10, tmp & 0xff00);
#elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380
current_volume = VOLUME_MIN + (value * VOLUME_RANGE / 100);
set_prescaled_volume(); /* tenth of dB */
#endif
}
void sound_set_balance(int value)
{
if(!audio_is_initialized)
return;
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
int tmp = ((value * 127 / 100) & 0xff) << 8;
mas_codec_writereg(0x11, tmp & 0xff00);
#elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380
current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */
set_prescaled_volume();
#endif
}
void sound_set_bass(int value)
{
if(!audio_is_initialized)
return;
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
int tmp = ((value * 8) & 0xff) << 8;
mas_codec_writereg(0x14, tmp & 0xff00);
#elif CONFIG_CODEC == MAS3507D
mas_writereg(MAS_REG_KBASS, bass_table[value+15]);
current_bass = value * 10;
set_prescaled_volume();
#elif defined(HAVE_UDA1380)
uda1380_set_bass(value >> 1);
current_bass = value * 10;
set_prescaled_volume();
#endif
}
void sound_set_treble(int value)
{
if(!audio_is_initialized)
return;
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
int tmp = ((value * 8) & 0xff) << 8;
mas_codec_writereg(0x15, tmp & 0xff00);
#elif CONFIG_CODEC == MAS3507D
mas_writereg(MAS_REG_KTREBLE, treble_table[value+15]);
current_treble = value * 10;
set_prescaled_volume();
#elif defined(HAVE_UDA1380)
uda1380_set_treble(value >> 1);
current_treble = value * 10;
set_prescaled_volume();
#endif
}
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
void sound_set_loudness(int value)
{
if(!audio_is_initialized)
return;
loudness_shadow = (loudness_shadow & 0x04) |
(MAX(MIN(value * 4, 0x44), 0) << 8);
mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
}
void sound_set_avc(int value)
{
if(!audio_is_initialized)
return;
int tmp;
switch (value) {
case 1: /* 20ms */
tmp = (0x1 << 8) | (0x8 << 12);
break;
case 2: /* 2s */
tmp = (0x2 << 8) | (0x8 << 12);
break;
case 3: /* 4s */
tmp = (0x4 << 8) | (0x8 << 12);
break;
case 4: /* 8s */
tmp = (0x8 << 8) | (0x8 << 12);
break;
case -1: /* turn off and then turn on again to decay quickly */
tmp = mas_codec_readreg(MAS_REG_KAVC);
mas_codec_writereg(MAS_REG_KAVC, 0);
break;
default: /* off */
tmp = 0;
break;
}
mas_codec_writereg(MAS_REG_KAVC, tmp);
}
void sound_set_mdb_strength(int value)
{
if(!audio_is_initialized)
return;
mas_codec_writereg(MAS_REG_KMDB_STR, (value & 0x7f) << 8);
}
void sound_set_mdb_harmonics(int value)
{
if(!audio_is_initialized)
return;
int tmp = value * 127 / 100;
mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0x7f) << 8);
}
void sound_set_mdb_center(int value)
{
if(!audio_is_initialized)
return;
mas_codec_writereg(MAS_REG_KMDB_FC, (value/10) << 8);
}
void sound_set_mdb_shape(int value)
{
if(!audio_is_initialized)
return;
mdb_shape_shadow = (mdb_shape_shadow & 0x02) | ((value/10) << 8);
mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
}
void sound_set_mdb_enable(int value)
{
if(!audio_is_initialized)
return;
mdb_shape_shadow = (mdb_shape_shadow & ~0x02) | (value?2:0);
mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
}
void sound_set_superbass(int value)
{
if(!audio_is_initialized)
return;
loudness_shadow = (loudness_shadow & ~0x04) | (value?4:0);
mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
}
#endif /* (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) */
void sound_set_channels(int value)
{
if(!audio_is_initialized)
return;
channel_configuration = value;
set_channel_config();
}
void sound_set_stereo_width(int value)
{
if(!audio_is_initialized)
return;
stereo_width = value;
if (channel_configuration == SOUND_CHAN_CUSTOM)
set_channel_config();
}
#endif /* SIMULATOR */
void (*sound_get_fn(int setting))(int value)
{
#ifdef SIMULATOR
(void)setting;
return NULL;
#else
if(!audio_is_initialized)
return NULL;
switch(setting) switch(setting)
{ {
case SOUND_VOLUME: case SOUND_VOLUME:
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) return &sound_set_volume;
tmp = 0x7f00 * value / 100;
mas_codec_writereg(0x10, tmp & 0xff00);
#elif (CONFIG_CODEC == MAS3507D) || defined HAVE_UDA1380
current_volume = VOLUME_MIN + (value * VOLUME_RANGE / 100);
set_prescaled_volume(); /* tenth of dB */
#endif
break;
case SOUND_BALANCE: case SOUND_BALANCE:
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) return &sound_set_balance;
tmp = ((value * 127 / 100) & 0xff) << 8;
mas_codec_writereg(0x11, tmp & 0xff00);
#elif CONFIG_CODEC == MAS3507D || defined HAVE_UDA1380
current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */
set_prescaled_volume();
#endif
break;
case SOUND_BASS: case SOUND_BASS:
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) return &sound_set_bass;
tmp = ((value * 8) & 0xff) << 8;
mas_codec_writereg(0x14, tmp & 0xff00);
#elif CONFIG_CODEC == MAS3507D
mas_writereg(MAS_REG_KBASS, bass_table[value+15]);
current_bass = value * 10;
set_prescaled_volume();
#elif defined(HAVE_UDA1380)
uda1380_set_bass(value >> 1);
current_bass = value * 10;
set_prescaled_volume();
#endif
break;
case SOUND_TREBLE: case SOUND_TREBLE:
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) return &sound_set_treble;
tmp = ((value * 8) & 0xff) << 8;
mas_codec_writereg(0x15, tmp & 0xff00);
#elif CONFIG_CODEC == MAS3507D
mas_writereg(MAS_REG_KTREBLE, treble_table[value+15]);
current_treble = value * 10;
set_prescaled_volume();
#elif defined(HAVE_UDA1380)
uda1380_set_treble(value >> 1);
current_treble = value * 10;
set_prescaled_volume();
#endif
break;
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
case SOUND_LOUDNESS: case SOUND_LOUDNESS:
loudness_shadow = (loudness_shadow & 0x04) | return &sound_set_loudness;
(MAX(MIN(value * 4, 0x44), 0) << 8);
mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
break;
case SOUND_AVC: case SOUND_AVC:
switch (value) { return &sound_set_avc;
case 1: /* 20ms */
tmp = (0x1 << 8) | (0x8 << 12);
break;
case 2: /* 2s */
tmp = (0x2 << 8) | (0x8 << 12);
break;
case 3: /* 4s */
tmp = (0x4 << 8) | (0x8 << 12);
break;
case 4: /* 8s */
tmp = (0x8 << 8) | (0x8 << 12);
break;
case -1: /* turn off and then turn on again to decay quickly */
tmp = mas_codec_readreg(MAS_REG_KAVC);
mas_codec_writereg(MAS_REG_KAVC, 0);
break;
default: /* off */
tmp = 0;
break;
}
mas_codec_writereg(MAS_REG_KAVC, tmp);
break;
case SOUND_MDB_STRENGTH: case SOUND_MDB_STRENGTH:
mas_codec_writereg(MAS_REG_KMDB_STR, (value & 0x7f) << 8); return &sound_set_mdb_strength;
break;
case SOUND_MDB_HARMONICS: case SOUND_MDB_HARMONICS:
tmp = value * 127 / 100; return &sound_set_mdb_harmonics;
mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0x7f) << 8);
break;
case SOUND_MDB_CENTER: case SOUND_MDB_CENTER:
mas_codec_writereg(MAS_REG_KMDB_FC, (value/10) << 8); return &sound_set_mdb_center;
break;
case SOUND_MDB_SHAPE: case SOUND_MDB_SHAPE:
mdb_shape_shadow = (mdb_shape_shadow & 0x02) | ((value/10) << 8); return &sound_set_mdb_shape;
mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
break;
case SOUND_MDB_ENABLE: case SOUND_MDB_ENABLE:
mdb_shape_shadow = (mdb_shape_shadow & ~0x02) | (value?2:0); return &sound_set_mdb_enable;
mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
break;
case SOUND_SUPERBASS: case SOUND_SUPERBASS:
loudness_shadow = (loudness_shadow & ~0x04) | return &sound_set_superbass;
(value?4:0);
mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
break;
#endif #endif
case SOUND_CHANNELS: case SOUND_CHANNELS:
channel_configuration = value; return &sound_set_channels;
set_channel_config();
break;
case SOUND_STEREO_WIDTH: case SOUND_STEREO_WIDTH:
stereo_width = value; return &sound_set_stereo_width;
if (channel_configuration == SOUND_CHAN_CUSTOM) default :
set_channel_config(); return NULL;
break;
} }
#endif /* SIMULATOR */ #endif /* SIMULATOR */
} }
void sound_set(int setting, int value)
{
void (*sound_set_val)(int)=sound_get_fn(setting);
if(sound_set_val)
sound_set_val(value);
}
int sound_val2phys(int setting, int value) int sound_val2phys(int setting, int value)
{ {
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)