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
This commit is contained in:
Vladimir Kokarev 2009-11-05 04:55:21 +01:00 committed by Lennart Poettering
parent d2c59354d5
commit 7793da371b
2 changed files with 42 additions and 10 deletions

View file

@ -45,12 +45,14 @@ PA_MODULE_AUTHOR("Lennart Poettering");
PA_MODULE_DESCRIPTION("LIRC volume control"); PA_MODULE_DESCRIPTION("LIRC volume control");
PA_MODULE_VERSION(PACKAGE_VERSION); PA_MODULE_VERSION(PACKAGE_VERSION);
PA_MODULE_LOAD_ONCE(TRUE); PA_MODULE_LOAD_ONCE(TRUE);
PA_MODULE_USAGE("config=<config file> sink=<sink name> appname=<lirc application name>"); PA_MODULE_USAGE("config=<config file> sink=<sink name> appname=<lirc application name> volume_limit=<volume limit> volume_step=<volume change step>");
static const char* const valid_modargs[] = { static const char* const valid_modargs[] = {
"config", "config",
"sink", "sink",
"appname", "appname",
"volume_limit",
"volume_step",
NULL, NULL,
}; };
@ -61,10 +63,10 @@ struct userdata {
char *sink_name; char *sink_name;
pa_module *module; pa_module *module;
float mute_toggle_save; 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) { 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; struct userdata *u = userdata;
char *name = NULL, *code = NULL; char *name = NULL, *code = NULL;
@ -125,12 +127,12 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event
switch (volchange) { switch (volchange) {
case UP: case UP:
pa_cvolume_inc(&cv, DELTA); pa_cvolume_inc_clamp(&cv, u->volume_step, u->volume_limit);
pa_sink_set_volume(s, &cv, TRUE, TRUE); pa_sink_set_volume(s, &cv, TRUE, TRUE);
break; break;
case DOWN: case DOWN:
pa_cvolume_dec(&cv, DELTA); pa_cvolume_dec(&cv, u->volume_step);
pa_sink_set_volume(s, &cv, TRUE, TRUE); pa_sink_set_volume(s, &cv, TRUE, TRUE);
break; break;
@ -170,6 +172,8 @@ fail:
int pa__init(pa_module*m) { int pa__init(pa_module*m) {
pa_modargs *ma = NULL; pa_modargs *ma = NULL;
struct userdata *u; struct userdata *u;
pa_volume_t volume_limit = PA_VOLUME_NORM*3/2;
pa_volume_t volume_step = PA_VOLUME_NORM/20;
pa_assert(m); pa_assert(m);
@ -178,6 +182,16 @@ int pa__init(pa_module*m) {
goto fail; 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); m->userdata = u = pa_xnew(struct userdata, 1);
u->module = m; u->module = m;
u->io = NULL; 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->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
u->lirc_fd = -1; u->lirc_fd = -1;
u->mute_toggle_save = 0; u->mute_toggle_save = 0;
u->volume_limit = volume_limit;
u->volume_step = volume_step;
if ((u->lirc_fd = lirc_init((char*) pa_modargs_get_value(ma, "appname", "pulseaudio"), 1)) < 0) { if ((u->lirc_fd = lirc_init((char*) pa_modargs_get_value(ma, "appname", "pulseaudio"), 1)) < 0) {
pa_log("lirc_init() failed."); pa_log("lirc_init() failed.");

View file

@ -48,13 +48,15 @@ PA_MODULE_AUTHOR("Lennart Poettering");
PA_MODULE_DESCRIPTION("Multimedia keyboard support via Linux evdev"); PA_MODULE_DESCRIPTION("Multimedia keyboard support via Linux evdev");
PA_MODULE_VERSION(PACKAGE_VERSION); PA_MODULE_VERSION(PACKAGE_VERSION);
PA_MODULE_LOAD_ONCE(FALSE); PA_MODULE_LOAD_ONCE(FALSE);
PA_MODULE_USAGE("device=<evdev device> sink=<sink name>"); PA_MODULE_USAGE("device=<evdev device> sink=<sink name> volume_limit=<volume limit> volume_step=<volume change step>");
#define DEFAULT_DEVICE "/dev/input/event0" #define DEFAULT_DEVICE "/dev/input/event0"
static const char* const valid_modargs[] = { static const char* const valid_modargs[] = {
"device", "device",
"sink", "sink",
"volume_limit",
"volume_step",
NULL, NULL,
}; };
@ -63,10 +65,10 @@ struct userdata {
pa_io_event *io; pa_io_event *io;
char *sink_name; char *sink_name;
pa_module *module; pa_module *module;
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) { 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; struct userdata *u = userdata;
@ -120,12 +122,12 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event
switch (volchange) { switch (volchange) {
case UP: case UP:
pa_cvolume_inc(&cv, DELTA); pa_cvolume_inc_clamp(&cv, u->volume_step, u->volume_limit);
pa_sink_set_volume(s, &cv, TRUE, TRUE); pa_sink_set_volume(s, &cv, TRUE, TRUE);
break; break;
case DOWN: case DOWN:
pa_cvolume_dec(&cv, DELTA); pa_cvolume_dec(&cv, u->volume_step);
pa_sink_set_volume(s, &cv, TRUE, TRUE); pa_sink_set_volume(s, &cv, TRUE, TRUE);
break; break;
@ -160,6 +162,8 @@ int pa__init(pa_module*m) {
struct input_id input_id; struct input_id input_id;
char name[256]; char name[256];
uint8_t evtype_bitmask[EV_MAX/8 + 1]; uint8_t evtype_bitmask[EV_MAX/8 + 1];
pa_volume_t volume_limit = PA_VOLUME_NORM*3/2;
pa_volume_t volume_step = PA_VOLUME_NORM/20;
pa_assert(m); pa_assert(m);
@ -168,12 +172,24 @@ int pa__init(pa_module*m) {
goto fail; 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); m->userdata = u = pa_xnew(struct userdata, 1);
u->module = m; u->module = m;
u->io = NULL; u->io = NULL;
u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL)); u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
u->fd = -1; u->fd = -1;
u->fd_type = 0; u->fd_type = 0;
u->volume_limit = volume_limit;
u->volume_step = volume_step;
if ((u->fd = pa_open_cloexec(pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), O_RDONLY, 0)) < 0) { if ((u->fd = pa_open_cloexec(pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), O_RDONLY, 0)) < 0) {
pa_log("Failed to open evdev device: %s", pa_cstrerror(errno)); pa_log("Failed to open evdev device: %s", pa_cstrerror(errno));