]> code.delx.au - pulseaudio/blobdiff - src/modules/module-lirc.c
filter-apply: Move sink/source unlink callbacks before m-s-r
[pulseaudio] / src / modules / module-lirc.c
index 0570a6a11e57c2f84d72a05f483ade1ba5b5401a..15f3442d90f3b450da2f07ca6c75a6aba28dcb52 100644 (file)
@@ -5,7 +5,7 @@
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2 of the License,
+  by the Free Software Foundation; either version 2.1 of the License,
   or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
   or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
@@ -45,12 +45,14 @@ PA_MODULE_AUTHOR("Lennart Poettering");
 PA_MODULE_DESCRIPTION("LIRC volume control");
 PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_LOAD_ONCE(TRUE);
 PA_MODULE_DESCRIPTION("LIRC volume control");
 PA_MODULE_VERSION(PACKAGE_VERSION);
 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[] = {
     "config",
     "sink",
     "appname",
 
 static const char* const valid_modargs[] = {
     "config",
     "sink",
     "appname",
+    "volume_limit",
+    "volume_step",
     NULL,
 };
 
     NULL,
 };
 
@@ -61,11 +63,11 @@ struct userdata {
     char *sink_name;
     pa_module *module;
     float mute_toggle_save;
     char *sink_name;
     pa_module *module;
     float mute_toggle_save;
+    pa_volume_t volume_limit;
+    pa_volume_t volume_step;
 };
 
 };
 
-static int lirc_in_use = 0;
-
-static void io_callback(pa_mainloop_api *io, PA_GCC_UNUSED pa_io_event *e, PA_GCC_UNUSED 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;
     char *name = NULL, *code = NULL;
 
     struct userdata *u = userdata;
     char *name = NULL, *code = NULL;
 
@@ -114,56 +116,40 @@ static void io_callback(pa_mainloop_api *io, PA_GCC_UNUSED pa_io_event *e, PA_GC
                 volchange = RESET;
 
             if (volchange == INVALID)
                 volchange = RESET;
 
             if (volchange == INVALID)
-                pa_log_warn("Recieved unknown IR code '%s'", name);
+                pa_log_warn("Received unknown IR code '%s'", name);
             else {
                 pa_sink *s;
 
             else {
                 pa_sink *s;
 
-                if (!(s = pa_namereg_get(u->module->core, u->sink_name, PA_NAMEREG_SINK, 1)))
+                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_log("Failed to get sink '%s'", u->sink_name);
                 else {
-                    int i;
-                    pa_cvolume cv = *pa_sink_get_volume(s);
-
-#define DELTA (PA_VOLUME_NORM/20)
+                    pa_cvolume cv = *pa_sink_get_volume(s, FALSE);
 
                     switch (volchange) {
                         case UP:
 
                     switch (volchange) {
                         case UP:
-                            for (i = 0; i < cv.channels; i++) {
-                                cv.values[i] += DELTA;
-
-                                if (cv.values[i] > PA_VOLUME_NORM)
-                                    cv.values[i] = PA_VOLUME_NORM;
-                            }
-
-                            pa_sink_set_volume(s, &cv);
+                            pa_cvolume_inc_clamp(&cv, u->volume_step, u->volume_limit);
+                            pa_sink_set_volume(s, &cv, TRUE, TRUE);
                             break;
 
                         case DOWN:
                             break;
 
                         case DOWN:
-                            for (i = 0; i < cv.channels; i++) {
-                                if (cv.values[i] >= DELTA)
-                                    cv.values[i] -= DELTA;
-                                else
-                                    cv.values[i] = PA_VOLUME_MUTED;
-                            }
-
-                            pa_sink_set_volume(s, &cv);
+                            pa_cvolume_dec(&cv, u->volume_step);
+                            pa_sink_set_volume(s, &cv, TRUE, TRUE);
                             break;
 
                         case MUTE:
                             break;
 
                         case MUTE:
-                            pa_sink_set_mute(s, 0);
+                            pa_sink_set_mute(s, TRUE, TRUE);
                             break;
 
                         case RESET:
                             break;
 
                         case RESET:
-                            pa_sink_set_mute(s, 1);
+                            pa_sink_set_mute(s, FALSE, TRUE);
                             break;
 
                         case MUTE_TOGGLE:
                             break;
 
                         case MUTE_TOGGLE:
-
-                            pa_sink_set_mute(s, !pa_sink_get_mute(s));
+                            pa_sink_set_mute(s, !pa_sink_get_mute(s, FALSE), TRUE);
                             break;
 
                         case INVALID:
                             break;
 
                         case INVALID:
-                            ;
+                            pa_assert_not_reached();
                     }
                 }
             }
                     }
                 }
             }
@@ -178,7 +164,7 @@ fail:
     u->module->core->mainloop->io_free(u->io);
     u->io = NULL;
 
     u->module->core->mainloop->io_free(u->io);
     u->io = NULL;
 
-    pa_module_unload_request(u->module);
+    pa_module_unload_request(u->module, TRUE);
 
     pa_xfree(code);
 }
 
     pa_xfree(code);
 }
@@ -186,19 +172,26 @@ fail:
 int pa__init(pa_module*m) {
     pa_modargs *ma = NULL;
     struct userdata *u;
 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);
 
 
     pa_assert(m);
 
-    if (lirc_in_use) {
-        pa_log("module-lirc may no be loaded twice.");
-        return -1;
-    }
-
     if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
         pa_log("Failed to parse module arguments");
         goto fail;
     }
 
     if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
         pa_log("Failed to parse module arguments");
         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;
     m->userdata = u = pa_xnew(struct userdata, 1);
     u->module = m;
     u->io = NULL;
@@ -206,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->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.");
 
     if ((u->lirc_fd = lirc_init((char*) pa_modargs_get_value(ma, "appname", "pulseaudio"), 1)) < 0) {
         pa_log("lirc_init() failed.");
@@ -219,8 +214,6 @@ int pa__init(pa_module*m) {
 
     u->io = m->core->mainloop->io_new(m->core->mainloop, u->lirc_fd, PA_IO_EVENT_INPUT|PA_IO_EVENT_HANGUP, io_callback, u);
 
 
     u->io = m->core->mainloop->io_new(m->core->mainloop, u->lirc_fd, PA_IO_EVENT_INPUT|PA_IO_EVENT_HANGUP, io_callback, u);
 
-    lirc_in_use = 1;
-
     pa_modargs_free(ma);
 
     return 0;
     pa_modargs_free(ma);
 
     return 0;
@@ -252,6 +245,4 @@ void pa__done(pa_module*m) {
 
     pa_xfree(u->sink_name);
     pa_xfree(u);
 
     pa_xfree(u->sink_name);
     pa_xfree(u);
-
-    lirc_in_use = 0;
 }
 }