summaryrefslogtreecommitdiff
path: root/apps/menus/sound_menu.c
diff options
context:
space:
mode:
authorPurlingNayuki <cyq.yzfl@gmail.com>2013-12-21 21:33:54 +0800
committerJonathan Gordon <rockbox@jdgordon.info>2014-01-13 11:32:03 +0100
commitf0bec023d9ff45cede09274dff12f015f0830a38 (patch)
tree88af20d2941735f441491762daa4139d1bbbbed0 /apps/menus/sound_menu.c
parent31dfabfa254235516dde148f16fa2ac4d522944d (diff)
downloadrockbox-f0bec023d9ff45cede09274dff12f015f0830a38.tar.gz
rockbox-f0bec023d9ff45cede09274dff12f015f0830a38.zip
Implement volume limiter feature
Add a "volume limit" parameter to the configuration file. The maximum value of volume setting in sound menu will be limited to the same as volume limit. Also each time when setvol() is excuted, Rockbox will check if the global_settings.volume value larger than global_settings.volume_limit. If larger, take the value of volume_limit instead. The volume_limit argument shares the same maximum and minimum values with volume argument, while taking the maximum volume as its default value. Change-Id: I8ca9bc6ea6e617b48fc346aae5f2a0a1d259ae36 Reviewed-on: http://gerrit.rockbox.org/697 Reviewed-by: Jonathan Gordon <rockbox@jdgordon.info>
Diffstat (limited to 'apps/menus/sound_menu.c')
-rw-r--r--apps/menus/sound_menu.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/apps/menus/sound_menu.c b/apps/menus/sound_menu.c
index 28cc257193..8913266a5f 100644
--- a/apps/menus/sound_menu.c
+++ b/apps/menus/sound_menu.c
@@ -34,10 +34,50 @@
34#include "menu_common.h" 34#include "menu_common.h"
35#include "splash.h" 35#include "splash.h"
36#include "kernel.h" 36#include "kernel.h"
37#include "talk.h"
38#include "option_select.h"
39#include "misc.h"
40
41static int32_t get_dec_talkid(int value, int unit)
42{
43 return TALK_ID_DECIMAL(value, 1, unit);
44}
45
46static int volume_limit_callback(int action,const struct menu_item_ex *this_item)
47{
48 (void)this_item;
49
50 static struct int_setting volume_limit_int_setting;
51 volume_limit_int_setting.option_callback = NULL;
52 volume_limit_int_setting.unit = UNIT_DB;
53 volume_limit_int_setting.min = sound_min(SOUND_VOLUME);
54 volume_limit_int_setting.max = sound_max(SOUND_VOLUME);
55 volume_limit_int_setting.step = sound_steps(SOUND_VOLUME);
56 volume_limit_int_setting.formatter = NULL;
57 volume_limit_int_setting.get_talk_id = get_dec_talkid;
58
59 struct settings_list setting;
60 setting.flags = F_BANFROMQS|F_INT_SETTING|F_T_INT|F_NO_WRAP;
61 setting.lang_id = LANG_VOLUME_LIMIT;
62 setting.default_val.int_ = sound_max(SOUND_VOLUME);
63 setting.int_setting = &volume_limit_int_setting;
64
65 switch (action)
66 {
67 case ACTION_ENTER_MENUITEM:
68 setting.setting = &global_settings.volume_limit;
69 option_screen(&setting, NULL, false, ID2P(LANG_VOLUME_LIMIT));
70 case ACTION_EXIT_MENUITEM: /* on exit */
71 setvol();
72 break;
73 }
74 return action;
75}
37 76
38/***********************************/ 77/***********************************/
39/* SOUND MENU */ 78/* SOUND MENU */
40MENUITEM_SETTING(volume, &global_settings.volume, NULL); 79MENUITEM_SETTING(volume, &global_settings.volume, NULL);
80MENUITEM_SETTING(volume_limit, &global_settings.volume_limit, volume_limit_callback);
41#ifdef AUDIOHW_HAVE_BASS 81#ifdef AUDIOHW_HAVE_BASS
42MENUITEM_SETTING(bass, &global_settings.bass, 82MENUITEM_SETTING(bass, &global_settings.bass,
43#ifdef HAVE_SW_TONE_CONTROLS 83#ifdef HAVE_SW_TONE_CONTROLS
@@ -171,6 +211,7 @@ static int timestretch_callback(int action,const struct menu_item_ex *this_item)
171 211
172MAKE_MENU(sound_settings, ID2P(LANG_SOUND_SETTINGS), NULL, Icon_Audio, 212MAKE_MENU(sound_settings, ID2P(LANG_SOUND_SETTINGS), NULL, Icon_Audio,
173 &volume 213 &volume
214 ,&volume_limit
174#ifdef AUDIOHW_HAVE_BASS 215#ifdef AUDIOHW_HAVE_BASS
175 ,&bass 216 ,&bass
176#endif 217#endif