X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/b2cb8efd285d451723c8b30d4b319f5a0143bf01..a4b8a9d5a2514f1c5303556390b224e2220bb2ee:/src/modules/module-lirc.c diff --git a/src/modules/module-lirc.c b/src/modules/module-lirc.c index d0e902f6..d4d2b26d 100644 --- a/src/modules/module-lirc.c +++ b/src/modules/module-lirc.c @@ -44,13 +44,15 @@ PA_MODULE_AUTHOR("Lennart Poettering"); PA_MODULE_DESCRIPTION("LIRC volume control"); PA_MODULE_VERSION(PACKAGE_VERSION); -PA_MODULE_LOAD_ONCE(TRUE); -PA_MODULE_USAGE("config= sink= appname="); +PA_MODULE_LOAD_ONCE(true); +PA_MODULE_USAGE("config= sink= appname= volume_limit= volume_step="); static const char* const valid_modargs[] = { "config", "sink", "appname", + "volume_limit", + "volume_step", NULL, }; @@ -61,10 +63,10 @@ struct userdata { char *sink_name; pa_module *module; float mute_toggle_save; + pa_volume_t volume_limit; + pa_volume_t volume_step; }; -#define DELTA (PA_VOLUME_NORM/20) - static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void*userdata) { struct userdata *u = userdata; char *name = NULL, *code = NULL; @@ -121,29 +123,29 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event if (!(s = pa_namereg_get(u->module->core, u->sink_name, PA_NAMEREG_SINK))) pa_log("Failed to get sink '%s'", u->sink_name); else { - pa_cvolume cv = *pa_sink_get_volume(s, FALSE); + pa_cvolume cv = *pa_sink_get_volume(s, false); switch (volchange) { case UP: - pa_cvolume_inc(&cv, DELTA); - pa_sink_set_volume(s, &cv, TRUE, TRUE); + pa_cvolume_inc_clamp(&cv, u->volume_step, u->volume_limit); + pa_sink_set_volume(s, &cv, true, true); break; case DOWN: - pa_cvolume_dec(&cv, DELTA); - pa_sink_set_volume(s, &cv, TRUE, TRUE); + pa_cvolume_dec(&cv, u->volume_step); + pa_sink_set_volume(s, &cv, true, true); break; case MUTE: - pa_sink_set_mute(s, TRUE, TRUE); + pa_sink_set_mute(s, true, true); break; case RESET: - pa_sink_set_mute(s, FALSE, TRUE); + pa_sink_set_mute(s, false, true); break; case MUTE_TOGGLE: - pa_sink_set_mute(s, !pa_sink_get_mute(s, FALSE), TRUE); + pa_sink_set_mute(s, !pa_sink_get_mute(s, false), true); break; case INVALID: @@ -162,7 +164,7 @@ fail: u->module->core->mainloop->io_free(u->io); u->io = NULL; - pa_module_unload_request(u->module, TRUE); + pa_module_unload_request(u->module, true); pa_xfree(code); } @@ -170,6 +172,8 @@ fail: int pa__init(pa_module*m) { pa_modargs *ma = NULL; struct userdata *u; + pa_volume_t volume_limit = PA_CLAMP_VOLUME(PA_VOLUME_NORM*3/2); + pa_volume_t volume_step = PA_VOLUME_NORM/20; pa_assert(m); @@ -178,6 +182,16 @@ int pa__init(pa_module*m) { goto fail; } + if (pa_modargs_get_value_u32(ma, "volume_limit", &volume_limit) < 0) { + pa_log("Failed to parse volume limit"); + goto fail; + } + + if (pa_modargs_get_value_u32(ma, "volume_step", &volume_step) < 0) { + pa_log("Failed to parse volume step"); + goto fail; + } + m->userdata = u = pa_xnew(struct userdata, 1); u->module = m; u->io = NULL; @@ -185,6 +199,8 @@ int pa__init(pa_module*m) { u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL)); u->lirc_fd = -1; u->mute_toggle_save = 0; + u->volume_limit = PA_CLAMP_VOLUME(volume_limit); + u->volume_step = PA_CLAMP_VOLUME(volume_step); if ((u->lirc_fd = lirc_init((char*) pa_modargs_get_value(ma, "appname", "pulseaudio"), 1)) < 0) { pa_log("lirc_init() failed.");