doc: add documentation for pipewire-pulse modules

Add (minimal) reference documentation for each pipewire-pulse module.

Add some preprocessing to substitute @pulse_module_options@ in docs from
PW_KEY_MODULE_USAGE so the module options don't need to be repeated.

Produce Doxygen docs + generate manpages pipewire-pulse-modules.7,
pipewire-pulse-module-*.7
This commit is contained in:
Pauli Virtanen 2023-11-19 23:08:09 +02:00 committed by Wim Taymans
parent 0ae797ea28
commit 843e733479
40 changed files with 979 additions and 302 deletions

52
doc/dox/pulse-modules.dox Normal file
View file

@ -0,0 +1,52 @@
/** \page page_pulse_modules Pulseaudio Modules
PipeWire's Pulseaudio emulation implements several Pulseaudio modules.
It only supports its own built-in modules, and cannot load external
modules written for Pulseaudio.
The built-in modules can be loaded using Pulseaudio client programs,
for example `pactl load-module <module-name> <module-options>`. They
can also added to `pipewire-pulse.conf`, typically by a drop-in file
in `~/.config/pipewire/pipewire-pulse.conf.d/` containing the module
name and its arguments
```
pulse.cmd = [
{ cmd = "load-module" args = "module-null-sink sink_name=foo" flags = [ ] }
]
```
List of known built-in modules:
- \subpage page_pulse_module_alsa_sink
- \subpage page_pulse_module_alsa_source
- \subpage page_pulse_module_always_sink
- \subpage page_pulse_module_combine_sink
- \subpage page_pulse_module_echo_cancel
- \subpage page_pulse_module_gsettings
- \subpage page_pulse_module_jackdbus_detect
- \subpage page_pulse_module_ladspa_sink
- \subpage page_pulse_module_ladspa_source
- \subpage page_pulse_module_loopback
- \subpage page_pulse_module_native_protocol_tcp
- \subpage page_pulse_module_null_sink
- \subpage page_pulse_module_pipe_sink
- \subpage page_pulse_module_pipe_source
- \subpage page_pulse_module_raop_discover
- \subpage page_pulse_module_remap_sink
- \subpage page_pulse_module_remap_source
- \subpage page_pulse_module_roc_sink
- \subpage page_pulse_module_roc_sink_input
- \subpage page_pulse_module_roc_source
- \subpage page_pulse_module_rtp_recv
- \subpage page_pulse_module_rtp_send
- \subpage page_pulse_module_simple_protocol_tcp
- \subpage page_pulse_module_switch_on_connect
- \subpage page_pulse_module_tunnel_sink
- \subpage page_pulse_module_tunnel_source
- \subpage page_pulse_module_virtual_sink
- \subpage page_pulse_module_virtual_source
- \subpage page_pulse_module_x11_bell
- \subpage page_pulse_module_zeroconf_discover
- \subpage page_pulse_module_zeroconf_publish
*/

48
doc/input-filter.py Executable file
View file

@ -0,0 +1,48 @@
#!/usr/bin/env python3
# -*- mode: python; coding: utf-8; eval: (blacken-mode); -*-
r"""
Doxygen input filter that:
- adds \privatesection to all files
- removes macros
- parses pulse_module_options and substitutes it into @pulse_module_options@
This is used for .c files, and causes Doxygen to not include
any symbols from them, unless they also appeared in a header file.
The Pulse module option parsing is used in documentation of Pulseaudio modules.
"""
import sys
import re
import os
def main():
with open(sys.argv[1], "r") as f:
text = f.read()
text = re.sub("#define.*", "", text)
m = re.search(
r"static const char[* ]*const pulse_module_options\s+=\s+(.*?\")\s*;\s*$",
text,
re.M | re.S,
)
if m:
res = []
for line in m.group(1).splitlines():
m = re.match(r"\s*\"\s*([a-z0-9_]+)\s*=\s*(.*)\"\s*$", line)
if m:
name = m.group(1)
value = m.group(2).strip().strip("<>")
res.append(f"- `{name}`: {value}")
res = "\n * ".join(res)
text = text.replace("@pulse_module_options@", res)
print("/** \\privatesection */")
print(text)
if __name__ == "__main__":
main()

View file

@ -1,10 +0,0 @@
#!/bin/bash
#
# Doxygen input filter that adds \privatesection to all files,
# and removes macros.
#
# This is used for .c files, and causes Doxygen to not include
# any symbols from them, unless they also appeared in a header file.
#
echo -n "/** \privatesection */ "
sed -e 's/#define.*//' < "$1"

View file

@ -20,6 +20,7 @@ extra_docs = [
'dox/index.dox',
'dox/overview.dox',
'dox/modules.dox',
'dox/pulse-modules.dox',
'dox/internals/index.dox',
'dox/internals/design.dox',
'dox/internals/access.dox',
@ -68,6 +69,9 @@ endforeach
foreach h : module_sources
inputs += meson.project_source_root() / 'src' / 'modules' / h
endforeach
foreach h : pipewire_module_protocol_pulse_sources
inputs += meson.project_source_root() / 'src' / 'modules' / h
endforeach
input_dirs = [ meson.project_source_root() / 'spa' / 'include' / 'spa' ]
path_prefixes = [
@ -141,7 +145,7 @@ pw_programs_dox = configure_file(input: 'programs.dox.in',
input_dirs += [ 'doc/programs.dox' ]
doxygen_layout = meson.project_source_root() / 'doc' / 'DoxygenLayout.xml'
doxygen_filter_c = meson.project_source_root() / 'doc' / 'input-filter.sh'
doxygen_filter_c = meson.project_source_root() / 'doc' / 'input-filter.py'
doxygen_filter_h = meson.project_source_root() / 'doc' / 'input-filter-h.sh'
doxyfile_conf.set('inputs', ' '.join(inputs + input_dirs))
@ -177,9 +181,24 @@ if generate_module_manpages
endif
endforeach
module_manpage_names = []
foreach m : module_sources
name = m.split('.c').get(0)
file = 'libpipewire-' + name + '.7'
name = m.split('.c').get(0)
file = f'libpipewire-@name@.7'
module_manpage_names += [[name, file]]
endforeach
foreach m : pipewire_module_protocol_pulse_sources
name = m.split('/').get(-1).split('.c').get(0)
if m.contains('/modules/') and name.startswith('module-')
name = f'pulse-@name@'
file = f'pipewire-@name@.7'
module_manpage_names += [[name, file]]
endif
endforeach
foreach item : module_manpage_names
name = item.get(0)
file = item.get(1)
rst = custom_target(file + '.rst',
command : [python, module_man_rst_py, pandoc, name, '@INPUT@' ] + module_man_defines,

View file

@ -1,4 +1,5 @@
#!/usr/bin/python3
# -*- mode: python; coding: utf-8; eval: (blacken-mode); -*-
"""
Convert Doxygen HTML documentation for a PipeWire module to RST.
"""
@ -33,9 +34,7 @@ PipeWire is available from {PACKAGE_URL}
SEE ALSO
--------
``pipewire(1)``,
``pipewire.conf(5)``,
``libpipewire-modules(7)``
{seealso}
"""
@ -68,11 +67,17 @@ def main():
[args.pandoc, "-f", "html", "-t", "rst"], input=data, encoding="utf-8"
)
if not content.strip():
content = "Undocumented."
if not content.strip() or content.lower().startswith("module name\n-----"):
content = "Undocumented.\n\n" + content
name = f"libpipewire-{args.module}"
subtitle = "PipeWire module"
if args.module.startswith("pulse-"):
name = re.sub(r"^pulse-module-", "module-", args.module)
seealso = "``pipewire-pulse(1)``, ``pipewire-pulse-modules(7)``"
subtitle = "PipeWire Pulseaudio module"
else:
name = f"libpipewire-{args.module}"
seealso = "``pipewire(1)``, ``pipewire.conf(5)``, ``libpipewire-modules(7)``"
subtitle = "PipeWire module"
env = dict(
content=content,
@ -80,6 +85,7 @@ def main():
name_underline="#" * len(name),
subtitle=subtitle,
subtitle_underline="-" * len(subtitle),
seealso=seealso,
)
for k, v in args.define:

View file

@ -123,8 +123,9 @@ Support interfaces provided by host
\}
\page page_overview
\page page_modules
\page page_programs
\page page_modules
\page page_pulse_modules
\page page_internals
\page page_api
\page page_tutorial

View file

@ -9,11 +9,21 @@ manpage_conf.set('PIPEWIRE_CONFDATADIR', pipewire_confdatadir)
module_manpage_list = []
foreach m : module_sources
name = m.split('.c').get(0)
module_manpage_list += ['``libpipewire-' + name + '(7)``']
module_manpage_list += f'``libpipewire-' + name + '(7)``'
endforeach
manpage_conf.set('LIBPIPEWIRE_MODULES', '\n- '.join(module_manpage_list))
pulse_module_manpage_list = []
foreach m : pipewire_module_protocol_pulse_sources
name = m.split('/').get(-1).split('.c').get(0)
if m.contains('/modules/') and name.startswith('module-')
pulse_module_manpage_list += f'``pipewire-pulse-@name@(7)``'
endif
endforeach
manpage_conf.set('PIPEWIRE_PULSE_MODULES', '\n- '.join(pulse_module_manpage_list))
manpages = [
'pipewire.1.rst.in',
'pipewire-pulse.1.rst.in',
@ -31,6 +41,7 @@ manpages = [
'pw-profiler.1.rst.in',
'pw-top.1.rst.in',
'libpipewire-modules.7.rst.in',
'pipewire-pulse-modules.7.rst.in',
]
if get_option('pipewire-jack').allowed()

View file

@ -0,0 +1,43 @@
pipewire-pulse-modules
######################
---------------------------
PipeWire Pulseaudio modules
---------------------------
:Manual section: 7
:Manual group: PipeWire
DESCRIPTION
===========
PipeWire's Pulseaudio emulation implements several Pulseaudio modules.
It only supports its own built-in modules, and cannot load external
modules written for Pulseaudio.
The built-in modules can be loaded using Pulseaudio client programs,
for example `pactl load-module <module-name> <module-options>`. They
can also added to `pipewire-pulse.conf`, typically by a drop-in file
in `~/.config/pipewire/pipewire-pulse.conf.d/` containing the module
name and its arguments
::
pulse.cmd = [
{ cmd = "load-module" args = "module-null-sink sink_name=foo" flags = [ ] }
]
KNOWN MODULES
=============
- @PIPEWIRE_PULSE_MODULES@
AUTHORS
=======
The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
SEE ALSO
========
``pipewire-pulse(1)``,

View file

@ -500,13 +500,13 @@ summary({'Manpage generation': generate_manpages}, bool_yn: true)
subdir('man')
doxygen = find_program('doxygen', required : get_option('docs'))
if doxygen.found()
pymod = import('python')
python = pymod.find_installation('python3', required: get_option('docs'))
if doxygen.found() and python.found()
generate_module_manpages = get_option('docs').enabled() and get_option('man').enabled()
if generate_manpages
pymod = import('python')
python = pymod.find_installation('python3', required: generate_module_manpages)
pandoc = find_program('pandoc', required: generate_module_manpages)
generate_module_manpages = python.found() and pandoc.found()
generate_module_manpages = pandoc.found()
endif
summary({'Module manpage generation': generate_module_manpages}, bool_yn: true)

View file

@ -7,6 +7,43 @@
#include "../manager.h"
#include "../module.h"
/** \page page_pulse_module_alsa_sink ALSA Sink
*
* ## Module Name
*
* `module-alsa-sink`
*
* ## Module Options
*
* @pulse_module_options@
*/
static const char *const pulse_module_options =
"name=<name of the sink, to be prefixed> "
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"namereg_fail=<when false attempt to synthesise new sink_name if it is already taken> "
"device=<ALSA device> "
"device_id=<ALSA card index> "
"format=<sample format> "
"rate=<sample rate> "
"alternate_rate=<alternate sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"fragments=<number of fragments> "
"fragment_size=<fragment size> "
"mmap=<enable memory mapping?> "
"tsched=<enable system timer based scheduling mode?> "
"tsched_buffer_size=<buffer size when using timer based scheduling> "
"tsched_buffer_watermark=<lower fill watermark> "
"ignore_dB=<ignore dB information from the device?> "
"control=<name of mixer control, or name and index separated by a comma> "
"rewind_safeguard=<number of bytes that cannot be rewound> "
"deferred_volume=<Synchronize software and hardware volume changes to avoid momentary jumps?> "
"deferred_volume_safety_margin=<usec adjustment depending on volume direction> "
"deferred_volume_extra_delay=<usec adjustment to HW volume changes> "
"fixed_latency_range=<disable latency range changes on underrun?> ";
#define NAME "alsa-sink"
#define DEFAULT_DEVICE "default"
@ -131,31 +168,7 @@ static int module_alsa_sink_unload(struct module *module)
static const struct spa_dict_item module_alsa_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "An ALSA sink" },
{ PW_KEY_MODULE_USAGE,
"name=<name of the sink, to be prefixed> "
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"namereg_fail=<when false attempt to synthesise new sink_name if it is already taken> "
"device=<ALSA device> "
"device_id=<ALSA card index> "
"format=<sample format> "
"rate=<sample rate> "
"alternate_rate=<alternate sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"fragments=<number of fragments> "
"fragment_size=<fragment size> "
"mmap=<enable memory mapping?> "
"tsched=<enable system timer based scheduling mode?> "
"tsched_buffer_size=<buffer size when using timer based scheduling> "
"tsched_buffer_watermark=<lower fill watermark> "
"ignore_dB=<ignore dB information from the device?> "
"control=<name of mixer control, or name and index separated by a comma> "
"rewind_safeguard=<number of bytes that cannot be rewound> "
"deferred_volume=<Synchronize software and hardware volume changes to avoid momentary jumps?> "
"deferred_volume_safety_margin=<usec adjustment depending on volume direction> "
"deferred_volume_extra_delay=<usec adjustment to HW volume changes> "
"fixed_latency_range=<disable latency range changes on underrun?>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -7,6 +7,43 @@
#include "../manager.h"
#include "../module.h"
/** \page page_pulse_module_alsa_source ALSA Source
*
* ## Module Name
*
* `module-alsa-source`
*
* ## Module Options
*
* @pulse_module_options@
*/
static const char *const pulse_module_options =
"name=<name of the source, to be prefixed> "
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"namereg_fail=<when false attempt to synthesise new source_name if it is already taken> "
"device=<ALSA device> "
"device_id=<ALSA card index> "
"format=<sample format> "
"rate=<sample rate> "
"alternate_rate=<alternate sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"fragments=<number of fragments> "
"fragment_size=<fragment size> "
"mmap=<enable memory mapping?> "
"tsched=<enable system timer based scheduling mode?> "
"tsched_buffer_size=<buffer size when using timer based scheduling> "
"tsched_buffer_watermark=<lower fill watermark> "
"ignore_dB=<ignore dB information from the device?> "
"control=<name of mixer control, or name and index separated by a comma> "
"rewind_safeguard=<number of bytes that cannot be rewound> "
"deferred_volume=<Synchronize software and hardware volume changes to avoid momentary jumps?> "
"deferred_volume_safety_margin=<usec adjustment depending on volume direction> "
"deferred_volume_extra_delay=<usec adjustment to HW volume changes> "
"fixed_latency_range=<disable latency range changes on underrun?>";
#define NAME "alsa-source"
#define DEFAULT_DEVICE "default"
@ -131,31 +168,7 @@ static int module_alsa_source_unload(struct module *module)
static const struct spa_dict_item module_alsa_source_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "An ALSA source" },
{ PW_KEY_MODULE_USAGE,
"name=<name of the source, to be prefixed> "
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"namereg_fail=<when false attempt to synthesise new source_name if it is already taken> "
"device=<ALSA device> "
"device_id=<ALSA card index> "
"format=<sample format> "
"rate=<sample rate> "
"alternate_rate=<alternate sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"fragments=<number of fragments> "
"fragment_size=<fragment size> "
"mmap=<enable memory mapping?> "
"tsched=<enable system timer based scheduling mode?> "
"tsched_buffer_size=<buffer size when using timer based scheduling> "
"tsched_buffer_watermark=<lower fill watermark> "
"ignore_dB=<ignore dB information from the device?> "
"control=<name of mixer control, or name and index separated by a comma> "
"rewind_safeguard=<number of bytes that cannot be rewound> "
"deferred_volume=<Synchronize software and hardware volume changes to avoid momentary jumps?> "
"deferred_volume_safety_margin=<usec adjustment depending on volume direction> "
"deferred_volume_extra_delay=<usec adjustment to HW volume changes> "
"fixed_latency_range=<disable latency range changes on underrun?>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -6,6 +6,19 @@
#include "../module.h"
/** \page page_pulse_module_always_sink Always Sink
*
* ## Module Name
*
* `module-always-sink`
*
* ## Module Options
*
* @pulse_module_options@
*/
static const char *const pulse_module_options = "sink_name=<name of sink>";
#define NAME "always-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -77,7 +90,7 @@ static int module_always_sink_unload(struct module *module)
static const struct spa_dict_item module_always_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Pauli Virtanen <pav@iki.fi>" },
{ PW_KEY_MODULE_DESCRIPTION, "Always keeps at least one sink loaded even if it's a null one" },
{ PW_KEY_MODULE_USAGE, "sink_name=<name of sink>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -12,6 +12,32 @@
#include "../manager.h"
#include "../module.h"
/** \page page_pulse_module_combine_sink Combine Sink
*
* ## Module Name
*
* `module-combine-sink`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_combine_stream "libpipewire-module-combine-stream"
*/
static const char *const pulse_module_options =
"sink_name=<name of the sink> "
"sink_properties=<properties for the sink> "
/* not a great name, but for backwards compatibility... */
"slaves=<sinks to combine> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"remix=<remix channels> "
"latency_compensate=<bool> ";
#define NAME "combine-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -24,15 +50,7 @@ PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
static const struct spa_dict_item module_combine_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Arun Raghavan <arun@asymptotic.io>" },
{ PW_KEY_MODULE_DESCRIPTION, "Combine multiple sinks into a single sink" },
{ PW_KEY_MODULE_USAGE, "sink_name=<name of the sink> "
"sink_properties=<properties for the sink> "
/* not a great name, but for backwards compatibility... */
"slaves=<sinks to combine> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"remix=<remix channels> "
"latency_compensate=<bool> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -11,6 +11,45 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_echo_cancel Echo Cancel
*
* ## Module Name
*
* `module-echo-cancel`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_echo_cancel "libpipewire-module-echo-cancel"
*/
static const char *const pulse_module_options =
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"source_master=<name of source to filter> "
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"sink_master=<name of sink to filter> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"aec_method=<implementation to use> "
"aec_args=<parameters for the AEC engine> ";
#if 0
/* These are not implemented because they don't
* really make sense in the PipeWire context */
"format=<sample format> "
"adjust_time=<how often to readjust rates in s> "
"adjust_threshold=<how much drift to readjust after in ms> "
"autoloaded=<set if this module is being loaded automatically> "
"save_aec=<save AEC data in /tmp> "
"use_volume_sharing=<yes or no> "
"use_master_format=<yes or no> "
#endif
#define NAME "echo-cancel"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -114,29 +153,7 @@ static int module_echo_cancel_unload(struct module *module)
static const struct spa_dict_item module_echo_cancel_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Arun Raghavan <arun@asymptotic.io>" },
{ PW_KEY_MODULE_DESCRIPTION, "Acoustic echo canceller" },
{ PW_KEY_MODULE_USAGE, "source_name=<name for the source> "
"source_properties=<properties for the source> "
"source_master=<name of source to filter> "
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"sink_master=<name of sink to filter> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"aec_method=<implementation to use> "
"aec_args=<parameters for the AEC engine> "
#if 0
/* These are not implemented because they don't
* really make sense in the PipeWire context */
"format=<sample format> "
"adjust_time=<how often to readjust rates in s> "
"adjust_threshold=<how much drift to readjust after in ms> "
"autoloaded=<set if this module is being loaded automatically> "
"save_aec=<save AEC data in /tmp> "
"use_volume_sharing=<yes or no> "
"use_master_format=<yes or no> "
#endif
},
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -11,6 +11,17 @@
#include "../module.h"
/** \page page_pulse_module_gsettings GSettings
*
* ## Module Name
*
* `module-gsettings`
*
* ## Module Options
*
* No options.
*/
#define NAME "gsettings"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);

View file

@ -8,6 +8,35 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_jackdbus_detect JackDBus Detect
*
* ## Module Name
*
* `module-jackdbus-detect`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_jackdbus_detect "libpipewire-module-jackdbus-detect"
*/
static const char *const pulse_module_options =
"channels=<number of channels> "
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"sink_client_name=<jack client name> "
"sink_channels=<number of channels> "
"sink_channel_map=<channel map> "
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"source_client_name=<jack client name> "
"source_channels=<number of channels> "
"source_channel_map=<channel map> "
"connect=<connect ports?>";
#define NAME "jackdbus-detect"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -93,19 +122,7 @@ static int module_jackdbus_detect_unload(struct module *module)
static const struct spa_dict_item module_jackdbus_detect_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.con>" },
{ PW_KEY_MODULE_DESCRIPTION, "Creates a JACK client when jackdbus is started" },
{ PW_KEY_MODULE_USAGE,
"channels=<number of channels> "
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"sink_client_name=<jack client name> "
"sink_channels=<number of channels> "
"sink_channel_map=<channel map> "
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"source_client_name=<jack client name> "
"source_channels=<number of channels> "
"source_channel_map=<channel map> "
"connect=<connect ports?>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -11,6 +11,37 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_ladspa_sink LADSPA Sink
*
* ## Module Name
*
* `module-ladspa-sink`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_filter_chain "libpipewire-module-filter-chain"
*/
static const char *const pulse_module_options =
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"sink_input_properties=<properties for the sink input> "
"master=<name of sink to filter> "
"sink_master=<name of sink to filter> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<input channel map> "
"plugin=<ladspa plugin name> "
"label=<ladspa plugin label> "
"control=<comma separated list of input control values> "
"input_ladspaport_map=<comma separated list of input LADSPA port names> "
"output_ladspaport_map=<comma separated list of output LADSPA port names> ";
#define NAME "ladspa-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -126,21 +157,7 @@ static int module_ladspa_sink_unload(struct module *module)
static const struct spa_dict_item module_ladspa_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Virtual LADSPA sink" },
{ PW_KEY_MODULE_USAGE,
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"sink_input_properties=<properties for the sink input> "
"master=<name of sink to filter> "
"sink_master=<name of sink to filter> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<input channel map> "
"plugin=<ladspa plugin name> "
"label=<ladspa plugin label> "
"control=<comma separated list of input control values> "
"input_ladspaport_map=<comma separated list of input LADSPA port names> "
"output_ladspaport_map=<comma separated list of output LADSPA port names> "},
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -11,6 +11,37 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_ladspa_source LADSPA Source
*
* ## Module Name
*
* `module-ladspa-source`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_filter_chain "libpipewire-module-filter-chain"
*/
static const char *const pulse_module_options =
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"source_output_properties=<properties for the source output> "
"master=<name of source to filter> "
"source_master=<name of source to filter> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<input channel map> "
"plugin=<ladspa plugin name> "
"label=<ladspa plugin label> "
"control=<comma separated list of input control values> "
"input_ladspaport_map=<comma separated list of input LADSPA port names> "
"output_ladspaport_map=<comma separated list of output LADSPA port names> ";
#define NAME "ladspa-source"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -126,21 +157,7 @@ static int module_ladspa_source_unload(struct module *module)
static const struct spa_dict_item module_ladspa_source_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Virtual LADSPA source" },
{ PW_KEY_MODULE_USAGE,
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"source_output_properties=<properties for the source output> "
"master=<name of source to filter> "
"source_master=<name of source to filter> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<input channel map> "
"plugin=<ladspa plugin name> "
"label=<ladspa plugin label> "
"control=<comma separated list of input control values> "
"input_ladspaport_map=<comma separated list of input LADSPA port names> "
"output_ladspaport_map=<comma separated list of output LADSPA port names> "},
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -11,6 +11,34 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_loopback Loopback
*
* ## Module Name
*
* `module-loopback`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_loopback "libpipewire-module-loopback"
*/
static const char *const pulse_module_options =
"source=<source to connect to> "
"sink=<sink to connect to> "
"latency_msec=<latency in ms> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"sink_input_properties=<proplist> "
"source_output_properties=<proplist> "
"source_dont_move=<boolean> "
"sink_dont_move=<boolean> "
"remix=<remix channels?> ";
#define NAME "loopback"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -99,17 +127,7 @@ static int module_loopback_unload(struct module *module)
static const struct spa_dict_item module_loopback_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Arun Raghavan <arun@asymptotic.io>" },
{ PW_KEY_MODULE_DESCRIPTION, "Loopback from source to sink" },
{ PW_KEY_MODULE_USAGE, "source=<source to connect to> "
"sink=<sink to connect to> "
"latency_msec=<latency in ms> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"sink_input_properties=<proplist> "
"source_output_properties=<proplist> "
"source_dont_move=<boolean> "
"sink_dont_move=<boolean> "
"remix=<remix channels?> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -8,6 +8,22 @@
#include "../pulse-server.h"
#include "../server.h"
/** \page page_pulse_module_native_protocol_tcp Pulseaudio TCP Protocol
*
* ## Module Name
*
* `module-native-protocol-tcp`
*
* ## Module Options
*
* @pulse_module_options@
*/
static const char *const pulse_module_options =
"port=<TCP port number> "
"listen=<address to listen on> "
"auth-anonymous=<don't check for cookies?>";
#define NAME "protocol-tcp"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -53,9 +69,7 @@ static int module_native_protocol_tcp_unload(struct module *module)
static const struct spa_dict_item module_native_protocol_tcp_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Native protocol (TCP sockets)" },
{ PW_KEY_MODULE_USAGE, "port=<TCP port number> "
"listen=<address to listen on> "
"auth-anonymous=<don't check for cookies?>"},
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -7,6 +7,25 @@
#include "../manager.h"
#include "../module.h"
/** \page page_pulse_module_null_sink Null Sink
*
* ## Module Name
*
* `module-null-sink`
*
* ## Module Options
*
* @pulse_module_options@
*/
static const char *const pulse_module_options =
"sink_name=<name of sink> "
"sink_properties=<properties for the sink> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map>";
#define NAME "null-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -129,12 +148,7 @@ static int module_null_sink_unload(struct module *module)
static const struct spa_dict_item module_null_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "A NULL sink" },
{ PW_KEY_MODULE_USAGE, "sink_name=<name of sink> "
"sink_properties=<properties for the sink> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -14,6 +14,31 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_pipe_sink Pipe Sink
*
* ## Module Name
*
* `module-pipe-sink`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_pipe_tunnel "libpipewire-module-pipe-tunnel"
*/
static const char *const pulse_module_options =
"file=<name of the FIFO special file to use> "
"sink_name=<name for the sink> "
"sink_properties=<sink properties> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"use_system_clock_for_timing=<yes or no> ";
#define NAME "pipe-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -94,14 +119,7 @@ static int module_pipe_sink_unload(struct module *module)
static const struct spa_dict_item module_pipe_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
{ PW_KEY_MODULE_DESCRIPTION, "Pipe sink" },
{ PW_KEY_MODULE_USAGE, "file=<name of the FIFO special file to use> "
"sink_name=<name for the sink> "
"sink_properties=<sink properties> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"use_system_clock_for_timing=<yes or no> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -14,6 +14,30 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_pipe_source Pipe Source
*
* ## Module Name
*
* `module-pipe-source`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_pipe_tunnel "libpipewire-module-pipe-tunnel"
*/
static const char *const pulse_module_options =
"file=<name of the FIFO special file to use> "
"source_name=<name for the source> "
"source_properties=<source properties> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> ";
#define NAME "pipe-source"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -94,13 +118,7 @@ static int module_pipe_source_unload(struct module *module)
static const struct spa_dict_item module_pipe_source_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
{ PW_KEY_MODULE_DESCRIPTION, "Pipe source" },
{ PW_KEY_MODULE_USAGE, "file=<name of the FIFO special file to use> "
"source_name=<name for the source> "
"source_properties=<source properties> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -8,6 +8,21 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_raop_discover RAOP Discover
*
* ## Module Name
*
* `module-raop-discover`
*
* ## Module Options
*
* No options.
*
* ## See Also
*
* \ref page_module_raop_discover "libpipewire-module-raop-discover"
*/
#define NAME "raop-discover"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);

View file

@ -10,6 +10,33 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_remap_sink Remap Sink
*
* ## Module Name
*
* `module-remap-sink`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_loopback "libpipewire-module-loopback"
*/
static const char *const pulse_module_options =
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"master=<name of sink to remap> "
"master_channel_map=<channel map> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"resample_method=<resampler> "
"remix=<remix channels?>";
#define NAME "remap-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -96,16 +123,7 @@ static int module_remap_sink_unload(struct module *module)
static const struct spa_dict_item module_remap_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Remap sink channels" },
{ PW_KEY_MODULE_USAGE, "sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"master=<name of sink to remap> "
"master_channel_map=<channel map> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"resample_method=<resampler> "
"remix=<remix channels?>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -10,6 +10,33 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_remap_source Remap Source
*
* ## Module Name
*
* `module-remap-source`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_loopback "libpipewire-module-loopback"
*/
static const char *const pulse_module_options =
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"master=<name of source to filter> "
"master_channel_map=<channel map> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"resample_method=<resampler> "
"remix=<remix channels?>";
#define NAME "remap-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -96,16 +123,7 @@ static int module_remap_source_unload(struct module *module)
static const struct spa_dict_item module_remap_source_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Remap source channels" },
{ PW_KEY_MODULE_USAGE, "source_name=<name for the source> "
"source_properties=<properties for the source> "
"master=<name of source to filter> "
"master_channel_map=<channel map> "
"format=<sample format> "
"rate=<sample rate> "
"channels=<number of channels> "
"channel_map=<channel map> "
"resample_method=<resampler> "
"remix=<remix channels?>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -9,7 +9,32 @@
#include "../defs.h"
#include "../module.h"
#define NAME "roc-source"
/** \page page_pulse_module_roc_sink_input ROC Sink Input
*
* ## Module Name
*
* `module-roc-sink-input`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_roc_source "libpipewire-module-roc-source"
*/
static const char *const pulse_module_options =
"sink=<name for the sink> "
"sink_input_properties=<properties for the sink_input> "
"resampler_profile=<empty>|disable|high|medium|low "
"fec_code=<empty>|disable|rs8m|ldpc "
"sess_latency_msec=<target network latency in milliseconds> "
"local_ip=<local receiver ip> "
"local_source_port=<local receiver port for source packets> "
"local_repair_port=<local receiver port for repair packets> ";
#define NAME "roc-sink-input"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
#define PW_LOG_TOPIC_DEFAULT mod_topic
@ -92,14 +117,7 @@ static int module_roc_sink_input_unload(struct module *module)
static const struct spa_dict_item module_roc_sink_input_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
{ PW_KEY_MODULE_DESCRIPTION, "roc sink-input" },
{ PW_KEY_MODULE_USAGE, "sink=<name for the sink> "
"sink_input_properties=<properties for the sink_input> "
"resampler_profile=<empty>|disable|high|medium|low "
"fec_code=<empty>|disable|rs8m|ldpc "
"sess_latency_msec=<target network latency in milliseconds> "
"local_ip=<local receiver ip> "
"local_source_port=<local receiver port for source packets> "
"local_repair_port=<local receiver port for repair packets> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -9,6 +9,29 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_roc_sink ROC Sink
*
* ## Module Name
*
* `module-roc-sink`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_roc_sink "libpipewire-module-roc-sink"
*/
static const char *const pulse_module_options =
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"fec_code=<empty>|disable|rs8m|ldpc "
"remote_ip=<remote receiver ip> "
"remote_source_port=<remote receiver port for source packets> "
"remote_repair_port=<remote receiver port for repair packets> ";
#define NAME "roc-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -101,12 +124,7 @@ static const char* const valid_args[] = {
static const struct spa_dict_item module_roc_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
{ PW_KEY_MODULE_DESCRIPTION, "roc sink" },
{ PW_KEY_MODULE_USAGE, "sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"fec_code=<empty>|disable|rs8m|ldpc "
"remote_ip=<remote receiver ip> "
"remote_source_port=<remote receiver port for source packets> "
"remote_repair_port=<remote receiver port for repair packets> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -9,6 +9,31 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_roc_source ROC Source
*
* ## Module Name
*
* `module-roc-source`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_roc_source "libpipewire-module-roc-source"
*/
static const char *const pulse_module_options =
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"resampler_profile=<empty>|disable|high|medium|low "
"fec_code=<empty>|disable|rs8m|ldpc "
"sess_latency_msec=<target network latency in milliseconds> "
"local_ip=<local receiver ip> "
"local_source_port=<local receiver port for source packets> "
"local_repair_port=<local receiver port for repair packets> ";
#define NAME "roc-source"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -104,14 +129,7 @@ static const char* const valid_args[] = {
static const struct spa_dict_item module_roc_source_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
{ PW_KEY_MODULE_DESCRIPTION, "roc source" },
{ PW_KEY_MODULE_USAGE, "source_name=<name for the source> "
"source_properties=<properties for the source> "
"resampler_profile=<empty>|disable|high|medium|low "
"fec_code=<empty>|disable|rs8m|ldpc "
"sess_latency_msec=<target network latency in milliseconds> "
"local_ip=<local receiver ip> "
"local_source_port=<local receiver port for source packets> "
"local_repair_port=<local receiver port for repair packets> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -8,6 +8,26 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_rtp_recv RTP Receiver
*
* ## Module Name
*
* `module-rtp-recv`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_rtp_sap "libpipewire-module-rtp-sap"
*/
static const char *const pulse_module_options =
"sink=<name of the sink> "
"sap_address=<multicast address to listen on> "
"latency_msec=<latency in ms> ";
#define NAME "rtp-recv"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -94,9 +114,7 @@ static int module_rtp_recv_unload(struct module *module)
static const struct spa_dict_item module_rtp_recv_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Receive data from a network via RTP/SAP/SDP" },
{ PW_KEY_MODULE_USAGE, "sink=<name of the sink> "
"sap_address=<multicast address to listen on> "
"latency_msec=<latency in ms> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -8,6 +8,36 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_rtp_send RTP Sender
*
* ## Module Name
*
* `module-rtp-send`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_rtp_sink "libpipewire-module-rtp-sink"
*/
static const char *const pulse_module_options =
"source=<name of the source> "
"format=<sample format> "
"channels=<number of channels> "
"rate=<sample rate> "
"destination_ip=<destination IP address> "
"source_ip=<source IP address> "
"port=<port number> "
"mtu=<maximum transfer unit> "
"loop=<loopback to local host?> "
"ttl=<ttl value> "
"inhibit_auto_suspend=<always|never|only_with_non_monitor_sources> "
"stream_name=<name of the stream> "
"enable_opus=<enable OPUS codec>";
#define NAME "rtp-send"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -136,19 +166,7 @@ static int module_rtp_send_unload(struct module *module)
static const struct spa_dict_item module_rtp_send_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Read data from source and send it to the network via RTP/SAP/SDP" },
{ PW_KEY_MODULE_USAGE, "source=<name of the source> "
"format=<sample format> "
"channels=<number of channels> "
"rate=<sample rate> "
"destination_ip=<destination IP address> "
"source_ip=<source IP address> "
"port=<port number> "
"mtu=<maximum transfer unit> "
"loop=<loopback to local host?> "
"ttl=<ttl value> "
"inhibit_auto_suspend=<always|never|only_with_non_monitor_sources> "
"stream_name=<name of the stream> "
"enable_opus=<enable OPUS codec>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -8,6 +8,33 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_simple_protocol_tcp Simple TCP Protocol
*
* ## Module Name
*
* `module-simple-protocol-tcp`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_protocol_simple "libpipewire-module-protocol-simple"
*/
static const char *const pulse_module_options =
"rate=<sample rate> "
"format=<sample format> "
"channels=<number of channels> "
"channel_map=<number of channels> "
"sink=<sink to connect to> "
"source=<source to connect to> "
"playback=<enable playback?> "
"record=<enable record?> "
"port=<TCP port number> "
"listen=<address to listen on>";
#define NAME "simple-protocol-tcp"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -84,16 +111,7 @@ static int module_simple_protocol_tcp_unload(struct module *module)
static const struct spa_dict_item module_simple_protocol_tcp_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Simple protocol (TCP sockets)" },
{ PW_KEY_MODULE_USAGE, "rate=<sample rate> "
"format=<sample format> "
"channels=<number of channels> "
"channel_map=<number of channels> "
"sink=<sink to connect to> "
"source=<source to connect to> "
"playback=<enable playback?> "
"record=<enable record?> "
"port=<TCP port number> "
"listen=<address to listen on>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -15,6 +15,22 @@
#include "../manager.h"
#include "../collect.h"
/** \page page_pulse_module_switch_on_connect Switch on Connect
*
* ## Module Name
*
* `module-switch-on-connect`
*
* ## Module Options
*
* @pulse_module_options@
*/
static const char *const pulse_module_options =
"only_from_unavailable=<boolean, only switch from unavailable ports (not implemented yet)> "
"ignore_virtual=<boolean, ignore new virtual sinks and sources, defaults to true> "
"blocklist=<regex, ignore matching devices, default=hdmi> ";
#define NAME "switch-on-connect"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -215,9 +231,7 @@ static const struct spa_dict_item module_switch_on_connect_info[] = {
"This module exists for Pulseaudio compatibility, and is useful only when some applications "
"try to manage the default sinks/sources themselves and interfere with PipeWire's builtin "
"default device switching." },
{ PW_KEY_MODULE_USAGE, "only_from_unavailable=<boolean, only switch from unavailable ports (not implemented yet)> "
"ignore_virtual=<boolean, ignore new virtual sinks and sources, defaults to true> "
"blocklist=<regex, ignore matching devices, default=hdmi> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -12,6 +12,33 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_tunnel_sink Tunnel Sink
*
* ## Module Name
*
* `module-tunnel-sink`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_pulse_tunnel "libpipewire-module-pulse-tunnel"
*/
static const char *const pulse_module_options =
"server=<address> "
"sink=<name of the remote sink> "
"sink_name=<name for the local sink> "
"sink_properties=<properties for the local sink> "
"format=<sample format> "
"channels=<number of channels> "
"rate=<sample rate> "
"channel_map=<channel map> "
"latency_msec=<fixed latency in ms> "
"cookie=<cookie file path>";
#define NAME "tunnel-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -92,17 +119,7 @@ static int module_tunnel_sink_unload(struct module *module)
static const struct spa_dict_item module_tunnel_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Create a network sink which connects to a remote PulseAudio server" },
{ PW_KEY_MODULE_USAGE,
"server=<address> "
"sink=<name of the remote sink> "
"sink_name=<name for the local sink> "
"sink_properties=<properties for the local sink> "
"format=<sample format> "
"channels=<number of channels> "
"rate=<sample rate> "
"channel_map=<channel map> "
"latency_msec=<fixed latency in ms> "
"cookie=<cookie file path>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -12,6 +12,33 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_tunnel_source Tunnel Source
*
* ## Module Name
*
* `module-tunnel-source`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_pulse_tunnel "libpipewire-module-pulse-tunnel"
*/
static const char *const pulse_module_options =
"server=<address> "
"source=<name of the remote source> "
"source_name=<name for the local source> "
"source_properties=<properties for the local source> "
"format=<sample format> "
"channels=<number of channels> "
"rate=<sample rate> "
"channel_map=<channel map> "
"latency_msec=<fixed latency in ms> "
"cookie=<cookie file path>";
#define NAME "tunnel-source"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -92,17 +119,7 @@ static int module_tunnel_source_unload(struct module *module)
static const struct spa_dict_item module_tunnel_source_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Create a network source which connects to a remote PulseAudio server" },
{ PW_KEY_MODULE_USAGE,
"server=<address> "
"source=<name of the remote source> "
"source_name=<name for the local source> "
"source_properties=<properties for the local source> "
"format=<sample format> "
"channels=<number of channels> "
"rate=<sample rate> "
"channel_map=<channel map> "
"latency_msec=<fixed latency in ms> "
"cookie=<cookie file path>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -10,6 +10,30 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_virtual_sink Virtual Sink
*
* ## Module Name
*
* `module-virtual-sink`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_loopback "libpipewire-module-loopback"
*/
static const char *const pulse_module_options =
"sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"master=<name of sink to filter> "
"channels=<number of channels> "
"channel_map=<channel map> "
"use_volume_sharing=<yes or no> "
"force_flat_volume=<yes or no> ";
#define NAME "virtual-sink"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -98,13 +122,7 @@ static int module_virtual_sink_unload(struct module *module)
static const struct spa_dict_item module_virtual_sink_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "Virtual sink" },
{ PW_KEY_MODULE_USAGE, "sink_name=<name for the sink> "
"sink_properties=<properties for the sink> "
"master=<name of sink to filter> "
"channels=<number of channels> "
"channel_map=<channel map> "
"use_volume_sharing=<yes or no> "
"force_flat_volume=<yes or no> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -11,6 +11,31 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_virtual_source Virtual Source
*
* ## Module Name
*
* `module-virtual-source`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_loopback "libpipewire-module-loopback"
*/
static const char *const pulse_module_options =
"source_name=<name for the source> "
"source_properties=<properties for the source> "
"master=<name of source to filter> "
"uplink_sink=<name> (optional)"
"channels=<number of channels> "
"channel_map=<channel map> "
"use_volume_sharing=<yes or no> "
"force_flat_volume=<yes or no> ";
#define NAME "virtual-source"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -99,14 +124,7 @@ static int module_virtual_source_unload(struct module *module)
static const struct spa_dict_item module_virtual_source_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Arun Raghavan <arun@asymptotic.io>" },
{ PW_KEY_MODULE_DESCRIPTION, "Loopback from source to sink" },
{ PW_KEY_MODULE_USAGE, "source_name=<name for the source> "
"source_properties=<properties for the source> "
"master=<name of source to filter> "
"uplink_sink=<name> (optional)"
"channels=<number of channels> "
"channel_map=<channel map> "
"use_volume_sharing=<yes or no> "
"force_flat_volume=<yes or no> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -6,6 +6,27 @@
#include "../module.h"
/** \page page_pulse_module_x11_bell X11 Bell
*
* ## Module Name
*
* `module-x11-bell`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_x11_bell "libpipewire-module-x11-bell"
*/
static const char *const pulse_module_options =
"sink=<sink to connect to> "
"sample=<the sample to play> "
"display=<X11 display> "
"xauthority=<X11 Authority>";
#define NAME "x11-bell"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -93,10 +114,7 @@ static int module_x11_bell_prepare(struct module * const module)
static const struct spa_dict_item module_x11_bell_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
{ PW_KEY_MODULE_DESCRIPTION, "X11 bell interceptor" },
{ PW_KEY_MODULE_USAGE, "sink=<sink to connect to> "
"sample=<the sample to play> "
"display=<X11 display> "
"xauthority=<X11 Authority>" },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -8,6 +8,24 @@
#include "../defs.h"
#include "../module.h"
/** \page page_pulse_module_zeroconf_discover Zeroconf Discover
*
* ## Module Name
*
* `module-zeroconf-discover`
*
* ## Module Options
*
* @pulse_module_options@
*
* ## See Also
*
* \ref page_module_zeroconf_discover "libpipewire-module-zeroconf-discover"
*/
static const char *const pulse_module_options =
"latency_msec=<fixed latency in ms> ";
#define NAME "zeroconf-discover"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
@ -84,8 +102,7 @@ static int module_zeroconf_discover_unload(struct module *module)
static const struct spa_dict_item module_zeroconf_discover_info[] = {
{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.con>" },
{ PW_KEY_MODULE_DESCRIPTION, "mDNS/DNS-SD Service Discovery" },
{ PW_KEY_MODULE_USAGE,
"latency_msec=<fixed latency in ms> " },
{ PW_KEY_MODULE_USAGE, pulse_module_options },
{ PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
};

View file

@ -24,6 +24,17 @@
#include <avahi-common/domain.h>
#include <avahi-common/malloc.h>
/** \page page_pulse_module_zeroconf_publish Zeroconf Publish
*
* ## Module Name
*
* `module-zeroconf-publish`
*
* ## Module Options
*
* No options.
*/
#define NAME "zeroconf-publish"
PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);