summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Ferrare <kevin@rockbox.org>2005-11-06 03:18:34 +0000
committerKevin Ferrare <kevin@rockbox.org>2005-11-06 03:18:34 +0000
commit9b5264d37faf0588f996a1716c41a6e51f4d16ea (patch)
tree03d6f571683fdaa2b2877c4df51fb75df9d76fae
parentec8f328d89f7db22f9894148e2c0431e44ebf191 (diff)
downloadrockbox-9b5264d37faf0588f996a1716c41a6e51f4d16ea.zip
rockbox-9b5264d37faf0588f996a1716c41a6e51f4d16ea.tar.gz
rockbox-9b5264d37faf0588f996a1716c41a6e51f4d16ea.tar.bz2
rockbox-9b5264d37faf0588f996a1716c41a6e51f4d16ea.tar.xz
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
-rw-r--r--apps/gui/select.c2
-rw-r--r--apps/gui/select.h1
-rw-r--r--apps/settings.c25
-rw-r--r--apps/sound_menu.c107
-rw-r--r--firmware/export/sound.h20
-rw-r--r--firmware/sound.c293
6 files changed, 249 insertions, 199 deletions
diff --git a/apps/gui/select.c b/apps/gui/select.c
index 8323783..58747fb 100644
--- a/apps/gui/select.c
+++ b/apps/gui/select.c
@@ -44,6 +44,7 @@ void gui_select_init_numeric(struct gui_select * select,
select->min_value=min_value;
select->max_value=max_value+1;
select->option=init_value;
+ select->nb_decimals=0;
select->step=step;
select->extra_string=unit;
select->formatter=formatter;
@@ -62,6 +63,7 @@ void gui_select_init_items(struct gui_select * select,
select->min_value=0;
select->max_value=nb_items;
select->option=selected;
+ select->nb_decimals=0;
select->step=1;
select->formatter=NULL;
select->items=items;
diff --git a/apps/gui/select.h b/apps/gui/select.h
index e79dcd3..87ecb1c 100644
--- a/apps/gui/select.h
+++ b/apps/gui/select.h
@@ -80,6 +80,7 @@ struct gui_select
int max_value;
int step;
int option;
+ int nb_decimals;
const char * extra_string;
/* In the case the option is a number */
void (*formatter)(char* dest,
diff --git a/apps/settings.c b/apps/settings.c
index 6e863e7..870376c 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -1418,12 +1418,14 @@ bool set_int(const char* string,
gui_syncselect_draw(&select);
talk_unit(voice_unit, *variable);
if ( function )
- function(gui_select_get_selected(&select));
+ function(*variable);
}
gui_syncstatusbar_draw(&statusbars, false);
if(gui_select_is_canceled(&select))
{
*variable=oldvalue;
+ if ( function )
+ function(*variable);
return false;
}
if(default_event_handler(button) == SYS_USB_CONNECTED)
@@ -1446,11 +1448,14 @@ bool set_int(const char* string,
else \
*(bool *)dest=value?true:false
-#define set_int_fromtype(type, dest, var) \
- if (type == INT) \
- dest=*(int *)var; \
- else \
- dest=*(bool *)var?1:0
+#define type_fromvoidptr(type, value) \
+ (type == INT)? \
+ (int)(*(int*)(value)) \
+ : \
+ (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,
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 oldvalue;
/* oldvalue=*variable; */
- set_int_fromtype(type, oldvalue, variable);
+ oldvalue=get_int_fromtype(type, variable);
struct gui_select select;
gui_select_init_items(&select, string, oldvalue, options, numoptions);
gui_syncselect_draw(&select);
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) )
{
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)
talk_id(options[gui_select_get_selected(&select)].voice_id, false);
if ( function )
- function(*(int *)variable);
+ function(type_fromvoidptr(type, variable));
}
gui_syncstatusbar_draw(&statusbars, false);
if(gui_select_is_canceled(&select))
{
/* *variable=oldvalue; */
set_type_fromint(type, variable, oldvalue);
+ if ( function )
+ function(type_fromvoidptr(type, variable));
return false;
}
if(default_event_handler(button) == SYS_USB_CONNECTED)
diff --git a/apps/sound_menu.c b/apps/sound_menu.c
index 738c457..20e44f7 100644
--- a/apps/sound_menu.c
+++ b/apps/sound_menu.c
@@ -50,104 +50,41 @@ static const char* const fmt[] =
"%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,
int* variable,
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 steps;
- int button;
-
- unit = sound_unit(setting);
- numdec = sound_numdecimals(setting);
- steps = sound_steps(setting);
- min = sound_min(setting);
- max = sound_max(setting);
+ const char* unit = sound_unit(setting);
+ int numdec = sound_numdecimals(setting);
+ int steps = sound_steps(setting);
+ int min = sound_min(setting);
+ int max = sound_max(setting);
+ void(*sound_callback)(int)=sound_get_fn(setting);
if (*unit == 'd') /* crude reconstruction */
talkunit = UNIT_DB;
else if (*unit == '%')
talkunit = UNIT_PERCENT;
else if (*unit == 'H')
talkunit = UNIT_HERTZ;
-
-#ifdef HAVE_LCD_BITMAP
- if(global_settings.statusbar)
- lcd_setmargins(0, STATUSBAR_HEIGHT);
+ if(!numdec)
+ return set_int(string, unit, talkunit, variable, sound_callback,
+ steps, min, max, NULL );
else
- lcd_setmargins(0, 0);
-#endif
- lcd_clear_display();
- lcd_puts_scroll(0,0,string);
-
- 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);
+ {/* Decimal number */
+ selected_setting=setting;
+ return set_int(string, unit, talkunit, variable, sound_callback,
+ steps, min, max, &dec_sound_formatter );
}
- lcd_stop_scroll();
- return false;
}
static bool volume(void)
diff --git a/firmware/export/sound.h b/firmware/export/sound.h
index 772e2d6..ed8a151 100644
--- a/firmware/export/sound.h
+++ b/firmware/export/sound.h
@@ -45,6 +45,26 @@
#define SOUND_CHAN_MONO_RIGHT 4
#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);
int sound_min(int setting);
int sound_max(int setting);
diff --git a/firmware/sound.c b/firmware/sound.c
index a36c244..c6f1bb6 100644
--- a/firmware/sound.c
+++ b/firmware/sound.c
@@ -494,145 +494,228 @@ unsigned long mdb_shape_shadow = 0;
unsigned long loudness_shadow = 0;
#endif
-void sound_set(int setting, int value)
-{
-#ifdef SIMULATOR
- setting = value;
-#else
-#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
- int tmp;
-#endif
+#ifndef SIMULATOR
+void sound_set_volume(int value)
+{
if(!audio_is_initialized)
return;
-
- switch(setting)
- {
- case SOUND_VOLUME:
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
- tmp = 0x7f00 * value / 100;
- mas_codec_writereg(0x10, tmp & 0xff00);
+ 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 */
+ current_volume = VOLUME_MIN + (value * VOLUME_RANGE / 100);
+ set_prescaled_volume(); /* tenth of dB */
#endif
- break;
+}
- case SOUND_BALANCE:
+void sound_set_balance(int value)
+{
+ if(!audio_is_initialized)
+ return;
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
- tmp = ((value * 127 / 100) & 0xff) << 8;
- mas_codec_writereg(0x11, tmp & 0xff00);
+ 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();
+ current_balance = value * VOLUME_RANGE / 100; /* tenth of dB */
+ set_prescaled_volume();
#endif
- break;
+}
- case SOUND_BASS:
+void sound_set_bass(int value)
+{
+ if(!audio_is_initialized)
+ return;
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
- tmp = ((value * 8) & 0xff) << 8;
- mas_codec_writereg(0x14, tmp & 0xff00);
+ 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();
+ 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();
+ uda1380_set_bass(value >> 1);
+ current_bass = value * 10;
+ set_prescaled_volume();
#endif
- break;
+}
- case SOUND_TREBLE:
+void sound_set_treble(int value)
+{
+ if(!audio_is_initialized)
+ return;
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
- tmp = ((value * 8) & 0xff) << 8;
- mas_codec_writereg(0x15, tmp & 0xff00);
+ 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();
+ 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();
+ uda1380_set_treble(value >> 1);
+ current_treble = value * 10;
+ set_prescaled_volume();
#endif
- break;
-
+}
+
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
- case SOUND_LOUDNESS:
- loudness_shadow = (loudness_shadow & 0x04) |
- (MAX(MIN(value * 4, 0x44), 0) << 8);
- mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
+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 SOUND_AVC:
- 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);
+ 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)
+ {
+ case SOUND_VOLUME:
+ return &sound_set_volume;
+ case SOUND_BALANCE:
+ return &sound_set_balance;
+ case SOUND_BASS:
+ return &sound_set_bass;
+ case SOUND_TREBLE:
+ return &sound_set_treble;
+#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
+ case SOUND_LOUDNESS:
+ return &sound_set_loudness;
+ case SOUND_AVC:
+ return &sound_set_avc;
case SOUND_MDB_STRENGTH:
- mas_codec_writereg(MAS_REG_KMDB_STR, (value & 0x7f) << 8);
- break;
-
+ return &sound_set_mdb_strength;
case SOUND_MDB_HARMONICS:
- tmp = value * 127 / 100;
- mas_codec_writereg(MAS_REG_KMDB_HAR, (tmp & 0x7f) << 8);
- break;
-
+ return &sound_set_mdb_harmonics;
case SOUND_MDB_CENTER:
- mas_codec_writereg(MAS_REG_KMDB_FC, (value/10) << 8);
- break;
-
+ return &sound_set_mdb_center;
case SOUND_MDB_SHAPE:
- mdb_shape_shadow = (mdb_shape_shadow & 0x02) | ((value/10) << 8);
- mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
- break;
-
+ return &sound_set_mdb_shape;
case SOUND_MDB_ENABLE:
- mdb_shape_shadow = (mdb_shape_shadow & ~0x02) | (value?2:0);
- mas_codec_writereg(MAS_REG_KMDB_SWITCH, mdb_shape_shadow);
- break;
-
+ return &sound_set_mdb_enable;
case SOUND_SUPERBASS:
- loudness_shadow = (loudness_shadow & ~0x04) |
- (value?4:0);
- mas_codec_writereg(MAS_REG_KLOUDNESS, loudness_shadow);
- break;
-#endif
+ return &sound_set_superbass;
+#endif
case SOUND_CHANNELS:
- channel_configuration = value;
- set_channel_config();
- break;
-
+ return &sound_set_channels;
case SOUND_STEREO_WIDTH:
- stereo_width = value;
- if (channel_configuration == SOUND_CHAN_CUSTOM)
- set_channel_config();
- break;
+ return &sound_set_stereo_width;
+ default :
+ return NULL;
}
#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)
{
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
@@ -677,13 +760,13 @@ void sound_set_pitch(int pitch)
{
/* Calculate the new (bogus) frequency */
val = 18432 * 1000 / pitch;
-
+
mas_writemem(MAS_BANK_D0, MAS_D0_OFREQ_CONTROL, &val, 1);
/* We must tell the MAS that the frequency has changed.
* This will unfortunately cause a short silence. */
mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &shadow_io_control_main, 1);
-
+
last_pitch = pitch;
}
}