]> code.delx.au - pulseaudio/commitdiff
tag modules that may only be loaded once at most especially, and enforce that in...
authorLennart Poettering <lennart@poettering.net>
Fri, 9 Nov 2007 18:25:40 +0000 (18:25 +0000)
committerLennart Poettering <lennart@poettering.net>
Fri, 9 Nov 2007 18:25:40 +0000 (18:25 +0000)
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@2043 fefdeb5f-60dc-0310-8127-8f9354f1896f

42 files changed:
src/daemon/dumpmodules.c
src/modules/gconf/module-gconf.c
src/modules/module-alsa-sink.c
src/modules/module-alsa-source.c
src/modules/module-cli.c
src/modules/module-combine.c
src/modules/module-default-device-restore.c
src/modules/module-defs.h.m4
src/modules/module-detect.c
src/modules/module-esound-compat-spawnfd.c
src/modules/module-esound-compat-spawnpid.c
src/modules/module-esound-sink.c
src/modules/module-hal-detect.c
src/modules/module-jack-sink.c
src/modules/module-jack-source.c
src/modules/module-ladspa-sink.c
src/modules/module-lirc.c
src/modules/module-match.c
src/modules/module-mmkbd-evdev.c
src/modules/module-native-protocol-fd.c
src/modules/module-null-sink.c
src/modules/module-oss.c
src/modules/module-pipe-sink.c
src/modules/module-pipe-source.c
src/modules/module-protocol-stub.c
src/modules/module-remap-sink.c
src/modules/module-rescue-streams.c
src/modules/module-sine.c
src/modules/module-suspend-on-idle.c
src/modules/module-tunnel.c
src/modules/module-volume-restore.c
src/modules/module-x11-bell.c
src/modules/module-x11-publish.c
src/modules/module-x11-xsmp.c
src/modules/module-zeroconf-discover.c
src/modules/module-zeroconf-publish.c
src/modules/rtp/module-rtp-recv.c
src/modules/rtp/module-rtp-send.c
src/pulsecore/modinfo.c
src/pulsecore/modinfo.h
src/pulsecore/module.c
src/pulsecore/module.h

index ad7fab20f73cded8a415e379aca029933b36efd0..68236c70e82ca682658a58dc9f11686f92da9943 100644 (file)
@@ -71,6 +71,7 @@ static void long_info(const char *name, const char *path, pa_modinfo *i) {
             printf("Author: %s\n", i->author);
         if (i->usage)
             printf("Usage: %s\n", i->usage);
+        printf("Load Once: %s\n", pa_yes_no(i->load_once));
     }
 
     if (path)
index 799bdfbdf5b17c4e1539b6d9292e074b9b4bf26b..fa9ab1ccf94cd333dffd62c9fcc5ad16acfc5aa9 100644 (file)
 
 #include "module-gconf-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("GConf Adapter")
-PA_MODULE_VERSION(PACKAGE_VERSION)
-PA_MODULE_USAGE("")
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("GConf Adapter");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
 
 #define MAX_MODULES 10
 #define BUF_MAX 2048
index 88594cdaf15a559c6b483c9db92588c2253eab6e..636b413c3b0b179caadeeced1d83212bbf9d2def 100644 (file)
 #include "alsa-util.h"
 #include "module-alsa-sink-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("ALSA Sink")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("ALSA Sink");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "sink_name=<name for the sink> "
         "device=<ALSA device> "
@@ -62,7 +63,7 @@ PA_MODULE_USAGE(
         "fragments=<number of fragments> "
         "fragment_size=<fragment size> "
         "channel_map=<channel map> "
-        "mmap=<enable memory mapping?>")
+        "mmap=<enable memory mapping?>");
 
 #define DEFAULT_DEVICE "default"
 
index a862657f83ba359d978d8b8b5e75fce733707c4e..1a6113a7f53e29f6573c418d011ca1ee2b1fe958 100644 (file)
 #include "alsa-util.h"
 #include "module-alsa-source-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("ALSA Source")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("ALSA Source");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "source_name=<name for the source> "
         "device=<ALSA device> "
@@ -63,7 +64,7 @@ PA_MODULE_USAGE(
         "fragments=<number of fragments> "
         "fragment_size=<fragment size> "
         "channel_map=<channel map> "
-        "mmap=<enable memory mapping?>")
+        "mmap=<enable memory mapping?>");
 
 #define DEFAULT_DEVICE "default"
 
index 84125214bbcdc81d91859fdddbb0641d8d3b47f5..71df5a0fbe96d724e1dd50b53712a57980644d14 100644 (file)
 
 #include "module-cli-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Command line interface")
-PA_MODULE_VERSION(PACKAGE_VERSION)
-PA_MODULE_USAGE("exit_on_eof=<exit daemon after EOF?>")
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Command line interface");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_USAGE("exit_on_eof=<exit daemon after EOF?>");
 
 static const char* const valid_modargs[] = {
     "exit_on_eof",
index aca4ba32a592214fe2a7d651c0c0dd927b339f8a..dd81653c048acf9404df8e5681cf73fdba8a2473 100644 (file)
 
 #include "module-combine-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Combine multiple sinks to one")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Combine multiple sinks to one");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "sink_name=<name for the sink> "
         "master=<master sink> "
@@ -62,7 +63,7 @@ PA_MODULE_USAGE(
         "format=<sample format> "
         "channels=<number of channels> "
         "rate=<sample rate> "
-        "channel_map=<channel map>")
+        "channel_map=<channel map>");
 
 #define DEFAULT_SINK_NAME "combined"
 #define MEMBLOCKQ_MAXLENGTH (1024*170)
index a816eae8800b71bbc2c02b14f49da8b206f93749..b550ae7896c906e0dc4b81359ebe9f4dcb73eb25 100644 (file)
 
 #include "module-default-device-restore-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Automatically restore the default sink and source")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Automatically restore the default sink and source");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
 
 #define DEFAULT_SINK_FILE "default-sink"
 #define DEFAULT_SOURCE_FILE "default-source"
@@ -98,6 +99,3 @@ void pa__done(pa_module*m) {
         fclose(f);
     }
 }
-
-
-
index 5bff748e3abe2d13e4853dbc74c9890b54fd68f1..a49e8329a3e6ae1ec4ba28f0cdae50ada2e108ab 100644 (file)
@@ -10,6 +10,7 @@ define(`gen_symbol', `#define $1 'module_name`_LTX_$1')dnl
 
 #include <pulsecore/core.h>
 #include <pulsecore/module.h>
+#include <pulsecore/macro.h>
 
 gen_symbol(pa__init)
 gen_symbol(pa__done)
@@ -17,6 +18,7 @@ gen_symbol(pa__get_author)
 gen_symbol(pa__get_description)
 gen_symbol(pa__get_usage)
 gen_symbol(pa__get_version)
+gen_symbol(pa__load_once)
 
 int pa__init(pa_module*m);
 void pa__done(pa_module*m);
@@ -25,5 +27,6 @@ const char* pa__get_author(void);
 const char* pa__get_description(void);
 const char* pa__get_usage(void);
 const char* pa__get_version(void);
+pa_bool_t pa__load_once(void);
 
 #endif
index 7dc2524347fb23d5f772fb9cca9123d3100c6422..956659314872d3a093cd618393d701ee8d7dd8bc 100644 (file)
 
 #include "module-detect-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers")
-PA_MODULE_VERSION(PACKAGE_VERSION)
-PA_MODULE_USAGE("just-one=<boolean>")
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_USAGE("just-one=<boolean>");
 
 static const char* const valid_modargs[] = {
     "just-one",
index f0f73fcf386744f0a7b59ed0ddbeae005e91c262..8321192be731bf125b88faf34097c58725bf9093 100644 (file)
 
 #include "module-esound-compat-spawnfd-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("ESOUND compatibility module: -spawnfd emulation")
-PA_MODULE_USAGE("fd=<file descriptor>")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("ESOUND compatibility module: -spawnfd emulation");
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_USAGE("fd=<file descriptor>");
 
 static const char* const valid_modargs[] = {
     "fd",
index 6562fe281739eca1cf4a7b35540f755ba96fc499..67f0a2312a31e219ea1f418db69e23797a6dd8b9 100644 (file)
 
 #include "module-esound-compat-spawnpid-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("ESOUND compatibility module: -spawnpid emulation")
-PA_MODULE_USAGE("pid=<process id>")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("ESOUND compatibility module: -spawnpid emulation");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_USAGE("pid=<process id>");
 
 static const char* const valid_modargs[] = {
     "pid",
index b18d32581fe9986034998e20029c12eefc6f7573..f9bea63d78ab18b2c92579b6f85e7f2b43e222a9 100644 (file)
 
 #include "module-esound-sink-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("ESOUND Sink")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("ESOUND Sink");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "sink_name=<name for the sink> "
         "server=<address> cookie=<filename>  "
         "format=<sample format> "
         "channels=<number of channels> "
-        "rate=<sample rate>")
+        "rate=<sample rate>");
 
 #define DEFAULT_SINK_NAME "esound_out"
 
index a8ca7df3697d1f3ec02d6fe226389cfa4ce32bc8..00b66c16c03d811ade33fe30ec8b42dc0ac2335c 100644 (file)
 #include "dbus-util.h"
 #include "module-hal-detect-symdef.h"
 
-PA_MODULE_AUTHOR("Shahms King")
-PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Shahms King");
+PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
 #if defined(HAVE_ALSA) && defined(HAVE_OSS)
-PA_MODULE_USAGE("api=<alsa or oss>")
+PA_MODULE_USAGE("api=<alsa or oss>");
 #elif defined(HAVE_ALSA)
-PA_MODULE_USAGE("api=<alsa>")
+PA_MODULE_USAGE("api=<alsa>");
 #elif defined(HAVE_OSS)
-PA_MODULE_USAGE("api=<oss>")
+PA_MODULE_USAGE("api=<oss>");
 #endif
 
 struct device {
index 840867ce1956318f2b0f2dcef2c45ef1ef2c0068..44da068f38da3da9961c1b90751e0d464c5fd901 100644 (file)
  * source support in JACK.
  */
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("JACK Sink")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("JACK Sink");
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_USAGE(
         "sink_name=<name of sink> "
         "server_name=<jack server name> "
         "client_name=<jack client name> "
         "channels=<number of channels> "
         "connect=<connect ports?> "
-        "channel_map=<channel map>")
+        "channel_map=<channel map>");
 
 #define DEFAULT_SINK_NAME "jack_out"
 
index 380f87ebe007d8e14110266d38f7d52705f2399b..93618020539fffe91741e6747818ced5bef56220 100644 (file)
 /* See module-jack-sink for a few comments how this module basically
  * works */
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("JACK Source")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("JACK Source");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
 PA_MODULE_USAGE(
         "source_name=<name of source> "
         "server_name=<jack server name> "
         "client_name=<jack client name> "
         "channels=<number of channels> "
         "connect=<connect ports?>"
-        "channel_map=<channel map>")
+        "channel_map=<channel map>");
 
 #define DEFAULT_SOURCE_NAME "jack_in"
 
index 6ed392cea695d3cdc7dd9f3d3f0e848e809cc67c..50cdc4595fa113b2c57c88eb733a706e50ba67b0 100644 (file)
 #include "module-ladspa-sink-symdef.h"
 #include "ladspa.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Virtual LADSPA sink")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Virtual LADSPA sink");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "sink_name=<name for the sink> "
         "master=<name of sink to remap> "
@@ -57,7 +58,7 @@ PA_MODULE_USAGE(
         "channel_map=<channel map> "
         "plugin=<ladspa plugin name> "
         "label=<ladspa plugin label> "
-        "control=<comma seperated list of input control values>")
+        "control=<comma seperated list of input control values>");
 
 struct userdata {
     pa_core *core;
index 21d93837c912a31d834920cf4d07aea18eb392b1..245421727abd1c3209891e8cd1c5e58a9269ee16 100644 (file)
 
 #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",
index 0155b2af622a8bf2b67c687570cd5d26be6052c6..ed5f30763854655d0cb4b99f564111d85b02fc55 100644 (file)
 
 #include "module-match-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Playback stream expression matching module")
-PA_MODULE_USAGE("table=<filename>")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Playback stream expression matching module");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_USAGE("table=<filename>");
 
 #define WHITESPACE "\n\r \t"
 
@@ -241,5 +242,3 @@ void pa__done(pa_module*m) {
 
     pa_xfree(u);
 }
-
-
index 47a106456646f42514e94cd27381e53eeb39b505..03c0e9734d0e6a9049d219ec1a577d60cf502945 100644 (file)
 
 #include "module-mmkbd-evdev-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Multimedia keyboard support via Linux evdev")
-PA_MODULE_VERSION(PACKAGE_VERSION)
-PA_MODULE_USAGE("device=<evdev device> sink=<sink name>")
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Multimedia keyboard support via Linux evdev");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_USAGE("device=<evdev device> sink=<sink name>");
 
 #define DEFAULT_DEVICE "/dev/input/event0"
 
index 2ef61c88e94a52752f3157d7f6aa262d01d1e25f..53f4189603f64e37456d28761b223f3f74426e1c 100644 (file)
 
 #include "module-native-protocol-fd-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Native protocol autospawn helper")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Native protocol autospawn helper");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
 
 static const char* const valid_modargs[] = {
     "fd",
index 3a4edec7083a0df868d7d5a161f8d29d5358aef7..de35fff9972fbdd84b77c49e36bc0d5bf0b8152b 100644 (file)
 
 #include "module-null-sink-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Clocked NULL sink")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Clocked NULL sink");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "format=<sample format> "
         "channels=<number of channels> "
         "rate=<sample rate> "
         "sink_name=<name of sink>"
         "channel_map=<channel map>"
-        "description=<description for the sink>")
+        "description=<description for the sink>");
 
 #define DEFAULT_SINK_NAME "null"
 
index 51ab8a853674a071abcfd00bde23e8513291d8e6..a44ad08344d6310db1f679aec6a3e49b80d727ed 100644 (file)
 #include "oss-util.h"
 #include "module-oss-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("OSS Sink/Source")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("OSS Sink/Source");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "sink_name=<name for the sink> "
         "source_name=<name for the source> "
@@ -91,7 +92,7 @@ PA_MODULE_USAGE(
         "fragments=<number of fragments> "
         "fragment_size=<fragment size> "
         "channel_map=<channel map> "
-        "mmap=<enable memory mapping?>")
+        "mmap=<enable memory mapping?>");
 
 #define DEFAULT_DEVICE "/dev/dsp"
 
index 75748474533dcbc88462d459fc137615dc79eb00..e720c8ad26979d4fc83f41587860960c42e5f81f 100644 (file)
 
 #include "module-pipe-sink-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("UNIX pipe sink")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("UNIX pipe sink");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "sink_name=<name for the sink> "
         "file=<path of the FIFO> "
         "format=<sample format> "
         "channels=<number of channels> "
         "rate=<sample rate>"
-        "channel_map=<channel map>")
+        "channel_map=<channel map>");
 
 #define DEFAULT_FILE_NAME "/tmp/music.output"
 #define DEFAULT_SINK_NAME "fifo_output"
index 45708c687cec821cd44af26657b8a3bfdb31eaed..029356490fc7e6f974d1095cc1e7ae37f5e9c015 100644 (file)
 
 #include "module-pipe-source-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("UNIX pipe source")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("UNIX pipe source");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "source_name=<name for the source> "
         "file=<path of the FIFO> "
         "format=<sample format> "
         "channels=<number of channels> "
         "rate=<sample rate> "
-        "channel_map=<channel map>")
+        "channel_map=<channel map>");
 
 #define DEFAULT_FILE_NAME "/tmp/music.input"
 #define DEFAULT_SOURCE_NAME "fifo_input"
index 6bd7807972ca91a501141b226b3274654998ce9c..207e266e7642971916d571ab9448ebf0fb692fa6 100644 (file)
@@ -76,7 +76,7 @@
   #else
     #include "module-simple-protocol-unix-symdef.h"
   #endif
-  PA_MODULE_DESCRIPTION("Simple protocol "SOCKET_DESCRIPTION)
+PA_MODULE_DESCRIPTION("Simple protocol "SOCKET_DESCRIPTION);
   PA_MODULE_USAGE("rate=<sample rate> "
                   "format=<sample format> "
                   "channels=<number of channels> "
@@ -84,7 +84,7 @@
                   "source=<source to connect to> "
                   "playback=<enable playback?> "
                   "record=<enable record?> "
-                  SOCKET_USAGE)
+                  SOCKET_USAGE);
 #elif defined(USE_PROTOCOL_CLI)
   #include <pulsecore/protocol-cli.h>
   #define protocol_new pa_protocol_cli_new
@@ -98,8 +98,8 @@
   #else
     #include "module-cli-protocol-unix-symdef.h"
   #endif
-  PA_MODULE_DESCRIPTION("Command line interface protocol "SOCKET_DESCRIPTION)
-  PA_MODULE_USAGE(SOCKET_USAGE)
+  PA_MODULE_DESCRIPTION("Command line interface protocol "SOCKET_DESCRIPTION);
+  PA_MODULE_USAGE(SOCKET_USAGE);
 #elif defined(USE_PROTOCOL_HTTP)
   #include <pulsecore/protocol-http.h>
   #define protocol_new pa_protocol_http_new
   #else
     #include "module-http-protocol-unix-symdef.h"
   #endif
-  PA_MODULE_DESCRIPTION("HTTP "SOCKET_DESCRIPTION)
-  PA_MODULE_USAGE(SOCKET_USAGE)
+  PA_MODULE_DESCRIPTION("HTTP "SOCKET_DESCRIPTION);
+  PA_MODULE_USAGE(SOCKET_USAGE);
 #elif defined(USE_PROTOCOL_NATIVE)
   #include <pulsecore/protocol-native.h>
   #define protocol_new pa_protocol_native_new
     #define AUTH_USAGE
   #endif
 
-  PA_MODULE_DESCRIPTION("Native protocol "SOCKET_DESCRIPTION)
+  PA_MODULE_DESCRIPTION("Native protocol "SOCKET_DESCRIPTION);
   PA_MODULE_USAGE("auth-anonymous=<don't check for cookies?> "
                   "cookie=<path to cookie file> "
                   AUTH_USAGE
-                  SOCKET_USAGE)
+                  SOCKET_USAGE);
 #elif defined(USE_PROTOCOL_ESOUND)
   #include <pulsecore/protocol-esound.h>
   #include <pulsecore/esound.h>
     #define AUTH_USAGE
   #endif
 
-  PA_MODULE_DESCRIPTION("ESOUND protocol "SOCKET_DESCRIPTION)
+  PA_MODULE_DESCRIPTION("ESOUND protocol "SOCKET_DESCRIPTION);
   PA_MODULE_USAGE("sink=<sink to connect to> "
                   "source=<source to connect to> "
                   "auth-anonymous=<don't verify cookies?> "
                   "cookie=<path to cookie file> "
                   AUTH_USAGE
-                  SOCKET_USAGE)
+                  SOCKET_USAGE);
 #else
   #error "Broken build system"
 #endif
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_VERSION(PACKAGE_VERSION);
 
 static const char* const valid_modargs[] = {
     MODULE_ARGUMENTS
index e863c0c378b3f41380f7ea898f752281bb9222d7..39a9245d650a736576572c0c1217416104f89cdf 100644 (file)
 
 #include "module-remap-sink-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Virtual channel remapping sink")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Virtual channel remapping sink");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "sink_name=<name for the sink> "
         "master=<name of sink to remap> "
@@ -50,7 +51,7 @@ PA_MODULE_USAGE(
         "format=<sample format> "
         "channels=<number of channels> "
         "rate=<sample rate> "
-        "channel_map=<channel map>")
+        "channel_map=<channel map>");
 
 struct userdata {
     pa_core *core;
index 5cabef762279ea98a060c12bb8cd5cfea3e4ac4b..12957c9d898c6c67ff8fe40deae28436f852e8f2 100644 (file)
 
 #include "module-rescue-streams-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("When a sink/source is removed, try to move their streams to the default sink/source")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("When a sink/source is removed, try to move their streams to the default sink/source");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
 
 static const char* const valid_modargs[] = {
     NULL,
index 65b8ee7f80778fa6cb98ba1dc7890df45dbb92b0..41d9a51c725db2fc5d155dad67b614f3f3b0a6da 100644 (file)
 
 #include "module-sine-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Sine wave generator")
-PA_MODULE_USAGE("sink=<sink to connect to> frequency=<frequency in Hz>")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Sine wave generator");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_USAGE("sink=<sink to connect to> frequency=<frequency in Hz>");
 
 struct userdata {
     pa_core *core;
@@ -203,4 +204,3 @@ void pa__done(pa_module*m) {
 
     pa_xfree(u);
 }
-
index 5a7113903dde85f303ccaf66492f28a6ac75d28f..4746e2b77512bf60f4272be9094eec7c5f32ca69 100644 (file)
 
 #include "module-suspend-on-idle-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("When a sink/source is idle for too long, suspend it")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("When a sink/source is idle for too long, suspend it");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
 
 static const char* const valid_modargs[] = {
     "timeout",
index edc03c99cc48d2926695a6698aacc462639f6882..05cece7d02ea13ddb97dd51d4b06a8fbabad071b 100644 (file)
@@ -59,7 +59,8 @@
 
 #ifdef TUNNEL_SINK
 #include "module-tunnel-sink-symdef.h"
-PA_MODULE_DESCRIPTION("Tunnel module for sinks")
+PA_MODULE_DESCRIPTION("Tunnel module for sinks");
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "server=<address> "
         "sink=<remote sink name> "
@@ -68,10 +69,10 @@ PA_MODULE_USAGE(
         "channels=<number of channels> "
         "rate=<sample rate> "
         "sink_name=<name for the local sink> "
-        "channel_map=<channel map>")
+        "channel_map=<channel map>");
 #else
 #include "module-tunnel-source-symdef.h"
-PA_MODULE_DESCRIPTION("Tunnel module for sources")
+PA_MODULE_DESCRIPTION("Tunnel module for sources");
 PA_MODULE_USAGE(
         "server=<address> "
         "source=<remote source name> "
@@ -80,11 +81,11 @@ PA_MODULE_USAGE(
         "channels=<number of channels> "
         "rate=<sample rate> "
         "source_name=<name for the local source> "
-        "channel_map=<channel map>")
+        "channel_map=<channel map>");
 #endif
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_VERSION(PACKAGE_VERSION);
 
 #define DEFAULT_TLENGTH_MSEC 100
 #define DEFAULT_MINREQ_MSEC 10
index 8ef72b2a20b6529ecb537b92371ad54d01b4e518..422bc7f23feecf7e41f6133bf6028490f3d466e4 100644 (file)
 
 #include "module-volume-restore-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Automatically restore the volume and the devices of streams")
-PA_MODULE_USAGE("table=<filename>")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Automatically restore the volume and the devices of streams");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_USAGE("table=<filename>");
 
 #define WHITESPACE "\n\r \t"
 
index 4eacbb1e1f16ae6ad47e5beaf70377bec5ae26a1..87c6849da50b02ceb9dfecc6d7ed777639392476 100644 (file)
 
 #include "module-x11-bell-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("X11 Bell interceptor")
-PA_MODULE_VERSION(PACKAGE_VERSION)
-PA_MODULE_USAGE("sink=<sink to connect to> sample=<sample name> display=<X11 display>")
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("X11 Bell interceptor");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_USAGE("sink=<sink to connect to> sample=<sample name> display=<X11 display>");
 
 struct userdata {
     pa_core *core;
index f350126ad7591200830cdfc8cf82c2298ab2d94c..429c2a69c1f93365843f71b658b83ed9139cc435 100644 (file)
 
 #include "module-x11-publish-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("X11 Credential Publisher")
-PA_MODULE_VERSION(PACKAGE_VERSION)
-PA_MODULE_USAGE("display=<X11 display>")
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("X11 Credential Publisher");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_USAGE("display=<X11 display>");
 
 static const char* const valid_modargs[] = {
     "display",
index 3e353caf0761542387cd0ff7e00ec1ad2f614a04..e9efa09659875a4dffd4d644e4f294168cc97af8 100644 (file)
 
 #include "module-x11-xsmp-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("X11 session management")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("X11 session management");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
 
 static int ice_in_use = 0;
 
index e4903718303cb65008461198f0f35567fd642773..061560c861af7f5d5ca3c0be09cc19991f757ec2 100644 (file)
 
 #include "module-zeroconf-discover-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("mDNS/DNS-SD Service Discovery")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("mDNS/DNS-SD Service Discovery");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
 
 #define SERVICE_TYPE_SINK "_pulse-sink._tcp"
 #define SERVICE_TYPE_SOURCE "_non-monitor._sub._pulse-source._tcp"
index 818a1b2858ea18d97110a3364c20c974b0c31977..46969a244bb1968c58c604cc695631d9b2550d63 100644 (file)
 
 #include "module-zeroconf-publish-symdef.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("mDNS/DNS-SD Service Publisher")
-PA_MODULE_VERSION(PACKAGE_VERSION)
-PA_MODULE_USAGE("port=<IP port number>")
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("mDNS/DNS-SD Service Publisher");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_USAGE("port=<IP port number>");
 
 #define SERVICE_TYPE_SINK "_pulse-sink._tcp"
 #define SERVICE_TYPE_SOURCE "_pulse-source._tcp"
index 6c0189312a20c1e079bfe1b6482e5fa8297de94d..d8e7a78162c510777f3a5c5429fb667109d1e6fe 100644 (file)
 #include "sdp.h"
 #include "sap.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Recieve data from a network via RTP/SAP/SDP")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Recieve data from a network via RTP/SAP/SDP");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "sink=<name of the sink> "
         "sap_address=<multicast address to listen on> "
-)
+);
 
 #define SAP_PORT 9875
 #define DEFAULT_SAP_ADDRESS "224.0.0.56"
index f36989bdd451abe340b034102845993134d3faf0..d7c50578ce4d5276c0d7bcf4367abda328540f5b 100644 (file)
 #include "sdp.h"
 #include "sap.h"
 
-PA_MODULE_AUTHOR("Lennart Poettering")
-PA_MODULE_DESCRIPTION("Read data from source and send it to the network via RTP/SAP/SDP")
-PA_MODULE_VERSION(PACKAGE_VERSION)
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Read data from source and send it to the network via RTP/SAP/SDP");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
 PA_MODULE_USAGE(
         "source=<name of the source> "
         "format=<sample format> "
@@ -69,7 +70,7 @@ PA_MODULE_USAGE(
         "port=<port number> "
         "mtu=<maximum transfer unit> "
         "loop=<loopback to local host?>"
-)
+);
 
 #define DEFAULT_PORT 46000
 #define SAP_PORT 9875
index da2df6535b22c5fac5bc4dac2ebf616b5ffad165..d1a78fbb15840a8f7754859c0411386b393c0d55 100644 (file)
 #define PA_SYMBOL_DESCRIPTION "pa__get_description"
 #define PA_SYMBOL_USAGE "pa__get_usage"
 #define PA_SYMBOL_VERSION "pa__get_version"
+#define PA_SYMBOL_LOAD_ONCE "pa__load_once"
 
 pa_modinfo *pa_modinfo_get_by_handle(lt_dlhandle dl, const char *module_name) {
     pa_modinfo *i;
     const char* (*func)(void);
+    pa_bool_t (*func2) (void);
 
     pa_assert(dl);
 
@@ -61,6 +63,9 @@ pa_modinfo *pa_modinfo_get_by_handle(lt_dlhandle dl, const char *module_name) {
     if ((func = (const char* (*)(void)) pa_load_sym(dl, module_name, PA_SYMBOL_VERSION)))
         i->version = pa_xstrdup(func());
 
+    if ((func2 = (pa_bool_t (*)(void)) pa_load_sym(dl, module_name, PA_SYMBOL_LOAD_ONCE)))
+        i->load_once = func2();
+
     return i;
 }
 
index 02e536c66d6d7d92bb463fab5d0027befcdbcf6a..da6d5428b4205503fb96027dc49868b50d405e9d 100644 (file)
 ***/
 
 /* Some functions for reading module meta data from PulseAudio modules */
+#include <pulsecore/macro.h>
 
 typedef struct pa_modinfo {
     char *author;
     char *description;
     char *usage;
     char *version;
+    pa_bool_t load_once;
 } pa_modinfo;
 
 /* Read meta data from an libtool handle */
index dce91a71027273b54d57247fc05a54cd0e834931..e1680de5fb13a7a8a8a6785481bd7fbb4c40a5bc 100644 (file)
@@ -46,6 +46,7 @@
 
 #define PA_SYMBOL_INIT "pa__init"
 #define PA_SYMBOL_DONE "pa__done"
+#define PA_SYMBOL_LOAD_ONCE "pa__load_once"
 
 #define UNLOAD_POLL_TIME 2
 
@@ -66,6 +67,7 @@ static void timeout_callback(pa_mainloop_api *m, pa_time_event*e, PA_GCC_UNUSED
 
 pa_module* pa_module_load(pa_core *c, const char *name, const char *argument) {
     pa_module *m = NULL;
+    pa_bool_t (*load_once)(void);
 
     pa_assert(c);
     pa_assert(name);
@@ -82,6 +84,22 @@ pa_module* pa_module_load(pa_core *c, const char *name, const char *argument) {
         goto fail;
     }
 
+    if ((load_once = (pa_bool_t (*)(void)) pa_load_sym(m->dl, name, PA_SYMBOL_LOAD_ONCE))) {
+
+        if (load_once()) {
+            pa_module *i;
+            uint32_t idx;
+            /* OK, the module only wants to be loaded once, let's make sure it is */
+
+            for (i = pa_idxset_first(c->modules, &idx); i; i = pa_idxset_next(c->modules, &idx)) {
+                if (strcmp(name, i->name) == 0) {
+                    pa_log("Module \"%s\" should be loaded once at most. Refusing to load.", name);
+                    goto fail;
+                }
+            }
+        }
+    }
+
     if (!(m->init = (int (*)(pa_module*_m)) pa_load_sym(m->dl, name, PA_SYMBOL_INIT))) {
         pa_log("Failed to load module \"%s\": symbol \""PA_SYMBOL_INIT"\" not found.", name);
         goto fail;
index 7a93a071aac7191f72beabadcccd15007d09a0f9..25f122d164105bef48165e36a63b6f405aa88b43 100644 (file)
@@ -62,10 +62,25 @@ void pa_module_unload_request(pa_module *m);
 
 void pa_module_set_used(pa_module*m, int used);
 
-#define PA_MODULE_AUTHOR(s) const char *pa__get_author(void) { return s; }
-#define PA_MODULE_DESCRIPTION(s) const char *pa__get_description(void) { return s; }
-#define PA_MODULE_USAGE(s) const char *pa__get_usage(void) { return s; }
-#define PA_MODULE_VERSION(s) const char * pa__get_version(void) { return s; }
+#define PA_MODULE_AUTHOR(s)                                     \
+    const char *pa__get_author(void) { return s; }              \
+    struct __stupid_useless_struct_to_allow_trailing_semicolon
+
+#define PA_MODULE_DESCRIPTION(s)                                \
+    const char *pa__get_description(void) { return s; }         \
+    struct __stupid_useless_struct_to_allow_trailing_semicolon
+
+#define PA_MODULE_USAGE(s)                                      \
+    const char *pa__get_usage(void) { return s; }               \
+    struct __stupid_useless_struct_to_allow_trailing_semicolon
+
+#define PA_MODULE_VERSION(s)                                    \
+    const char * pa__get_version(void) { return s; }            \
+    struct __stupid_useless_struct_to_allow_trailing_semicolon
+
+#define PA_MODULE_LOAD_ONCE(b)                                  \
+    pa_bool_t pa__load_once(void) { return b; }                 \
+    struct __stupid_useless_struct_to_allow_trailing_semicolon
 
 pa_modinfo *pa_module_get_info(pa_module *m);