]> code.delx.au - pulseaudio/blobdiff - src/modules/module-lirc.c
dbusiface-module: Implement the Module D-Bus interface.
[pulseaudio] / src / modules / module-lirc.c
index 6f4e98dce4a851b8003d7d6a2d4fdb8d6ab3f1fa..d0e902f69b3b080e34b9005d68d30af49aa9fbc5 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id$ */
-
 /***
   This file is part of PulseAudio.
 
@@ -7,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
-  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
 #endif
 
 #include <stdio.h>
-#include <assert.h>
 #include <unistd.h>
 #include <string.h>
-#include <lirc/lirc_client.h>
 #include <stdlib.h>
 
+#include <lirc/lirc_client.h>
+
 #include <pulse/xmalloc.h>
 
 #include <pulsecore/module.h>
 #include <pulsecore/namereg.h>
 #include <pulsecore/sink.h>
 #include <pulsecore/modargs.h>
+#include <pulsecore/macro.h>
 
 #include "module-lirc-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("LIRC volume control")
-PA_MODULE_VERSION(PACKAGE_VERSION)
-PA_MODULE_USAGE("config=<config file> sink=<sink name> appname=<lirc application name>")
+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=<config file> sink=<sink name> appname=<lirc application name>");
 
 static const char* const valid_modargs[] = {
     "config",
@@ -63,9 +63,9 @@ struct userdata {
     float mute_toggle_save;
 };
 
-static int lirc_in_use = 0;
+#define DELTA (PA_VOLUME_NORM/20)
 
-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;
 
@@ -114,56 +114,40 @@ static void io_callback(pa_mainloop_api *io, PA_GCC_UNUSED pa_io_event *e, PA_GC
                 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;
 
-                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 {
-                    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:
-                            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(&cv, DELTA);
+                            pa_sink_set_volume(s, &cv, TRUE, TRUE);
                             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, DELTA);
+                            pa_sink_set_volume(s, &cv, TRUE, TRUE);
                             break;
 
                         case MUTE:
-                            pa_sink_set_mute(s, 0);
+                            pa_sink_set_mute(s, TRUE, TRUE);
                             break;
 
                         case RESET:
-                            pa_sink_set_mute(s, 1);
+                            pa_sink_set_mute(s, FALSE, TRUE);
                             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:
-                            ;
+                            pa_assert_not_reached();
                     }
                 }
             }
@@ -178,7 +162,7 @@ fail:
     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);
 }
@@ -186,13 +170,8 @@ fail:
 int pa__init(pa_module*m) {
     pa_modargs *ma = NULL;
     struct userdata *u;
-    
-    pa_assert(m);
 
-    if (lirc_in_use) {
-        pa_log("module-lirc may no be loaded twice.");
-        return -1;
-    }
+    pa_assert(m);
 
     if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
         pa_log("Failed to parse module arguments");
@@ -219,8 +198,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);
 
-    lirc_in_use = 1;
-
     pa_modargs_free(ma);
 
     return 0;
@@ -252,6 +229,4 @@ void pa__done(pa_module*m) {
 
     pa_xfree(u->sink_name);
     pa_xfree(u);
-
-    lirc_in_use = 0;
 }