summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/mpeg_settings.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/mpegplayer/mpeg_settings.c')
-rw-r--r--apps/plugins/mpegplayer/mpeg_settings.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c
index fa8fad8b4c..fc99460d74 100644
--- a/apps/plugins/mpegplayer/mpeg_settings.c
+++ b/apps/plugins/mpegplayer/mpeg_settings.c
@@ -109,6 +109,11 @@ static struct configdata config[] =
109 {TYPE_INT, 0, INT_MAX, &settings.displayoptions, "Display options", 109 {TYPE_INT, 0, INT_MAX, &settings.displayoptions, "Display options",
110 NULL, NULL}, 110 NULL, NULL},
111#endif 111#endif
112 {TYPE_INT, 0, 2, &settings.tone_controls, "Tone controls", NULL, NULL},
113 {TYPE_INT, 0, 2, &settings.channel_modes, "Channel modes", NULL, NULL},
114 {TYPE_INT, 0, 2, &settings.crossfeed, "Crossfeed", NULL, NULL},
115 {TYPE_INT, 0, 2, &settings.equalizer, "Equalizer", NULL, NULL},
116 {TYPE_INT, 0, 2, &settings.dithering, "Dithering", NULL, NULL},
112}; 117};
113 118
114static const struct opt_items noyes[2] = { 119static const struct opt_items noyes[2] = {
@@ -121,6 +126,11 @@ static const struct opt_items enabledisable[2] = {
121 { "Enable", -1 }, 126 { "Enable", -1 },
122}; 127};
123 128
129static const struct opt_items globaloff[2] = {
130 { "Force off", -1 },
131 { "Use sound setting", -1 },
132};
133
124static long mpeg_menu_sysevent_id; 134static long mpeg_menu_sysevent_id;
125 135
126void mpeg_menu_sysevent_clear(void) 136void mpeg_menu_sysevent_clear(void)
@@ -184,6 +194,70 @@ static bool mpeg_set_option(const char* string,
184 return usb; 194 return usb;
185} 195}
186 196
197/* Sync a particular audio setting to global or mpegplayer forced off */
198static void sync_audio_setting(int setting, bool global)
199{
200 int val0, val1;
201
202 switch (setting)
203 {
204 case MPEG_AUDIO_TONE_CONTROLS:
205 if (global || settings.tone_controls)
206 {
207 val0 = rb->global_settings->bass;
208 val1 = rb->global_settings->treble;
209 }
210 else
211 {
212 val0 = rb->sound_default(SOUND_BASS);
213 val1 = rb->sound_default(SOUND_TREBLE);
214 }
215 rb->sound_set(SOUND_BASS, val0);
216 rb->sound_set(SOUND_TREBLE, val1);
217 break;
218
219 case MPEG_AUDIO_CHANNEL_MODES:
220 val0 = (global || settings.channel_modes) ?
221 rb->global_settings->channel_config :
222 SOUND_CHAN_STEREO;
223 rb->sound_set(SOUND_CHANNELS, val0);
224 break;
225
226 case MPEG_AUDIO_CROSSFEED:
227 rb->dsp_set_crossfeed((global || settings.crossfeed) ?
228 rb->global_settings->crossfeed : false);
229 break;
230
231 case MPEG_AUDIO_EQUALIZER:
232 rb->dsp_set_eq((global || settings.equalizer) ?
233 rb->global_settings->eq_enabled : false);
234 break;
235
236 case MPEG_AUDIO_DITHERING:
237 rb->dsp_dither_enable((global || settings.dithering) ?
238 rb->global_settings->dithering_enabled : false);
239 break;
240 }
241}
242
243/* Sync all audio settings to global or mpegplayer forced off */
244static void sync_audio_settings(bool global)
245{
246 static const int setting_index[] =
247 {
248 MPEG_AUDIO_TONE_CONTROLS,
249 MPEG_AUDIO_CHANNEL_MODES,
250 MPEG_AUDIO_CROSSFEED,
251 MPEG_AUDIO_EQUALIZER,
252 MPEG_AUDIO_DITHERING,
253 };
254 unsigned i;
255
256 for (i = 0; i < ARRAYLEN(setting_index); i++)
257 {
258 sync_audio_setting(setting_index[i], global);
259 }
260}
187 261
188#ifndef HAVE_LCD_COLOR 262#ifndef HAVE_LCD_COLOR
189/* Cheapo splash implementation for the grey surface */ 263/* Cheapo splash implementation for the grey surface */
@@ -736,6 +810,79 @@ static void display_options(void)
736 menu_exit(menu_id); 810 menu_exit(menu_id);
737} 811}
738 812
813static void audio_options(void)
814{
815 int result;
816 int menu_id;
817 bool menu_quit = false;
818
819 static const struct menu_item items[] = {
820 [MPEG_AUDIO_TONE_CONTROLS] =
821 { "Tone Controls", NULL },
822 [MPEG_AUDIO_CHANNEL_MODES] =
823 { "Channel Modes", NULL },
824 [MPEG_AUDIO_CROSSFEED] =
825 { "Crossfeed", NULL },
826 [MPEG_AUDIO_EQUALIZER] =
827 { "Equalizer", NULL },
828 [MPEG_AUDIO_DITHERING] =
829 { "Dithering", NULL },
830 };
831
832 menu_id = menu_init(rb, items, ARRAYLEN(items),
833 mpeg_menu_sysevent_callback, NULL, NULL, NULL);
834
835 rb->button_clear_queue();
836
837 while (!menu_quit)
838 {
839 mpeg_menu_sysevent_clear();
840 result = menu_show(menu_id);
841
842 switch (result)
843 {
844 case MPEG_AUDIO_TONE_CONTROLS:
845 mpeg_set_option("Tone Controls", &settings.tone_controls, INT,
846 globaloff, 2, NULL);
847 sync_audio_setting(result, false);
848 break;
849
850 case MPEG_AUDIO_CHANNEL_MODES:
851 mpeg_set_option("Channel Modes", &settings.channel_modes,
852 INT, globaloff, 2, NULL);
853 sync_audio_setting(result, false);
854 break;
855
856 case MPEG_AUDIO_CROSSFEED:
857 mpeg_set_option("Crossfeed", &settings.crossfeed, INT,
858 globaloff, 2, NULL);
859 sync_audio_setting(result, false);
860 break;
861
862 case MPEG_AUDIO_EQUALIZER:
863 mpeg_set_option("Equalizer", &settings.equalizer, INT,
864 globaloff, 2, NULL);
865 sync_audio_setting(result, false);
866 break;
867
868 case MPEG_AUDIO_DITHERING:
869 mpeg_set_option("Dithering", &settings.dithering, INT,
870 globaloff, 2, NULL);
871 sync_audio_setting(result, false);
872 break;
873
874 default:
875 menu_quit = true;
876 break;
877 }
878
879 if (mpeg_menu_sysevent() != 0)
880 menu_quit = true;
881 }
882
883 menu_exit(menu_id);
884}
885
739static void resume_options(void) 886static void resume_options(void)
740{ 887{
741 static const struct opt_items items[MPEG_RESUME_NUM_OPTIONS] = { 888 static const struct opt_items items[MPEG_RESUME_NUM_OPTIONS] = {
@@ -775,6 +922,8 @@ int mpeg_menu(unsigned flags)
775 struct menu_item items[] = { 922 struct menu_item items[] = {
776 [MPEG_MENU_DISPLAY_SETTINGS] = 923 [MPEG_MENU_DISPLAY_SETTINGS] =
777 { "Display Options", NULL }, 924 { "Display Options", NULL },
925 [MPEG_MENU_AUDIO_SETTINGS] =
926 { "Audio Options", NULL },
778 [MPEG_MENU_ENABLE_START_MENU] = 927 [MPEG_MENU_ENABLE_START_MENU] =
779 { "Resume Options", NULL }, 928 { "Resume Options", NULL },
780 [MPEG_MENU_CLEAR_RESUMES] = 929 [MPEG_MENU_CLEAR_RESUMES] =
@@ -809,6 +958,10 @@ int mpeg_menu(unsigned flags)
809 display_options(); 958 display_options();
810 break; 959 break;
811 960
961 case MPEG_MENU_AUDIO_SETTINGS:
962 audio_options();
963 break;
964
812 case MPEG_MENU_ENABLE_START_MENU: 965 case MPEG_MENU_ENABLE_START_MENU:
813 resume_options(); 966 resume_options();
814 break; 967 break;
@@ -849,6 +1002,11 @@ void init_settings(const char* filename)
849#if MPEG_OPTION_DITHERING_ENABLED 1002#if MPEG_OPTION_DITHERING_ENABLED
850 settings.displayoptions = 0; /* No visual effects */ 1003 settings.displayoptions = 0; /* No visual effects */
851#endif 1004#endif
1005 settings.tone_controls = false;
1006 settings.channel_modes = false;
1007 settings.crossfeed = false;
1008 settings.equalizer = false;
1009 settings.dithering = false;
852 1010
853 configfile_init(rb); 1011 configfile_init(rb);
854 1012
@@ -886,6 +1044,9 @@ void init_settings(const char* filename)
886 { 1044 {
887 settings.resume_time = 0; 1045 settings.resume_time = 0;
888 } 1046 }
1047
1048 /* Set our audio options */
1049 sync_audio_settings(false);
889} 1050}
890 1051
891void save_settings(void) 1052void save_settings(void)
@@ -911,4 +1072,17 @@ void save_settings(void)
911 configfile_update_entry(SETTINGS_FILENAME, "Display options", 1072 configfile_update_entry(SETTINGS_FILENAME, "Display options",
912 settings.displayoptions); 1073 settings.displayoptions);
913#endif 1074#endif
1075 configfile_update_entry(SETTINGS_FILENAME, "Tone controls",
1076 settings.tone_controls);
1077 configfile_update_entry(SETTINGS_FILENAME, "Channel modes",
1078 settings.channel_modes);
1079 configfile_update_entry(SETTINGS_FILENAME, "Crossfeed",
1080 settings.crossfeed);
1081 configfile_update_entry(SETTINGS_FILENAME, "Equalizer",
1082 settings.equalizer);
1083 configfile_update_entry(SETTINGS_FILENAME, "Dithering",
1084 settings.dithering);
1085
1086 /* Restore audio options */
1087 sync_audio_settings(true);
914} 1088}