diff options
Diffstat (limited to 'apps/plugins/mpegplayer/mpeg_settings.c')
| -rw-r--r-- | apps/plugins/mpegplayer/mpeg_settings.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c index fa8fad8..fc99460 100644 --- a/apps/plugins/mpegplayer/mpeg_settings.c +++ b/apps/plugins/mpegplayer/mpeg_settings.c @@ -109,6 +109,11 @@ static struct configdata config[] = {TYPE_INT, 0, INT_MAX, &settings.displayoptions, "Display options", NULL, NULL}, #endif + {TYPE_INT, 0, 2, &settings.tone_controls, "Tone controls", NULL, NULL}, + {TYPE_INT, 0, 2, &settings.channel_modes, "Channel modes", NULL, NULL}, + {TYPE_INT, 0, 2, &settings.crossfeed, "Crossfeed", NULL, NULL}, + {TYPE_INT, 0, 2, &settings.equalizer, "Equalizer", NULL, NULL}, + {TYPE_INT, 0, 2, &settings.dithering, "Dithering", NULL, NULL}, }; static const struct opt_items noyes[2] = { @@ -121,6 +126,11 @@ static const struct opt_items enabledisable[2] = { { "Enable", -1 }, }; +static const struct opt_items globaloff[2] = { + { "Force off", -1 }, + { "Use sound setting", -1 }, +}; + static long mpeg_menu_sysevent_id; void mpeg_menu_sysevent_clear(void) @@ -184,6 +194,70 @@ static bool mpeg_set_option(const char* string, return usb; } +/* Sync a particular audio setting to global or mpegplayer forced off */ +static void sync_audio_setting(int setting, bool global) +{ + int val0, val1; + + switch (setting) + { + case MPEG_AUDIO_TONE_CONTROLS: + if (global || settings.tone_controls) + { + val0 = rb->global_settings->bass; + val1 = rb->global_settings->treble; + } + else + { + val0 = rb->sound_default(SOUND_BASS); + val1 = rb->sound_default(SOUND_TREBLE); + } + rb->sound_set(SOUND_BASS, val0); + rb->sound_set(SOUND_TREBLE, val1); + break; + + case MPEG_AUDIO_CHANNEL_MODES: + val0 = (global || settings.channel_modes) ? + rb->global_settings->channel_config : + SOUND_CHAN_STEREO; + rb->sound_set(SOUND_CHANNELS, val0); + break; + + case MPEG_AUDIO_CROSSFEED: + rb->dsp_set_crossfeed((global || settings.crossfeed) ? + rb->global_settings->crossfeed : false); + break; + + case MPEG_AUDIO_EQUALIZER: + rb->dsp_set_eq((global || settings.equalizer) ? + rb->global_settings->eq_enabled : false); + break; + + case MPEG_AUDIO_DITHERING: + rb->dsp_dither_enable((global || settings.dithering) ? + rb->global_settings->dithering_enabled : false); + break; + } +} + +/* Sync all audio settings to global or mpegplayer forced off */ +static void sync_audio_settings(bool global) +{ + static const int setting_index[] = + { + MPEG_AUDIO_TONE_CONTROLS, + MPEG_AUDIO_CHANNEL_MODES, + MPEG_AUDIO_CROSSFEED, + MPEG_AUDIO_EQUALIZER, + MPEG_AUDIO_DITHERING, + }; + unsigned i; + + for (i = 0; i < ARRAYLEN(setting_index); i++) + { + sync_audio_setting(setting_index[i], global); + } +} #ifndef HAVE_LCD_COLOR /* Cheapo splash implementation for the grey surface */ @@ -736,6 +810,79 @@ static void display_options(void) menu_exit(menu_id); } +static void audio_options(void) +{ + int result; + int menu_id; + bool menu_quit = false; + + static const struct menu_item items[] = { + [MPEG_AUDIO_TONE_CONTROLS] = + { "Tone Controls", NULL }, + [MPEG_AUDIO_CHANNEL_MODES] = + { "Channel Modes", NULL }, + [MPEG_AUDIO_CROSSFEED] = + { "Crossfeed", NULL }, + [MPEG_AUDIO_EQUALIZER] = + { "Equalizer", NULL }, + [MPEG_AUDIO_DITHERING] = + { "Dithering", NULL }, + }; + + menu_id = menu_init(rb, items, ARRAYLEN(items), + mpeg_menu_sysevent_callback, NULL, NULL, NULL); + + rb->button_clear_queue(); + + while (!menu_quit) + { + mpeg_menu_sysevent_clear(); + result = menu_show(menu_id); + + switch (result) + { + case MPEG_AUDIO_TONE_CONTROLS: + mpeg_set_option("Tone Controls", &settings.tone_controls, INT, + globaloff, 2, NULL); + sync_audio_setting(result, false); + break; + + case MPEG_AUDIO_CHANNEL_MODES: + mpeg_set_option("Channel Modes", &settings.channel_modes, + INT, globaloff, 2, NULL); + sync_audio_setting(result, false); + break; + + case MPEG_AUDIO_CROSSFEED: + mpeg_set_option("Crossfeed", &settings.crossfeed, INT, + globaloff, 2, NULL); + sync_audio_setting(result, false); + break; + + case MPEG_AUDIO_EQUALIZER: + mpeg_set_option("Equalizer", &settings.equalizer, INT, + globaloff, 2, NULL); + sync_audio_setting(result, false); + break; + + case MPEG_AUDIO_DITHERING: + mpeg_set_option("Dithering", &settings.dithering, INT, + globaloff, 2, NULL); + sync_audio_setting(result, false); + break; + + default: + menu_quit = true; + break; + } + + if (mpeg_menu_sysevent() != 0) + menu_quit = true; + } + + menu_exit(menu_id); +} + static void resume_options(void) { static const struct opt_items items[MPEG_RESUME_NUM_OPTIONS] = { @@ -775,6 +922,8 @@ int mpeg_menu(unsigned flags) struct menu_item items[] = { [MPEG_MENU_DISPLAY_SETTINGS] = { "Display Options", NULL }, + [MPEG_MENU_AUDIO_SETTINGS] = + { "Audio Options", NULL }, [MPEG_MENU_ENABLE_START_MENU] = { "Resume Options", NULL }, [MPEG_MENU_CLEAR_RESUMES] = @@ -809,6 +958,10 @@ int mpeg_menu(unsigned flags) display_options(); break; + case MPEG_MENU_AUDIO_SETTINGS: + audio_options(); + break; + case MPEG_MENU_ENABLE_START_MENU: resume_options(); break; @@ -849,6 +1002,11 @@ void init_settings(const char* filename) #if MPEG_OPTION_DITHERING_ENABLED settings.displayoptions = 0; /* No visual effects */ #endif + settings.tone_controls = false; + settings.channel_modes = false; + settings.crossfeed = false; + settings.equalizer = false; + settings.dithering = false; configfile_init(rb); @@ -886,6 +1044,9 @@ void init_settings(const char* filename) { settings.resume_time = 0; } + + /* Set our audio options */ + sync_audio_settings(false); } void save_settings(void) @@ -911,4 +1072,17 @@ void save_settings(void) configfile_update_entry(SETTINGS_FILENAME, "Display options", settings.displayoptions); #endif + configfile_update_entry(SETTINGS_FILENAME, "Tone controls", + settings.tone_controls); + configfile_update_entry(SETTINGS_FILENAME, "Channel modes", + settings.channel_modes); + configfile_update_entry(SETTINGS_FILENAME, "Crossfeed", + settings.crossfeed); + configfile_update_entry(SETTINGS_FILENAME, "Equalizer", + settings.equalizer); + configfile_update_entry(SETTINGS_FILENAME, "Dithering", + settings.dithering); + + /* Restore audio options */ + sync_audio_settings(true); } |