From 15a8f2fc7e46aa92b37d46673fd90c679a9180b6 Mon Sep 17 00:00:00 2001
From: Vladimir Kokarev <matrix47@gmail.com>
Date: Sat, 19 Sep 2009 19:48:43 +0400
Subject: [PATCH 2/2] lirc,mmkvd: added module parameters volume_limit, volume_step
volume_limit sets maximum volume that can be set from the module
default is PA_VOLUME_NORM*3/2 (150%)
volume_step sets step in volume changing
default is PA_VOLUME_NORM/20
values are of raw pa_volume_t type
Signed-off-by: Vladimir Kokarev <matrix47@gmail.com>
---
src/modules/module-lirc.c | 25 ++++++++++++++++++++-----
src/modules/module-mmkbd-evdev.c | 25 ++++++++++++++++++++-----
2 files changed, 40 insertions(+), 10 deletions(-)
diff --git a/src/modules/module-lirc.c b/src/modules/module-lirc.c
index d0e902f..59da31f 100644
|
a
|
b
|
|
| 45 | 45 | PA_MODULE_DESCRIPTION("LIRC volume control"); |
| 46 | 46 | PA_MODULE_VERSION(PACKAGE_VERSION); |
| 47 | 47 | PA_MODULE_LOAD_ONCE(TRUE); |
| 48 | | PA_MODULE_USAGE("config=<config file> sink=<sink name> appname=<lirc application name>"); |
| | 48 | PA_MODULE_USAGE("config=<config file> sink=<sink name> appname=<lirc application name> volume_limit=<volume limit> volume_step=<volume change step>"); |
| 49 | 49 | |
| 50 | 50 | static const char* const valid_modargs[] = { |
| 51 | 51 | "config", |
| 52 | 52 | "sink", |
| 53 | 53 | "appname", |
| | 54 | "volume_limit", |
| | 55 | "volume_step", |
| 54 | 56 | NULL, |
| 55 | 57 | }; |
| 56 | 58 | |
| … |
… |
|
| 61 | 63 | char *sink_name; |
| 62 | 64 | pa_module *module; |
| 63 | 65 | float mute_toggle_save; |
| | 66 | pa_volume_t volume_limit; |
| | 67 | pa_volume_t volume_step; |
| 64 | 68 | }; |
| 65 | 69 | |
| 66 | | #define DELTA (PA_VOLUME_NORM/20) |
| 67 | | |
| 68 | 70 | static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void*userdata) { |
| 69 | 71 | struct userdata *u = userdata; |
| 70 | 72 | char *name = NULL, *code = NULL; |
| … |
… |
|
| 125 | 127 | |
| 126 | 128 | switch (volchange) { |
| 127 | 129 | case UP: |
| 128 | | pa_cvolume_inc(&cv, DELTA); |
| | 130 | pa_cvolume_inc_lim(&cv, u->volume_step, u->volume_limit); |
| 129 | 131 | pa_sink_set_volume(s, &cv, TRUE, TRUE); |
| 130 | 132 | break; |
| 131 | 133 | |
| 132 | 134 | case DOWN: |
| 133 | | pa_cvolume_dec(&cv, DELTA); |
| | 135 | pa_cvolume_dec(&cv, u->volume_step); |
| 134 | 136 | pa_sink_set_volume(s, &cv, TRUE, TRUE); |
| 135 | 137 | break; |
| 136 | 138 | |
| … |
… |
|
| 178 | 180 | goto fail; |
| 179 | 181 | } |
| 180 | 182 | |
| | 183 | pa_volume_t volume_limit = PA_VOLUME_NORM*3/2; |
| | 184 | pa_volume_t volume_step = PA_VOLUME_NORM/20; |
| | 185 | if (pa_modargs_get_value_u32(ma, "volume_limit", &volume_limit) < 0) { |
| | 186 | pa_log("Failed to parse volume limit"); |
| | 187 | goto fail; |
| | 188 | } |
| | 189 | if (pa_modargs_get_value_u32(ma, "volume_step", &volume_step) < 0) { |
| | 190 | pa_log("Failed to parse volume step"); |
| | 191 | goto fail; |
| | 192 | } |
| | 193 | |
| 181 | 194 | m->userdata = u = pa_xnew(struct userdata, 1); |
| 182 | 195 | u->module = m; |
| 183 | 196 | u->io = NULL; |
| … |
… |
|
| 185 | 198 | u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL)); |
| 186 | 199 | u->lirc_fd = -1; |
| 187 | 200 | u->mute_toggle_save = 0; |
| | 201 | u->volume_limit = volume_limit; |
| | 202 | u->volume_step = volume_step; |
| 188 | 203 | |
| 189 | 204 | if ((u->lirc_fd = lirc_init((char*) pa_modargs_get_value(ma, "appname", "pulseaudio"), 1)) < 0) { |
| 190 | 205 | pa_log("lirc_init() failed."); |
diff --git a/src/modules/module-mmkbd-evdev.c b/src/modules/module-mmkbd-evdev.c
index 516bf41..6768b52 100644
|
a
|
b
|
|
| 48 | 48 | PA_MODULE_DESCRIPTION("Multimedia keyboard support via Linux evdev"); |
| 49 | 49 | PA_MODULE_VERSION(PACKAGE_VERSION); |
| 50 | 50 | PA_MODULE_LOAD_ONCE(FALSE); |
| 51 | | PA_MODULE_USAGE("device=<evdev device> sink=<sink name>"); |
| | 51 | PA_MODULE_USAGE("device=<evdev device> sink=<sink name> volume_limit=<volume limit> volume_step=<volume change step>"); |
| 52 | 52 | |
| 53 | 53 | #define DEFAULT_DEVICE "/dev/input/event0" |
| 54 | 54 | |
| 55 | 55 | static const char* const valid_modargs[] = { |
| 56 | 56 | "device", |
| 57 | 57 | "sink", |
| | 58 | "volume_limit", |
| | 59 | "volume_step", |
| 58 | 60 | NULL, |
| 59 | 61 | }; |
| 60 | 62 | |
| … |
… |
|
| 63 | 65 | pa_io_event *io; |
| 64 | 66 | char *sink_name; |
| 65 | 67 | pa_module *module; |
| | 68 | pa_volume_t volume_limit; |
| | 69 | pa_volume_t volume_step; |
| 66 | 70 | }; |
| 67 | 71 | |
| 68 | | #define DELTA (PA_VOLUME_NORM/20) |
| 69 | | |
| 70 | 72 | static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void*userdata) { |
| 71 | 73 | struct userdata *u = userdata; |
| 72 | 74 | |
| … |
… |
|
| 120 | 122 | |
| 121 | 123 | switch (volchange) { |
| 122 | 124 | case UP: |
| 123 | | pa_cvolume_inc(&cv, DELTA); |
| | 125 | pa_cvolume_inc_lim(&cv, u->volume_step, u->volume_limit); |
| 124 | 126 | pa_sink_set_volume(s, &cv, TRUE, TRUE); |
| 125 | 127 | break; |
| 126 | 128 | |
| 127 | 129 | case DOWN: |
| 128 | | pa_cvolume_dec(&cv, DELTA); |
| | 130 | pa_cvolume_dec(&cv, u->volume_step); |
| 129 | 131 | pa_sink_set_volume(s, &cv, TRUE, TRUE); |
| 130 | 132 | break; |
| 131 | 133 | |
| … |
… |
|
| 168 | 170 | goto fail; |
| 169 | 171 | } |
| 170 | 172 | |
| | 173 | pa_volume_t volume_limit = PA_VOLUME_NORM*3/2; |
| | 174 | pa_volume_t volume_step = PA_VOLUME_NORM/20; |
| | 175 | if (pa_modargs_get_value_u32(ma, "volume_limit", &volume_limit) < 0) { |
| | 176 | pa_log("Failed to parse volume limit"); |
| | 177 | goto fail; |
| | 178 | } |
| | 179 | if (pa_modargs_get_value_u32(ma, "volume_step", &volume_step) < 0) { |
| | 180 | pa_log("Failed to parse volume step"); |
| | 181 | goto fail; |
| | 182 | } |
| | 183 | |
| 171 | 184 | m->userdata = u = pa_xnew(struct userdata, 1); |
| 172 | 185 | u->module = m; |
| 173 | 186 | u->io = NULL; |
| 174 | 187 | u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL)); |
| 175 | 188 | u->fd = -1; |
| 176 | 189 | u->fd_type = 0; |
| | 190 | u->volume_limit = volume_limit; |
| | 191 | u->volume_step = volume_step; |
| 177 | 192 | |
| 178 | 193 | if ((u->fd = open(pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), O_RDONLY|O_NOCTTY)) < 0) { |
| 179 | 194 | pa_log("Failed to open evdev device: %s", pa_cstrerror(errno)); |