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 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 | ||
114 | static const struct opt_items noyes[2] = { | 119 | static 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 | ||
129 | static const struct opt_items globaloff[2] = { | ||
130 | { "Force off", -1 }, | ||
131 | { "Use sound setting", -1 }, | ||
132 | }; | ||
133 | |||
124 | static long mpeg_menu_sysevent_id; | 134 | static long mpeg_menu_sysevent_id; |
125 | 135 | ||
126 | void mpeg_menu_sysevent_clear(void) | 136 | void 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 */ | ||
198 | static 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 */ | ||
244 | static 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 | ||
813 | static 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 | |||
739 | static void resume_options(void) | 886 | static 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 | ||
891 | void save_settings(void) | 1052 | void 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 | } |