From 9b5264d37faf0588f996a1716c41a6e51f4d16ea Mon Sep 17 00:00:00 2001 From: Kevin Ferrare Date: Sun, 6 Nov 2005 03:18:34 +0000 Subject: [PATCH] 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 --- apps/gui/select.c | 2 + apps/gui/select.h | 1 + apps/settings.c | 25 ++-- apps/sound_menu.c | 107 +++----------- firmware/export/sound.h | 20 +++ firmware/sound.c | 317 +++++++++++++++++++++++++--------------- 6 files changed, 261 insertions(+), 211 deletions(-) diff --git a/apps/gui/select.c b/apps/gui/select.c index 8323783448..58747fbd85 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 e79dcd3b1b..87ecb1c75c 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 6e863e7fa7..870376c8b2 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 738c457af8..20e44f767c 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 772e2d6655..ed8a151c9b 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 a36c244d1b..c6f1bb6147 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; - +#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) { case SOUND_VOLUME: -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) - 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; - + return &sound_set_volume; case SOUND_BALANCE: -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) - 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; - + return &sound_set_balance; case SOUND_BASS: -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) - 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; - + return &sound_set_bass; case SOUND_TREBLE: -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) - 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; - + return &sound_set_treble; #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); - break; - + return &sound_set_loudness; 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); - break; - + 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; } }