mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-02 09:01:46 -05:00
update upstream-2021-08-15
This commit is contained in:
parent
c8653c13fa
commit
1703683def
297 changed files with 91782 additions and 54869 deletions
67
CONTRIBUTING.md
Normal file
67
CONTRIBUTING.md
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
# Contribution Guidelines
|
||||||
|
|
||||||
|
## A note for contributors
|
||||||
|
|
||||||
|
Thank you for your contribution!
|
||||||
|
|
||||||
|
Please make sure you tick the box labelled `Allow commits from members who can
|
||||||
|
merge to the target branch`. This allows us to make minor edits ourselves, and
|
||||||
|
then automatically rebase and merge your changes.
|
||||||
|
|
||||||
|
PulseAudio is currently maintained by three volunteer developers in their free
|
||||||
|
time (probably amounting to less than one full time developer), which is not
|
||||||
|
really enough, given the project size and scope. For this reason bug reports
|
||||||
|
and patch submissions are sometimes handled very slowly.
|
||||||
|
|
||||||
|
For non-trivial patches, we meet biweekly on IRC to discuss and prioritise
|
||||||
|
outstanding MRs. If you haven't heard from us a few days after you create the
|
||||||
|
MR, please take a look at [the patch status
|
||||||
|
page](https://www.freedesktop.org/wiki/Software/PulseAudio/PatchStatus/).
|
||||||
|
|
||||||
|
If you don't see your MR in that list either, please don't hesitate to drop a
|
||||||
|
comment pinging us, and we'll try to at least respond and make sure your
|
||||||
|
request is tracked on that list.
|
||||||
|
|
||||||
|
## Coding Style
|
||||||
|
|
||||||
|
Please take a look at the [coding style
|
||||||
|
documentation](https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/CodingStyle/)
|
||||||
|
on our wiki.
|
||||||
|
|
||||||
|
## Commit messages
|
||||||
|
|
||||||
|
We follow the standard git commit message format of a summary on the first line
|
||||||
|
(<=50 characters for preference, <=72 characters otherwise), followed by a new
|
||||||
|
line, followed by a detailed commit message. An additional line at the end may
|
||||||
|
link to an issue being fixed by this MR.
|
||||||
|
|
||||||
|
The first line is usually a short description of "what" your commit does, and
|
||||||
|
the rest of the message describes the "why", along with any additional
|
||||||
|
information that readers might need to understand the rationale for the change.
|
||||||
|
If in doubt, more verbose is better than less.
|
||||||
|
|
||||||
|
If you need to describe the "how" of the commit, that is usually best
|
||||||
|
documented along with the code itself.
|
||||||
|
|
||||||
|
Commit messages are prefixed with the subsystem being affected. Your best bet
|
||||||
|
to figure out what is appropriate is to look at previous commit messages. An
|
||||||
|
example:
|
||||||
|
|
||||||
|
```
|
||||||
|
sink: Reduce chat sink priority
|
||||||
|
|
||||||
|
Some gaming sound cards have custom profiles with analog-game and
|
||||||
|
analog-chat mappings that exist simultaneously. The game sink should
|
||||||
|
have higher priority than the chat sink, but currently there's no way to
|
||||||
|
affect the sink priorities from the profile-set configuration (the
|
||||||
|
mapping priority is not propagated to the sink priority).
|
||||||
|
|
||||||
|
I first thought about adding the mapping priority to the sink priority,
|
||||||
|
but that could mess up the prioritization system in
|
||||||
|
pa_device_init_priority(). I ended up checking for the intended roles
|
||||||
|
property to reduce the chat sink priority. I also reduced the iec958
|
||||||
|
priority so that the chat and iec958 sinks don't end up with the same
|
||||||
|
priority.
|
||||||
|
|
||||||
|
Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/818
|
||||||
|
```
|
||||||
265
NEWS
265
NEWS
|
|
@ -1,3 +1,268 @@
|
||||||
|
PulseAudio 15.0
|
||||||
|
|
||||||
|
Changes at a glance:
|
||||||
|
|
||||||
|
* Notes for end users
|
||||||
|
* Support for LDAC and AptX bluetooth codecs, plus "SBC XQ" (SBC with higher-quality parameters)
|
||||||
|
* Support for HFP bluetooth profiles
|
||||||
|
* Support for Bluetooth A2DP AVRCP Absolute Volume
|
||||||
|
* ALSA path configuration files can now be placed in user home directory
|
||||||
|
* module-virtual-surround-sink rewritten
|
||||||
|
* More options for module-jackdbus-detect
|
||||||
|
* Improved hardware support
|
||||||
|
* SteelSeries Arctis 9
|
||||||
|
* HP Thunderbolt Dock 120W G2
|
||||||
|
* Behringer U-Phoria UMC22
|
||||||
|
* OnePlus Type-C Bullets
|
||||||
|
* Sennheiser GSX 1000/1200 PRO
|
||||||
|
* New udev variable: PULSE_MODARGS
|
||||||
|
* max_latency_msec argument added to module-null-source
|
||||||
|
* module-filter-apply can take filter parameters from device properties
|
||||||
|
* module-match can now be loaded multiple times
|
||||||
|
* Improvements to FreeBSD support
|
||||||
|
* Windows support added to Meson
|
||||||
|
* Additional commands for pactl
|
||||||
|
* Card profiles can be set to sticky
|
||||||
|
* Notes for application developers
|
||||||
|
* New API for sending messages from clients to PulseAudio objects
|
||||||
|
* New mechanism for applications to disable shared memory on their connection to PulseAudio
|
||||||
|
* Notes for packagers
|
||||||
|
* Autotools build system have been dropped
|
||||||
|
* The startup script can now read additional configuration from the /etc/pulse/default.pa.d/ directory
|
||||||
|
* Option to build client library and utilities only
|
||||||
|
* Avoid loading X11 modules on Wayland (GNOME-only for now)
|
||||||
|
* OSS support is now configurable in Meson
|
||||||
|
* Valgrind support is now configurable in Meson
|
||||||
|
|
||||||
|
Detailed change log:
|
||||||
|
|
||||||
|
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/15.0/
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
|
||||||
|
Alexey Rubtsov
|
||||||
|
Alper Nebi Yasak
|
||||||
|
Anders Jonsson
|
||||||
|
Arun Raghavan
|
||||||
|
Ben Buchwald
|
||||||
|
Benjamin Valentin
|
||||||
|
Carlos Garnacho
|
||||||
|
Carmen Bianca Bakker
|
||||||
|
Christopher Arndt
|
||||||
|
Christopher Snowhill
|
||||||
|
David
|
||||||
|
Dusan Kazik
|
||||||
|
Edward Lee
|
||||||
|
Emilio Herrera
|
||||||
|
Evan Miller
|
||||||
|
Fabian Affolter
|
||||||
|
Faidon Liambotis
|
||||||
|
Felipe Sateler
|
||||||
|
Frédéric Danis
|
||||||
|
Georg Chini
|
||||||
|
Greg V
|
||||||
|
Göran Uddeborg
|
||||||
|
Hela Basa
|
||||||
|
Henri Chain
|
||||||
|
Hui Wang
|
||||||
|
Igor V. Kovalenko
|
||||||
|
Ilja van Sprundel
|
||||||
|
Jaechul Lee
|
||||||
|
James Bottomley
|
||||||
|
Jan Alexander Steffens (heftig)
|
||||||
|
Jan Kuparinen
|
||||||
|
Jaroslav Kysela
|
||||||
|
Jason Nader
|
||||||
|
Johannes Wolf
|
||||||
|
Julien Humbert
|
||||||
|
Kai-Heng Feng
|
||||||
|
Karl Ove Hufthammer
|
||||||
|
Klaas van Schelven
|
||||||
|
Laurent Bigonville
|
||||||
|
Laurențiu Nicola
|
||||||
|
Lyndon Brown
|
||||||
|
Marijn Suijten
|
||||||
|
Martin Wilck
|
||||||
|
Mattias Jernberg
|
||||||
|
Milo Casagrande
|
||||||
|
Nazar Mokrynskyi
|
||||||
|
Oğuz Ersen
|
||||||
|
Patrick Gaskin
|
||||||
|
Patrick McLean
|
||||||
|
Paul Seyfert
|
||||||
|
Pierre Ossman
|
||||||
|
Piotr Drąg
|
||||||
|
Pjotr Vertaalt
|
||||||
|
Ricky Tigg
|
||||||
|
Robin Lahtinen
|
||||||
|
Samuel Thibault
|
||||||
|
Sanchayan Maity
|
||||||
|
Scott Worley
|
||||||
|
Sebastian Krzyszkowiak
|
||||||
|
SimonP
|
||||||
|
Takashi Sakamoto
|
||||||
|
Tanu Kaskinen
|
||||||
|
Tobias Weise
|
||||||
|
Toni Estevez
|
||||||
|
Yaron Shahrabani
|
||||||
|
Yuri Chornoivan
|
||||||
|
morrishoresh
|
||||||
|
pseyfert
|
||||||
|
scootergrisen
|
||||||
|
simmon
|
||||||
|
|
||||||
|
|
||||||
|
PulseAudio 14.2
|
||||||
|
|
||||||
|
A bug fix release.
|
||||||
|
|
||||||
|
* Fix port switching when unplugging headphones
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
|
||||||
|
Tanu Kaskinen
|
||||||
|
|
||||||
|
|
||||||
|
PulseAudio 14.1
|
||||||
|
|
||||||
|
A bug fix release.
|
||||||
|
|
||||||
|
* Support upto 8 mixer channels on ALSA devices
|
||||||
|
* Handle ALSA jacks with the same name but different index values
|
||||||
|
* Switch to plugged-in headset when mic availability is unknown
|
||||||
|
* Fix a potential segfault in the Bluetooth oFono HFP backend
|
||||||
|
* Fix a problem with module-ladspa-sink when avoid-resampling=true
|
||||||
|
* Fix database names containing canonical host for meson builds
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
|
||||||
|
Arun Raghavan
|
||||||
|
Hui Wang
|
||||||
|
Igor V. Kovalenko
|
||||||
|
Jaroslav Kysela
|
||||||
|
Kai-Heng Feng
|
||||||
|
Patrick Gaskin
|
||||||
|
Tanu Kaskinen
|
||||||
|
morrishoresh
|
||||||
|
|
||||||
|
|
||||||
|
PulseAudio 14.0
|
||||||
|
|
||||||
|
Changes at a glance:
|
||||||
|
|
||||||
|
* Notes for end users
|
||||||
|
* Significant routing changes to default sinks/sources
|
||||||
|
* Changing the default sink moves streams from the old default sink to the new
|
||||||
|
* Moving a stream to the default sink removes the "manually routed" status of the stream
|
||||||
|
* If a sink changes status to available, streams that prefer that sink move there automatically
|
||||||
|
* The same changes have been applied to the source stream routing
|
||||||
|
* Workaround for GNOME Sound Settings' stream routing behaviour
|
||||||
|
* module-rescue-streams is deprecated, functionality moved to the core
|
||||||
|
* New rescue-streams option in daemon.conf
|
||||||
|
* Automatic switching to HDMI is now disabled by default
|
||||||
|
* Better support for some USB gaming headsets
|
||||||
|
* Flat volumes are now disabled by default
|
||||||
|
* The RAOP sink can be configured to automatically reconnect on connection failures
|
||||||
|
* Separate sink_channels and source_channels for module-jackdbus-detect
|
||||||
|
* Improved support for ALSA UCM
|
||||||
|
* Support for ALSA mixer controls with non-zero index
|
||||||
|
* It's now possible to set intended roles for devices in the ALSA profile configuration
|
||||||
|
* Ports now have a type associated with them
|
||||||
|
* Mappings have a new "description-key" option in the ALSA profile configuration
|
||||||
|
* New xauthority argument for X11 modules
|
||||||
|
* module-null-sink's compressed format support can now be configured at run-time
|
||||||
|
* The enable-lfe-remixing option in daemon.conf was split into remixing-produce-lfe and remixing-consume-lfe
|
||||||
|
* New channel_map argument for module-raop-sink
|
||||||
|
* Notes for application developers
|
||||||
|
* pa_mainloop_prepare interprets the timeout argument as microseconds again
|
||||||
|
* New availability_group and type fields in the port info structs
|
||||||
|
* New macros: PA_LIKELY(), PA_UNLIKELY(), PA_CLAMP() and PA_CLAMP_UNLIKELY()
|
||||||
|
* Notes for packagers
|
||||||
|
* New GStreamer-based RTP implementation
|
||||||
|
* qpaeq switched from Python 2 to Python 3
|
||||||
|
* Compile-time option to forget pre-14.0 stream routing
|
||||||
|
* The install path of the ALSA configuration files is now configurable
|
||||||
|
* GNU gettext minimum version requirement bumped from 0.19.3 to 0.19.8
|
||||||
|
* Heads-up: dropping autotools build system
|
||||||
|
* Heads-up: dropping EsounD support is considered, tell us if you still need it
|
||||||
|
* Heads-up: dropping GConf support
|
||||||
|
|
||||||
|
Detailed change log:
|
||||||
|
|
||||||
|
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/14.0/
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
|
||||||
|
Alexander E. Patrakov
|
||||||
|
Arun Raghavan
|
||||||
|
Balázs Meskó
|
||||||
|
Baurzhan Muftakhidinov
|
||||||
|
Ben Buchwald
|
||||||
|
Daniil Kovalev
|
||||||
|
Dave Chiluk
|
||||||
|
David Heidelberg
|
||||||
|
Dusan Kazik
|
||||||
|
Eero Nurkkala
|
||||||
|
Emanuil Novachev
|
||||||
|
Emilio Herrera
|
||||||
|
Felipe Sateler
|
||||||
|
Felix Yan
|
||||||
|
Geert Warrink
|
||||||
|
Georg Chini
|
||||||
|
Göran Uddeborg
|
||||||
|
Hugo Osvaldo Barrera
|
||||||
|
Hui Wang
|
||||||
|
Igor V. Kovalenko
|
||||||
|
Jan Alexander Steffens
|
||||||
|
Jarno Suni
|
||||||
|
Jaroslav Kysela
|
||||||
|
Jaska Uimonen
|
||||||
|
Jean-Baptiste Holcroft
|
||||||
|
Josh
|
||||||
|
Juliano de Souza Camargo
|
||||||
|
Kai-Heng Feng
|
||||||
|
Karl Ove Hufthammer
|
||||||
|
Khem Raj
|
||||||
|
Krzysztof Stasiowski
|
||||||
|
Laurent Bigonville
|
||||||
|
Libin Yang
|
||||||
|
Marc Ranolfi
|
||||||
|
Michael Pivonka
|
||||||
|
Milo Casagrande
|
||||||
|
Milo Ivir
|
||||||
|
Nick Moriarty
|
||||||
|
Oğuz Ersen
|
||||||
|
Pali Rohár
|
||||||
|
Peter Levine
|
||||||
|
Peter Meerwald
|
||||||
|
Philip Withnall
|
||||||
|
Piotr Drąg
|
||||||
|
RODRIGUEZ Christophe
|
||||||
|
Rafael Fontenelle
|
||||||
|
Ralph Seichter
|
||||||
|
Rasmus Thomsen
|
||||||
|
Rickie Schroeder
|
||||||
|
Rosen Penev
|
||||||
|
Ryszard Knop
|
||||||
|
Sanchayan Maity
|
||||||
|
Sebastian Dröge
|
||||||
|
Sebastien
|
||||||
|
StefanBruens
|
||||||
|
Taahir Ahmed
|
||||||
|
Tanu Kaskinen
|
||||||
|
Timo Gurr
|
||||||
|
Tom Yan
|
||||||
|
Tomasz Kontusz
|
||||||
|
Vasilis Tsiligiannis
|
||||||
|
Wim Taymans
|
||||||
|
Yi-Jyun Pan
|
||||||
|
Yuri Chornoivan
|
||||||
|
itsthem
|
||||||
|
muzena
|
||||||
|
roshal
|
||||||
|
zhaochengyi
|
||||||
|
|
||||||
|
|
||||||
PulseAudio 13.0
|
PulseAudio 13.0
|
||||||
|
|
||||||
Changes at a glance:
|
Changes at a glance:
|
||||||
|
|
|
||||||
23
PROTOCOL
23
PROTOCOL
|
|
@ -429,7 +429,28 @@ Added two values to the pa_encoding_t enum:
|
||||||
|
|
||||||
## v34, implemented by >= 14.0
|
## v34, implemented by >= 14.0
|
||||||
|
|
||||||
Added available_group and type fields to the device port info.
|
New fields in the port introspection data (duplicated for all port types:
|
||||||
|
sink, source and card ports):
|
||||||
|
|
||||||
|
string availability_group
|
||||||
|
uint32 type
|
||||||
|
|
||||||
|
## v35, implemented by >= 15.0
|
||||||
|
|
||||||
|
Added new command for communication with objects.
|
||||||
|
|
||||||
|
PA_COMMAND_SEND_OBJECT_MESSAGE:
|
||||||
|
sends a message to an object identified by an object path
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
string object_path - unique path identifying the object
|
||||||
|
string message - message name
|
||||||
|
string message_parameters - additional parameters if required (may be
|
||||||
|
NULL, which should be treated the same as an
|
||||||
|
empty string)
|
||||||
|
|
||||||
|
The command returns a string, which may be empty or NULL (NULL should be
|
||||||
|
treated the same as an empty string).
|
||||||
|
|
||||||
#### If you just changed the protocol, read this
|
#### If you just changed the protocol, read this
|
||||||
## module-tunnel depends on the sink/source/sink-input/source-input protocol
|
## module-tunnel depends on the sink/source/sink-input/source-input protocol
|
||||||
|
|
|
||||||
13
README
13
README
|
|
@ -19,7 +19,7 @@ TRAC/BUGZILLA TICKET CHANGES MAILING LIST:
|
||||||
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-bugs
|
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-bugs
|
||||||
|
|
||||||
IRC:
|
IRC:
|
||||||
#pulseaudio on irc.freenode.org
|
https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Community/#ircandmatrix
|
||||||
|
|
||||||
FRESHMEAT:
|
FRESHMEAT:
|
||||||
http://freshmeat.net/projects/pulseaudio/
|
http://freshmeat.net/projects/pulseaudio/
|
||||||
|
|
@ -31,13 +31,10 @@ AUTHORS:
|
||||||
Several
|
Several
|
||||||
|
|
||||||
HACKING:
|
HACKING:
|
||||||
In order to run pulseaudio from the build dir __OPTIMIZE__ should be
|
In order to run pulseaudio from the build dir:
|
||||||
disabled (look at src/pulsecore/core-util.h::pa_run_from_build_tree()),
|
meson build
|
||||||
this can be done by passing "CFLAGS=-O0" to the configure script:
|
meson compile -C build
|
||||||
./autogen.sh
|
build/src/daemon/pulseaudio -n -F build/src/daemon/default.pa -p $(pwd)/build/src/modules/
|
||||||
CFLAGS="-ggdb3 -O0" LDFLAGS="-ggdb3" ./configure
|
|
||||||
make
|
|
||||||
./src/pulseaudio -n -F src/default.pa -p $(pwd)/src/
|
|
||||||
|
|
||||||
SPELLING:
|
SPELLING:
|
||||||
PulseAudio
|
PulseAudio
|
||||||
|
|
|
||||||
49
doc/messaging_api.txt
Normal file
49
doc/messaging_api.txt
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
Message API reference
|
||||||
|
|
||||||
|
The message API allows any object within pulseaudio to register a message
|
||||||
|
handler. A message handler is a function that can be called by clients using
|
||||||
|
PA_COMMAND_SEND_OBJECT_MESSAGE. A message consists at least of an object path
|
||||||
|
and a message command, both specified as strings. Additional parameters can
|
||||||
|
be specified using a single string in JSON format, but are not mandatory.
|
||||||
|
|
||||||
|
The message handler returns an error number as defined in def.h and also returns
|
||||||
|
a string in the "response" variable. Non-empty response will be in JSON format.
|
||||||
|
|
||||||
|
The reference further down lists available messages, their parameters
|
||||||
|
and return values.
|
||||||
|
|
||||||
|
Reference:
|
||||||
|
|
||||||
|
Object path: /core
|
||||||
|
Message: list-handlers
|
||||||
|
Parameters: None
|
||||||
|
Return value: JSON array of handler description objects
|
||||||
|
[{"name":"Handler name","description":"Description"} ...]
|
||||||
|
|
||||||
|
Object path: /card/bluez_card.XX_XX_XX_XX_XX_XX/bluez
|
||||||
|
Message: list-codecs
|
||||||
|
Parameters: None
|
||||||
|
Return value: JSON array of codec description objects
|
||||||
|
[{"name":"codec1","description":"Codec 1"} ...]
|
||||||
|
|
||||||
|
Object path: /card/bluez_card.XX_XX_XX_XX_XX_XX/bluez
|
||||||
|
Message: get-codec
|
||||||
|
Parameters: None
|
||||||
|
Return value: "codec name"
|
||||||
|
|
||||||
|
Object path: /card/bluez_card.XX_XX_XX_XX_XX_XX/bluez
|
||||||
|
Message: switch-codec
|
||||||
|
Parameters: "codec name"
|
||||||
|
Return value: none
|
||||||
|
|
||||||
|
Description: Set if card profile selection should be sticky instead of being automated
|
||||||
|
Object path: /card/<card_name>
|
||||||
|
Message: set-profile-sticky
|
||||||
|
Parameters: JSON "true" or "false"
|
||||||
|
Return value: none
|
||||||
|
|
||||||
|
Description: Get if card profile selection should be sticky instead of being automated
|
||||||
|
Object path: /card/<card_name>
|
||||||
|
Message: get-profile-sticky
|
||||||
|
Parameters: None
|
||||||
|
Return value: JSON "true" or "false"
|
||||||
|
|
@ -52,7 +52,7 @@ PROJECT_LOGO =
|
||||||
# If a relative path is entered, it will be relative to the location
|
# If a relative path is entered, it will be relative to the location
|
||||||
# where doxygen was started. If left blank the current directory will be used.
|
# where doxygen was started. If left blank the current directory will be used.
|
||||||
|
|
||||||
OUTPUT_DIRECTORY =
|
OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@
|
||||||
|
|
||||||
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
|
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
|
||||||
# 4096 sub-directories (in 2 levels) under the output directory of each output
|
# 4096 sub-directories (in 2 levels) under the output directory of each output
|
||||||
|
|
@ -668,37 +668,37 @@ WARN_LOGFILE =
|
||||||
# directories like "/usr/src/myproject". Separate the files or directories
|
# directories like "/usr/src/myproject". Separate the files or directories
|
||||||
# with spaces.
|
# with spaces.
|
||||||
|
|
||||||
INPUT = @srcdir@/../src/pulse/channelmap.h \
|
INPUT = @top_srcdir@/src/pulse/channelmap.h \
|
||||||
@srcdir@/../src/pulse/context.h \
|
@top_srcdir@/src/pulse/context.h \
|
||||||
@srcdir@/../src/pulse/def.h \
|
@top_srcdir@/src/pulse/def.h \
|
||||||
@srcdir@/../src/pulse/direction.h \
|
@top_srcdir@/src/pulse/direction.h \
|
||||||
@srcdir@/../src/pulse/error.h \
|
@top_srcdir@/src/pulse/error.h \
|
||||||
@srcdir@/../src/pulse/ext-stream-restore.h \
|
@top_srcdir@/src/pulse/ext-stream-restore.h \
|
||||||
@srcdir@/../src/pulse/ext-device-manager.h \
|
@top_srcdir@/src/pulse/ext-device-manager.h \
|
||||||
@srcdir@/../src/pulse/ext-device-restore.h \
|
@top_srcdir@/src/pulse/ext-device-restore.h \
|
||||||
@srcdir@/../src/pulse/format.h \
|
@top_srcdir@/src/pulse/format.h \
|
||||||
@srcdir@/../src/pulse/gccmacro.h \
|
@top_srcdir@/src/pulse/gccmacro.h \
|
||||||
@srcdir@/../src/pulse/glib-mainloop.h \
|
@top_srcdir@/src/pulse/glib-mainloop.h \
|
||||||
@srcdir@/../src/pulse/introspect.h \
|
@top_srcdir@/src/pulse/introspect.h \
|
||||||
@srcdir@/../src/pulse/mainloop-api.h \
|
@top_srcdir@/src/pulse/mainloop-api.h \
|
||||||
@srcdir@/../src/pulse/mainloop-signal.h \
|
@top_srcdir@/src/pulse/mainloop-signal.h \
|
||||||
@srcdir@/../src/pulse/mainloop.h \
|
@top_srcdir@/src/pulse/mainloop.h \
|
||||||
@srcdir@/../src/pulse/operation.h \
|
@top_srcdir@/src/pulse/operation.h \
|
||||||
@srcdir@/../src/pulse/proplist.h \
|
@top_srcdir@/src/pulse/proplist.h \
|
||||||
@srcdir@/../src/pulse/pulseaudio.h \
|
@top_srcdir@/src/pulse/pulseaudio.h \
|
||||||
@srcdir@/../src/pulse/rtclock.h \
|
@top_srcdir@/src/pulse/rtclock.h \
|
||||||
@srcdir@/../src/pulse/sample.h \
|
@top_srcdir@/src/pulse/sample.h \
|
||||||
@srcdir@/../src/pulse/scache.h \
|
@top_srcdir@/src/pulse/scache.h \
|
||||||
@srcdir@/../src/pulse/simple.h \
|
@top_srcdir@/src/pulse/simple.h \
|
||||||
@srcdir@/../src/pulse/stream.h \
|
@top_srcdir@/src/pulse/stream.h \
|
||||||
@srcdir@/../src/pulse/subscribe.h \
|
@top_srcdir@/src/pulse/subscribe.h \
|
||||||
@srcdir@/../src/pulse/thread-mainloop.h \
|
@top_srcdir@/src/pulse/thread-mainloop.h \
|
||||||
@srcdir@/../src/pulse/timeval.h \
|
@top_srcdir@/src/pulse/timeval.h \
|
||||||
@srcdir@/../src/pulse/utf8.h \
|
@top_srcdir@/src/pulse/utf8.h \
|
||||||
@srcdir@/../src/pulse/util.h \
|
@top_srcdir@/src/pulse/util.h \
|
||||||
@srcdir@/../src/pulse/version.h \
|
@top_srcdir@/src/pulse/version.h \
|
||||||
@srcdir@/../src/pulse/volume.h \
|
@top_srcdir@/src/pulse/volume.h \
|
||||||
@srcdir@/../src/pulse/xmalloc.h
|
@top_srcdir@/src/pulse/xmalloc.h
|
||||||
|
|
||||||
# This tag can be used to specify the character encoding of the source files
|
# This tag can be used to specify the character encoding of the source files
|
||||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
|
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
|
||||||
|
|
@ -758,8 +758,8 @@ EXCLUDE_SYMBOLS =
|
||||||
# directories that contain example code fragments that are included (see
|
# directories that contain example code fragments that are included (see
|
||||||
# the \include command).
|
# the \include command).
|
||||||
|
|
||||||
EXAMPLE_PATH = @srcdir@/../src/utils \
|
EXAMPLE_PATH = @top_srcdir@/src/utils \
|
||||||
@srcdir@/../src/tests
|
@top_srcdir@/src/tests
|
||||||
|
|
||||||
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
||||||
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
|
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
|
||||||
|
|
|
||||||
10
doxygen/meson.build
Normal file
10
doxygen/meson.build
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
cdata.set('DOXYGEN_OUTPUT_DIRECTORY', meson.current_build_dir())
|
||||||
|
|
||||||
|
doxygen_conf = configure_file(
|
||||||
|
input : 'doxygen.conf.in',
|
||||||
|
output : 'doxygen.conf',
|
||||||
|
configuration : cdata,
|
||||||
|
)
|
||||||
|
|
||||||
|
run_target('doxygen',
|
||||||
|
command : ['doxygen', doxygen_conf])
|
||||||
|
|
@ -1,20 +1,37 @@
|
||||||
|
|
||||||
# man page name, section, [aliases]
|
# man page name, section, [aliases]
|
||||||
manpages = [
|
manpages = []
|
||||||
['default.pa', '5'],
|
|
||||||
|
if get_option('daemon')
|
||||||
|
manpages += [
|
||||||
|
['default.pa', '5'],
|
||||||
|
['pacmd', '1'],
|
||||||
|
['pasuspender', '1'],
|
||||||
|
['pulse-cli-syntax', '5'],
|
||||||
|
['pulse-daemon.conf', '5'],
|
||||||
|
['pulseaudio', '1'],
|
||||||
|
['start-pulseaudio-x11', '1'],
|
||||||
|
]
|
||||||
|
endif
|
||||||
|
|
||||||
|
manpages += [
|
||||||
['pacat', '1', ['paplay', 'parec', 'parecord', 'pamon']],
|
['pacat', '1', ['paplay', 'parec', 'parecord', 'pamon']],
|
||||||
['pacmd', '1'],
|
|
||||||
['pactl', '1'],
|
['pactl', '1'],
|
||||||
['padsp', '1'],
|
|
||||||
['pasuspender', '1'],
|
|
||||||
['pax11publish', '1'],
|
|
||||||
['pulse-cli-syntax', '5'],
|
|
||||||
['pulse-client.conf', '5'],
|
['pulse-client.conf', '5'],
|
||||||
['pulse-daemon.conf', '5'],
|
|
||||||
['pulseaudio', '1'],
|
|
||||||
['start-pulseaudio-x11', '1'],
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if cdata.has('HAVE_OSS_WRAPPER')
|
||||||
|
manpages += [
|
||||||
|
['padsp', '1'],
|
||||||
|
]
|
||||||
|
endif
|
||||||
|
|
||||||
|
if x11_dep.found()
|
||||||
|
manpages += [
|
||||||
|
['pax11publish', '1'],
|
||||||
|
]
|
||||||
|
endif
|
||||||
|
|
||||||
# FIXME: Add esdcompat if HAVE_ESOUND
|
# FIXME: Add esdcompat if HAVE_ESOUND
|
||||||
#manpages += ['esdcompat', '1'],
|
#manpages += ['esdcompat', '1'],
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,7 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<option>
|
<option>
|
||||||
<p><opt>--process-time-msec</opt><arg>=MSEC</arg></p>
|
<p><opt>--process-time-msec</opt><arg>=MSEC</arg></p>
|
||||||
<optdesc><p>Explicitly configure the process time, with a time
|
<optdesc><p>Explicitly configure the process time, with a time
|
||||||
specified in miliseconds. If left out the server will pick the
|
specified in milliseconds. If left out the server will pick the
|
||||||
process time. Use either this option or <opt>--process-time</opt>,
|
process time. Use either this option or <opt>--process-time</opt>,
|
||||||
but not both.</p></optdesc>
|
but not both.</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,12 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<optdesc><p>Choose the server to connect to.</p></optdesc>
|
<optdesc><p>Choose the server to connect to.</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option>
|
||||||
|
<p><opt>-f | --format</opt><arg>=FORMAT</arg></p>
|
||||||
|
|
||||||
|
<optdesc><p>Choose output format, available options are "text" or "json".</p></optdesc>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>-n | --client-name</opt><arg>=NAME</arg></p>
|
<p><opt>-n | --client-name</opt><arg>=NAME</arg></p>
|
||||||
|
|
||||||
|
|
@ -63,7 +69,7 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
<section name="Commands">
|
<section name="Commands">
|
||||||
<p>
|
<p>
|
||||||
When supplied as arguments to the commands below, the special names \@DEFAULT_SINK@, \@DEFAULT_SOURCE@ and \@DEFAULT_MONITOR@
|
When supplied as arguments to the commands below, the special names \@DEFAULT_SINK@, \@DEFAULT_SOURCE@ and \@DEFAULT_MONITOR@
|
||||||
can be used to specify the default sink, source and monitor respectively.
|
can be used to specify the default sink, source and monitor respectively.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
@ -80,8 +86,8 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<option>
|
<option>
|
||||||
<p><opt>list</opt> [<arg>short</arg>] [<arg>TYPE</arg>]</p>
|
<p><opt>list</opt> [<arg>short</arg>] [<arg>TYPE</arg>]</p>
|
||||||
<optdesc><p>Dump all currently loaded modules, available sinks, sources, streams, etc. <arg>TYPE</arg> must be one of:
|
<optdesc><p>Dump all currently loaded modules, available sinks, sources, streams, etc. <arg>TYPE</arg> must be one of:
|
||||||
modules, sinks, sources, sink-inputs, source-outputs, clients, samples, cards. If not specified, all info is listed. If
|
modules, sinks, sources, sink-inputs, source-outputs, clients, samples, cards, message-handlers. If not specified, all info is listed
|
||||||
short is given, output is in a tabular format, for easy parsing by scripts.</p></optdesc>
|
with the exception of the message-handlers. If short is given, output is in a tabular format, for easy parsing by scripts.</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
|
|
@ -135,7 +141,7 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<option>
|
<option>
|
||||||
<p><opt>suspend-sink</opt> <arg>SINK</arg> <arg>true|false</arg></p>
|
<p><opt>suspend-sink</opt> <arg>SINK</arg> <arg>true|false</arg></p>
|
||||||
<optdesc><p>Suspend or resume the specified sink (which may be
|
<optdesc><p>Suspend or resume the specified sink (which may be
|
||||||
specified either by its name or index), depending whether true
|
specified either by its symbolic name or numerical index), depending whether true
|
||||||
(suspend) or false (resume) is passed as last argument. Suspending
|
(suspend) or false (resume) is passed as last argument. Suspending
|
||||||
a sink will pause all playback. Depending on the module implementing
|
a sink will pause all playback. Depending on the module implementing
|
||||||
the sink this might have the effect that the underlying device is
|
the sink this might have the effect that the underlying device is
|
||||||
|
|
@ -147,7 +153,7 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<option>
|
<option>
|
||||||
<p><opt>suspend-source</opt> <arg>SOURCE</arg> <arg>true|false</arg></p>
|
<p><opt>suspend-source</opt> <arg>SOURCE</arg> <arg>true|false</arg></p>
|
||||||
<optdesc><p>Suspend or resume the specified source (which may be
|
<optdesc><p>Suspend or resume the specified source (which may be
|
||||||
specified either by its name or index), depending whether true
|
specified either by its symbolic name or numerical index), depending whether true
|
||||||
(suspend) or false (resume) is passed as last argument. Suspending
|
(suspend) or false (resume) is passed as last argument. Suspending
|
||||||
a source will pause all capturing. Depending on the module implementing
|
a source will pause all capturing. Depending on the module implementing
|
||||||
the source this might have the effect that the underlying device is
|
the source this might have the effect that the underlying device is
|
||||||
|
|
@ -161,9 +167,14 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<optdesc><p>Set the specified card (identified by its symbolic name or numerical index) to the specified profile (identified by its symbolic name).</p></optdesc>
|
<optdesc><p>Set the specified card (identified by its symbolic name or numerical index) to the specified profile (identified by its symbolic name).</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option>
|
||||||
|
<p><opt>get-default-sink</opt></p>
|
||||||
|
<optdesc><p>Returns the symbolic name of the default sink.</p></optdesc>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>set-default-sink</opt> <arg>SINK</arg></p>
|
<p><opt>set-default-sink</opt> <arg>SINK</arg></p>
|
||||||
<optdesc><p>Make the specified sink (identified by its symbolic name) the default sink.</p></optdesc>
|
<optdesc><p>Make the specified sink (identified by its symbolic name or numerical index) the default sink.</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
|
|
@ -171,9 +182,14 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<optdesc><p>Set the specified sink (identified by its symbolic name or numerical index) to the specified port (identified by its symbolic name).</p></optdesc>
|
<optdesc><p>Set the specified sink (identified by its symbolic name or numerical index) to the specified port (identified by its symbolic name).</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option>
|
||||||
|
<p><opt>get-default-source</opt></p>
|
||||||
|
<optdesc><p>Returns the symbolic name of the default source.</p></optdesc>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>set-default-source</opt> <arg>SOURCE</arg></p>
|
<p><opt>set-default-source</opt> <arg>SOURCE</arg></p>
|
||||||
<optdesc><p>Make the specified source (identified by its symbolic name) the default source.</p></optdesc>
|
<optdesc><p>Make the specified source (identified by its symbolic name or numerical index) the default source.</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
|
|
@ -187,6 +203,11 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<arg>OFFSET</arg> is a number which represents the latency offset in microseconds</p></optdesc>
|
<arg>OFFSET</arg> is a number which represents the latency offset in microseconds</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option>
|
||||||
|
<p><opt>get-sink-volume</opt> <arg>SINK</arg></p>
|
||||||
|
<optdesc><p>Get the volume of the specified sink (identified by its symbolic name or numerical index) displayed in the same format as the `info` command.</p></optdesc>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>set-sink-volume</opt> <arg>SINK</arg> <arg>VOLUME [VOLUME ...]</arg></p>
|
<p><opt>set-sink-volume</opt> <arg>SINK</arg> <arg>VOLUME [VOLUME ...]</arg></p>
|
||||||
<optdesc><p>Set the volume of the specified sink (identified by its symbolic name or numerical index).
|
<optdesc><p>Set the volume of the specified sink (identified by its symbolic name or numerical index).
|
||||||
|
|
@ -196,6 +217,12 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
volume values are given their number has to match the sink's number of channels.</p></optdesc>
|
volume values are given their number has to match the sink's number of channels.</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option>
|
||||||
|
<p><opt>get-source-volume</opt> <arg>SOURCE</arg></p>
|
||||||
|
```
|
||||||
|
<optdesc><p>Get the volume of the specified source (identified by its symbolic name or numerical index) displayed in the same format as the `info` command.</p></optdesc>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>set-source-volume</opt> <arg>SOURCE</arg> <arg>VOLUME [VOLUME ...]</arg></p>
|
<p><opt>set-source-volume</opt> <arg>SOURCE</arg> <arg>VOLUME [VOLUME ...]</arg></p>
|
||||||
<optdesc><p>Set the volume of the specified source (identified by its symbolic name or numerical index).
|
<optdesc><p>Set the volume of the specified source (identified by its symbolic name or numerical index).
|
||||||
|
|
@ -221,11 +248,21 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
volume values are given their number has to match the source output's number of channels.</p></optdesc>
|
volume values are given their number has to match the source output's number of channels.</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option>
|
||||||
|
<p><opt>get-sink-mute</opt> <arg>SINK</arg></p>
|
||||||
|
<optdesc><p>Get the mute status of the specified sink (identified by its symbolic name or numerical index).</p></optdesc>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>set-sink-mute</opt> <arg>SINK</arg> <arg>1|0|toggle</arg></p>
|
<p><opt>set-sink-mute</opt> <arg>SINK</arg> <arg>1|0|toggle</arg></p>
|
||||||
<optdesc><p>Set the mute status of the specified sink (identified by its symbolic name or numerical index).</p></optdesc>
|
<optdesc><p>Set the mute status of the specified sink (identified by its symbolic name or numerical index).</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option>
|
||||||
|
<p><opt>get-source-mute</opt> <arg>SOURCE</arg></p>
|
||||||
|
<optdesc><p>Get the mute status of the specified source (identified by its symbolic name or numerical index).</p></optdesc>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>set-source-mute</opt> <arg>SOURCE</arg> <arg>1|0|toggle</arg></p>
|
<p><opt>set-source-mute</opt> <arg>SOURCE</arg> <arg>1|0|toggle</arg></p>
|
||||||
<optdesc><p>Set the mute status of the specified source (identified by its symbolic name or numerical index).</p></optdesc>
|
<optdesc><p>Set the mute status of the specified source (identified by its symbolic name or numerical index).</p></optdesc>
|
||||||
|
|
@ -253,6 +290,13 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
for possible encodings. </p></optdesc>
|
for possible encodings. </p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option>
|
||||||
|
<p><opt>send-message</opt> <arg>RECIPIENT</arg> <arg>MESSAGE</arg> <arg>MESSAGE_PARAMETERS</arg></p>
|
||||||
|
<optdesc><p>Send a message to the specified recipient object. If applicable an additional string containing
|
||||||
|
message parameters can be specified. A string is returned as a response to the message. For available messages
|
||||||
|
see https://cgit.freedesktop.org/pulseaudio/pulseaudio/tree/doc/messaging_api.txt.</p></optdesc>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>subscribe</opt></p>
|
<p><opt>subscribe</opt></p>
|
||||||
<optdesc><p>Subscribe to events, pactl does not exit by itself, but keeps waiting for new events.</p></optdesc>
|
<optdesc><p>Subscribe to events, pactl does not exit by itself, but keeps waiting for new events.</p></optdesc>
|
||||||
|
|
|
||||||
|
|
@ -306,6 +306,13 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
<optdesc><p>Debug: Show shared properties.</p></optdesc>
|
<optdesc><p>Debug: Show shared properties.</p></optdesc>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option>
|
||||||
|
<p><opt>send-message</opt> <arg>recipient</arg> <arg>message</arg> <arg>message_parameters</arg></p>
|
||||||
|
<optdesc><p>Send a message to the specified recipient object. If applicable an additional string containing
|
||||||
|
message parameters can be specified. A string is returned as a response to the message. For available messages
|
||||||
|
see https://cgit.freedesktop.org/pulseaudio/pulseaudio/tree/doc/messaging_api.txt.</p></optdesc>
|
||||||
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>exit</opt></p>
|
<p><opt>exit</opt></p>
|
||||||
<optdesc><p>Terminate the daemon. If you want to terminate a CLI
|
<optdesc><p>Terminate the daemon. If you want to terminate a CLI
|
||||||
|
|
|
||||||
|
|
@ -77,8 +77,17 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
<p><opt>autospawn=</opt> Autospawn a PulseAudio daemon when
|
<p><opt>autospawn=</opt> Autospawn a PulseAudio daemon when needed. Takes
|
||||||
needed. Takes a boolean value, defaults to <opt>yes</opt>.</p>
|
a boolean value, defaults to <opt>yes</opt>. Note that setting this to
|
||||||
|
"no" doesn't disable the systemd service. The autospawn option is only
|
||||||
|
meant to be used on systems without systemd. If you use systemd to start
|
||||||
|
PulseAudio, use "systemctl --user stop pulseaudio.service
|
||||||
|
pulseaudio.socket" to stop the daemon temporarily, or "systemctl --user
|
||||||
|
mask pulseaudio.service pulseaudio.socket" to permanently disable the
|
||||||
|
units (the "disable" command of systemctl probably won't work, because
|
||||||
|
the pulseaudio.socket unit is often installed to
|
||||||
|
/usr/lib/systemd/user/sockets.target.wants/, which makes it impossible to
|
||||||
|
disable the unit with the "disable" command).</p>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
<option>
|
<option>
|
||||||
|
|
|
||||||
|
|
@ -326,7 +326,8 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
session, then any positive value will be reset to 0 so that PulseAudio
|
session, then any positive value will be reset to 0 so that PulseAudio
|
||||||
will terminate immediately on logout. A positive value therefore has
|
will terminate immediately on logout. A positive value therefore has
|
||||||
effect only in environments where there's no support for login session
|
effect only in environments where there's no support for login session
|
||||||
tracking. A negative value can still be used to disable any automatic
|
tracking (or if the user is logged in without a session spawned, a.k.a.
|
||||||
|
lingering). A negative value can still be used to disable any automatic
|
||||||
exit.</p>
|
exit.</p>
|
||||||
|
|
||||||
<p>When PulseAudio runs in the system mode, automatic exit is always
|
<p>When PulseAudio runs in the system mode, automatic exit is always
|
||||||
|
|
|
||||||
|
|
@ -212,8 +212,9 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
session, then any positive value will be reset to 0 so that PulseAudio
|
session, then any positive value will be reset to 0 so that PulseAudio
|
||||||
will terminate immediately on logout. A positive value therefore has
|
will terminate immediately on logout. A positive value therefore has
|
||||||
effect only in environments where there's no support for login session
|
effect only in environments where there's no support for login session
|
||||||
tracking. A negative value can still be used to disable any automatic
|
tracking (or if the user is logged in without a session spawned,
|
||||||
exit.</p>
|
a.k.a. lingering). A negative value can still be used to disable any
|
||||||
|
automatic exit.</p>
|
||||||
|
|
||||||
<p>When PulseAudio runs in the system mode, automatic exit is always
|
<p>When PulseAudio runs in the system mode, automatic exit is always
|
||||||
disabled, so this option does nothing.</p>
|
disabled, so this option does nothing.</p>
|
||||||
|
|
|
||||||
189
meson.build
189
meson.build
|
|
@ -4,6 +4,8 @@ project('pulseaudio', 'c', 'cpp',
|
||||||
default_options : [ 'c_std=gnu11', 'cpp_std=c++11' ]
|
default_options : [ 'c_std=gnu11', 'cpp_std=c++11' ]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
meson.add_dist_script('scripts/save-tarball-version.sh', meson.project_version())
|
||||||
|
|
||||||
pa_version_str = meson.project_version()
|
pa_version_str = meson.project_version()
|
||||||
# For tarballs, the first split will do nothing, but for builds in git, we
|
# For tarballs, the first split will do nothing, but for builds in git, we
|
||||||
# split out suffixes when there are commits since the last tag
|
# split out suffixes when there are commits since the last tag
|
||||||
|
|
@ -19,11 +21,11 @@ endif
|
||||||
pa_version_major_minor = pa_version_major + '.' + pa_version_minor
|
pa_version_major_minor = pa_version_major + '.' + pa_version_minor
|
||||||
|
|
||||||
pa_api_version = 12
|
pa_api_version = 12
|
||||||
pa_protocol_version = 34
|
pa_protocol_version = 35
|
||||||
|
|
||||||
# The stable ABI for client applications, for the version info x:y:z
|
# The stable ABI for client applications, for the version info x:y:z
|
||||||
# always will hold x=z
|
# always will hold x=z
|
||||||
libpulse_version_info = [21, 2, 21]
|
libpulse_version_info = [24, 0, 24]
|
||||||
|
|
||||||
# A simplified, synchronous, ABI-stable interface for client
|
# A simplified, synchronous, ABI-stable interface for client
|
||||||
# applications, for the version info x:y:z always will hold x=z
|
# applications, for the version info x:y:z always will hold x=z
|
||||||
|
|
@ -31,7 +33,7 @@ libpulse_simple_version_info = [1, 1, 1]
|
||||||
|
|
||||||
# The ABI-stable GLib adapter for client applications, for the version
|
# The ABI-stable GLib adapter for client applications, for the version
|
||||||
# info x:y:z always will hold x=z
|
# info x:y:z always will hold x=z
|
||||||
libpulse_mainloop_glib_version_info = [0, 5, 0]
|
libpulse_mainloop_glib_version_info = [0, 6, 0]
|
||||||
|
|
||||||
libpulse_version = '@0@.@1@.@2@'.format(
|
libpulse_version = '@0@.@1@.@2@'.format(
|
||||||
libpulse_version_info[0] - libpulse_version_info[2],
|
libpulse_version_info[0] - libpulse_version_info[2],
|
||||||
|
|
@ -66,7 +68,16 @@ localedir = join_paths(prefix, get_option('localedir'))
|
||||||
localstatedir = join_paths(prefix, get_option('localstatedir'))
|
localstatedir = join_paths(prefix, get_option('localstatedir'))
|
||||||
sysconfdir = join_paths(prefix, get_option('sysconfdir'))
|
sysconfdir = join_paths(prefix, get_option('sysconfdir'))
|
||||||
privlibdir = join_paths(libdir, 'pulseaudio')
|
privlibdir = join_paths(libdir, 'pulseaudio')
|
||||||
alsadatadir = join_paths(datadir, 'pulseaudio', 'alsa-mixer')
|
|
||||||
|
if host_machine.system() == 'windows'
|
||||||
|
# Windows only supports loading libraries from the same dir as the executable
|
||||||
|
privlibdir = bindir
|
||||||
|
endif
|
||||||
|
|
||||||
|
alsadatadir = get_option('alsadatadir')
|
||||||
|
if alsadatadir == ''
|
||||||
|
alsadatadir = join_paths(datadir, 'pulseaudio', 'alsa-mixer')
|
||||||
|
endif
|
||||||
|
|
||||||
pkgconfigdir = join_paths(libdir, 'pkgconfig')
|
pkgconfigdir = join_paths(libdir, 'pkgconfig')
|
||||||
pulselibexecdir = join_paths(libexecdir, 'pulse')
|
pulselibexecdir = join_paths(libexecdir, 'pulse')
|
||||||
|
|
@ -121,7 +132,6 @@ cdata = configuration_data()
|
||||||
cdata.set_quoted('PACKAGE', 'pulseaudio')
|
cdata.set_quoted('PACKAGE', 'pulseaudio')
|
||||||
cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
|
cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
|
||||||
cdata.set_quoted('PACKAGE_VERSION', pa_version_str)
|
cdata.set_quoted('PACKAGE_VERSION', pa_version_str)
|
||||||
cdata.set_quoted('CANONICAL_HOST', host_machine.cpu())
|
|
||||||
cdata.set('PA_MAJOR', pa_version_major)
|
cdata.set('PA_MAJOR', pa_version_major)
|
||||||
cdata.set('PA_MINOR', pa_version_minor)
|
cdata.set('PA_MINOR', pa_version_minor)
|
||||||
cdata.set('PA_API_VERSION', pa_api_version)
|
cdata.set('PA_API_VERSION', pa_api_version)
|
||||||
|
|
@ -132,6 +142,7 @@ cdata.set_quoted('PA_SRCDIR', join_paths(meson.current_source_dir(), 'src'))
|
||||||
cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
|
cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
|
||||||
cdata.set_quoted('PA_SOEXT', '.so')
|
cdata.set_quoted('PA_SOEXT', '.so')
|
||||||
cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', pulsesysconfdir)
|
cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', pulsesysconfdir)
|
||||||
|
cdata.set('PA_DEFAULT_CONFIG_DIR_UNQUOTED', pulsesysconfdir)
|
||||||
cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
|
cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
|
||||||
cdata.set_quoted('PA_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', 'pulse'))
|
cdata.set_quoted('PA_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', 'pulse'))
|
||||||
cdata.set_quoted('PA_SYSTEM_CONFIG_PATH', join_paths(localstatedir, 'lib', 'pulse'))
|
cdata.set_quoted('PA_SYSTEM_CONFIG_PATH', join_paths(localstatedir, 'lib', 'pulse'))
|
||||||
|
|
@ -147,11 +158,21 @@ cdata.set_quoted('DESKTOPFILEDIR', join_paths(datadir, 'applications'))
|
||||||
cdata.set_quoted('PULSE_LOCALEDIR', localedir)
|
cdata.set_quoted('PULSE_LOCALEDIR', localedir)
|
||||||
cdata.set_quoted('GETTEXT_PACKAGE', 'pulseaudio')
|
cdata.set_quoted('GETTEXT_PACKAGE', 'pulseaudio')
|
||||||
cdata.set('ENABLE_NLS', 1)
|
cdata.set('ENABLE_NLS', 1)
|
||||||
|
cdata.set('top_srcdir', meson.source_root())
|
||||||
|
|
||||||
# Platform specifics
|
# Platform specifics
|
||||||
# First some defaults to keep config file generation happy
|
# First some defaults to keep config file generation happy
|
||||||
cdata.set('HAVE_COREAUDIO', 0)
|
cdata.set('HAVE_COREAUDIO', 0)
|
||||||
cdata.set('HAVE_WAVEOUT', 0)
|
cdata.set('HAVE_WAVEOUT', 0)
|
||||||
|
cdata.set('OS_IS_FREEBSD', 0)
|
||||||
|
|
||||||
|
platform_socket_dep = []
|
||||||
|
platform_dep = []
|
||||||
|
|
||||||
|
if host_machine.endian() == 'big'
|
||||||
|
cdata.set('WORDS_BIGENDIAN', 1)
|
||||||
|
endif
|
||||||
|
|
||||||
# FIXME: This was not tested. Maybe some flags should better be CFLAGS,
|
# FIXME: This was not tested. Maybe some flags should better be CFLAGS,
|
||||||
# rather than ending up in the config.h file?
|
# rather than ending up in the config.h file?
|
||||||
if host_machine.system() == 'darwin'
|
if host_machine.system() == 'darwin'
|
||||||
|
|
@ -159,7 +180,22 @@ if host_machine.system() == 'darwin'
|
||||||
cdata.set('_DARWIN_C_SOURCE', '200112L') # Needed to get NSIG on Mac OS
|
cdata.set('_DARWIN_C_SOURCE', '200112L') # Needed to get NSIG on Mac OS
|
||||||
elif host_machine.system() == 'windows'
|
elif host_machine.system() == 'windows'
|
||||||
cdata.set('OS_IS_WIN32', 1)
|
cdata.set('OS_IS_WIN32', 1)
|
||||||
|
cdata.set('HAVE_WINDOWS_H', 1)
|
||||||
|
cdata.set('HAVE_WAVEOUT', 1)
|
||||||
|
cdata.set('HAVE_WINSOCK2_H', 1)
|
||||||
|
cdata.set('HAVE_WS2TCPIP_H', 1)
|
||||||
cdata.set('WIN32_LEAN_AND_MEAN', 1) # Needed to avoid including unnecessary headers on Windows
|
cdata.set('WIN32_LEAN_AND_MEAN', 1) # Needed to avoid including unnecessary headers on Windows
|
||||||
|
cdata.set('gid_t', 'int')
|
||||||
|
cdata.set('uid_t', 'int')
|
||||||
|
ws2_32_dep = meson.get_compiler('c').find_library('ws2_32')
|
||||||
|
winsock_dep = meson.get_compiler('c').find_library('wsock32')
|
||||||
|
ole32_dep = meson.get_compiler('c').find_library('ole32')
|
||||||
|
ssp_dep = meson.get_compiler('c').find_library('ssp')
|
||||||
|
pcreposix_dep = meson.get_compiler('c').find_library('pcreposix')
|
||||||
|
platform_socket_dep = [ws2_32_dep, winsock_dep]
|
||||||
|
platform_dep = [ole32_dep, ssp_dep, pcreposix_dep]
|
||||||
|
elif host_machine.system() == 'freebsd'
|
||||||
|
cdata.set('OS_IS_FREEBSD', 1)
|
||||||
#elif host_machine.system() == 'solaris'
|
#elif host_machine.system() == 'solaris'
|
||||||
# # Apparently meson has no solaris support?
|
# # Apparently meson has no solaris support?
|
||||||
# # Needed to get declarations for msg_control and msg_controllen on Solaris
|
# # Needed to get declarations for msg_control and msg_controllen on Solaris
|
||||||
|
|
@ -180,7 +216,6 @@ endif
|
||||||
check_headers = [
|
check_headers = [
|
||||||
'arpa/inet.h',
|
'arpa/inet.h',
|
||||||
'byteswap.h',
|
'byteswap.h',
|
||||||
'cpuid.h',
|
|
||||||
'dlfcn.h',
|
'dlfcn.h',
|
||||||
'execinfo.h',
|
'execinfo.h',
|
||||||
'grp.h',
|
'grp.h',
|
||||||
|
|
@ -215,7 +250,6 @@ check_headers = [
|
||||||
'sys/un.h',
|
'sys/un.h',
|
||||||
'sys/wait.h',
|
'sys/wait.h',
|
||||||
'syslog.h',
|
'syslog.h',
|
||||||
'valgrind/memcheck.h',
|
|
||||||
'xlocale.h',
|
'xlocale.h',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -226,15 +260,34 @@ foreach h : check_headers
|
||||||
endif
|
endif
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
|
if cc.has_header('valgrind/memcheck.h', required: get_option('valgrind'))
|
||||||
|
cdata.set('HAVE_VALGRIND_MEMCHECK_H', 1)
|
||||||
|
endif
|
||||||
|
|
||||||
# FIXME: move this to the above set
|
# FIXME: move this to the above set
|
||||||
if cc.has_header('pthread.h')
|
if host_machine.system() != 'windows'
|
||||||
cdata.set('HAVE_PTHREAD', 1)
|
if cc.has_header('pthread.h')
|
||||||
|
cdata.set('HAVE_PTHREAD', 1)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if cc.has_header_symbol('pthread.h', 'PTHREAD_PRIO_INHERIT')
|
if cc.has_header_symbol('pthread.h', 'PTHREAD_PRIO_INHERIT')
|
||||||
cdata.set('HAVE_PTHREAD_PRIO_INHERIT', 1)
|
cdata.set('HAVE_PTHREAD_PRIO_INHERIT', 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Headers which are usable
|
||||||
|
|
||||||
|
check_usable_headers = [
|
||||||
|
'cpuid.h',
|
||||||
|
]
|
||||||
|
|
||||||
|
foreach h : check_usable_headers
|
||||||
|
if cc.check_header(h)
|
||||||
|
define = 'HAVE_' + h.underscorify().to_upper()
|
||||||
|
cdata.set(define, 1)
|
||||||
|
endif
|
||||||
|
endforeach
|
||||||
|
|
||||||
# Functions
|
# Functions
|
||||||
|
|
||||||
check_functions = [
|
check_functions = [
|
||||||
|
|
@ -288,16 +341,30 @@ check_functions = [
|
||||||
foreach f : check_functions
|
foreach f : check_functions
|
||||||
if cc.has_function(f)
|
if cc.has_function(f)
|
||||||
define = 'HAVE_' + f.underscorify().to_upper()
|
define = 'HAVE_' + f.underscorify().to_upper()
|
||||||
cdata.set(define, 1)
|
|
||||||
|
if f == 'posix_memalign' and host_machine.system() == 'windows'
|
||||||
|
message('Win32/mingw32 does not properly define posix_memalign.')
|
||||||
|
elif f == 'fork' and host_machine.system() == 'windows'
|
||||||
|
# __builtin_fork is defined and compiles properly, but calling __builtin_fork() does not.
|
||||||
|
# This causes Meson to think that Windows has a fork() which causes a link error...
|
||||||
|
message('Win32/mingw32 does not properly define fork.')
|
||||||
|
else
|
||||||
|
cdata.set(define, 1)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
if cc.has_header_symbol('sys/syscall.h', 'SYS_memfd_create')
|
if cc.has_header_symbol('sys/syscall.h', 'SYS_memfd_create') \
|
||||||
|
or cc.has_function('memfd_create')
|
||||||
cdata.set('HAVE_MEMFD', 1)
|
cdata.set('HAVE_MEMFD', 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if cc.has_function('dgettext')
|
if cc.has_function('dgettext')
|
||||||
libintl_dep = []
|
if host_machine.system() != 'windows'
|
||||||
|
libintl_dep = []
|
||||||
|
else
|
||||||
|
libintl_dep = cc.find_library('intl')
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
libintl_dep = cc.find_library('intl')
|
libintl_dep = cc.find_library('intl')
|
||||||
endif
|
endif
|
||||||
|
|
@ -348,7 +415,12 @@ cdata.set('MESON_BUILD', 1)
|
||||||
# On ELF systems we don't want the libraries to be unloaded since we don't clean them up properly,
|
# On ELF systems we don't want the libraries to be unloaded since we don't clean them up properly,
|
||||||
# so we request the nodelete flag to be enabled.
|
# so we request the nodelete flag to be enabled.
|
||||||
# On other systems, we don't really know how to do that, but it's welcome if somebody can tell.
|
# On other systems, we don't really know how to do that, but it's welcome if somebody can tell.
|
||||||
nodelete_link_args = ['-Wl,-z,nodelete']
|
# Windows doesn't support this flag.
|
||||||
|
if host_machine.system() != 'windows'
|
||||||
|
nodelete_link_args = ['-Wl,-z,nodelete']
|
||||||
|
else
|
||||||
|
nodelete_link_args = []
|
||||||
|
endif
|
||||||
|
|
||||||
# Code coverage
|
# Code coverage
|
||||||
|
|
||||||
|
|
@ -376,12 +448,12 @@ endforeach
|
||||||
cap_dep = cc.find_library('cap', required : false)
|
cap_dep = cc.find_library('cap', required : false)
|
||||||
|
|
||||||
shm_dep = cc.find_library('rt', required : false)
|
shm_dep = cc.find_library('rt', required : false)
|
||||||
if shm_dep.found()
|
if cc.has_function('shm_open', dependencies : shm_dep)
|
||||||
cdata.set('HAVE_SHM_OPEN', 1)
|
cdata.set('HAVE_SHM_OPEN', 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
dl_dep = cc.find_library('dl', required : false)
|
dl_dep = cc.find_library('dl', required : false)
|
||||||
if dl_dep.found()
|
if cc.has_function('dladdr', dependencies : dl_dep)
|
||||||
cdata.set('HAVE_DLADDR', 1)
|
cdata.set('HAVE_DLADDR', 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
@ -389,6 +461,8 @@ have_iconv = false
|
||||||
if cc.has_function('iconv_open')
|
if cc.has_function('iconv_open')
|
||||||
iconv_dep = dependency('', required : false)
|
iconv_dep = dependency('', required : false)
|
||||||
have_iconv = true
|
have_iconv = true
|
||||||
|
# tell the libiconv header to pretend to be libc iconv
|
||||||
|
cdata.set('LIBICONV_PLUG', 1)
|
||||||
else
|
else
|
||||||
iconv_dep = cc.find_library('iconv', required : false)
|
iconv_dep = cc.find_library('iconv', required : false)
|
||||||
have_iconv = iconv_dep.found()
|
have_iconv = iconv_dep.found()
|
||||||
|
|
@ -405,6 +479,9 @@ size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, si
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Used for backtraces on BSD
|
||||||
|
execinfo_dep = cc.find_library('execinfo', required : false)
|
||||||
|
|
||||||
# Atomic operations
|
# Atomic operations
|
||||||
|
|
||||||
if get_option('atomic-arm-memory-barrier')
|
if get_option('atomic-arm-memory-barrier')
|
||||||
|
|
@ -500,8 +577,11 @@ if host_machine.cpu_family() == 'arm'
|
||||||
endif
|
endif
|
||||||
# NEON checks are automatically done by the unstable-simd module
|
# NEON checks are automatically done by the unstable-simd module
|
||||||
|
|
||||||
# FIXME: make sure it's >= 2.2
|
if get_option('daemon')
|
||||||
ltdl_dep = cc.find_library('ltdl', required : true)
|
# FIXME: make sure it's >= 2.2
|
||||||
|
ltdl_dep = cc.find_library('ltdl', required : true)
|
||||||
|
endif
|
||||||
|
|
||||||
# FIXME: can meson support libtool -dlopen/-dlpreopen things?
|
# FIXME: can meson support libtool -dlopen/-dlpreopen things?
|
||||||
# and do we still want to support this at all?
|
# and do we still want to support this at all?
|
||||||
cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
|
cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
|
||||||
|
|
@ -546,12 +626,15 @@ if dbus_dep.found()
|
||||||
cdata.set('HAVE_DBUS', 1)
|
cdata.set('HAVE_DBUS', 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
|
gio_dep = dependency('gio-2.0', version : '>= 2.26.0')
|
||||||
if gio_dep.found()
|
if get_option('gsettings').enabled()
|
||||||
|
assert(gio_dep.found(), 'GSettings support needs glib I/O library (GIO)')
|
||||||
cdata.set('HAVE_GSETTINGS', 1)
|
cdata.set('HAVE_GSETTINGS', 1)
|
||||||
|
else
|
||||||
|
cdata.set('HAVE_GSETTINGS', 0)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
|
glib_dep = dependency('glib-2.0', version : '>= 2.28.0', required: get_option('glib'))
|
||||||
if glib_dep.found()
|
if glib_dep.found()
|
||||||
cdata.set('HAVE_GLIB', 1)
|
cdata.set('HAVE_GLIB', 1)
|
||||||
endif
|
endif
|
||||||
|
|
@ -597,18 +680,30 @@ if systemd_dep.found() and systemduserunitdir == ''
|
||||||
systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
|
systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
libelogind_dep = dependency('libelogind', required : get_option('elogind'))
|
||||||
|
if libelogind_dep.found()
|
||||||
|
cdata.set('HAVE_SYSTEMD_LOGIN', 1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
tcpwrap_dep = cc.find_library('wrap', required: get_option('tcpwrap'))
|
||||||
|
if cc.has_header('tcpd.h') and cc.has_function('hosts_access', dependencies : tcpwrap_dep)
|
||||||
|
cdata.set('HAVE_LIBWRAP', 1)
|
||||||
|
endif
|
||||||
|
|
||||||
x11_dep = dependency('x11-xcb', required : get_option('x11'))
|
x11_dep = dependency('x11-xcb', required : get_option('x11'))
|
||||||
if x11_dep.found()
|
if x11_dep.found()
|
||||||
xcb_dep = dependency('xcb', required : true, version : '>= 1.6')
|
xcb_dep = dependency('xcb', required : true, version : '>= 1.6')
|
||||||
ice_dep = dependency('ice', required : true)
|
ice_dep = dependency('ice', required : get_option('daemon'))
|
||||||
sm_dep = dependency('sm', required : true)
|
sm_dep = dependency('sm', required : get_option('daemon'))
|
||||||
xtst_dep = dependency('xtst', required : true)
|
xtst_dep = dependency('xtst', required : get_option('daemon'))
|
||||||
cdata.set('HAVE_X11', 1)
|
cdata.set('HAVE_X11', 1)
|
||||||
|
if cc.has_function('XSetIOErrorExitHandler', dependencies: x11_dep)
|
||||||
|
cdata.set('HAVE_XSETIOERROREXITHANDLER', 1)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Module dependencies
|
# Module dependencies
|
||||||
|
if cc.has_header('sys/soundcard.h', required: get_option('oss-output'))
|
||||||
if cc.has_header('sys/soundcard.h')
|
|
||||||
cdata.set('HAVE_OSS_OUTPUT', 1)
|
cdata.set('HAVE_OSS_OUTPUT', 1)
|
||||||
cdata.set('HAVE_OSS_WRAPPER', 1)
|
cdata.set('HAVE_OSS_WRAPPER', 1)
|
||||||
cdata.set('PULSEDSP_LOCATION', pulsedsp_location)
|
cdata.set('PULSEDSP_LOCATION', pulsedsp_location)
|
||||||
|
|
@ -621,10 +716,15 @@ endif
|
||||||
avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'), disabler : true)
|
avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'), disabler : true)
|
||||||
if avahi_dep.found()
|
if avahi_dep.found()
|
||||||
cdata.set('HAVE_AVAHI', 1)
|
cdata.set('HAVE_AVAHI', 1)
|
||||||
|
else
|
||||||
|
cdata.set('HAVE_AVAHI', 0)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
|
sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
|
||||||
if get_option('bluez5')
|
|
||||||
|
bluez_dep = dependency('bluez', required : get_option('bluez5'))
|
||||||
|
|
||||||
|
if bluez_dep.found()
|
||||||
assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
|
assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
|
||||||
assert(sbc_dep.found(), 'BlueZ requires SBC support')
|
assert(sbc_dep.found(), 'BlueZ requires SBC support')
|
||||||
cdata.set('HAVE_SBC', 1)
|
cdata.set('HAVE_SBC', 1)
|
||||||
|
|
@ -673,15 +773,25 @@ if webrtc_dep.found()
|
||||||
cdata.set('HAVE_WEBRTC', 1)
|
cdata.set('HAVE_WEBRTC', 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
gst_dep = dependency('gstreamer-1.0', required : get_option('gstreamer'))
|
gst_dep = dependency('gstreamer-1.0', version : '>= 1.14', required : get_option('gstreamer'))
|
||||||
gstapp_dep = dependency('gstreamer-app-1.0', required : get_option('gstreamer'))
|
gstapp_dep = dependency('gstreamer-app-1.0', required : get_option('gstreamer'))
|
||||||
gstrtp_dep = dependency('gstreamer-rtp-1.0', required : get_option('gstreamer'))
|
gstrtp_dep = dependency('gstreamer-rtp-1.0', required : get_option('gstreamer'))
|
||||||
|
|
||||||
have_gstreamer = false
|
have_gstreamer = false
|
||||||
if gst_dep.found() and gstapp_dep.found() and gstrtp_dep.found()
|
if gst_dep.found() and gstapp_dep.found() and gstrtp_dep.found()
|
||||||
|
assert(gio_dep.found(), 'GStreamer-based RTP needs glib I/O library (GIO)')
|
||||||
have_gstreamer = true
|
have_gstreamer = true
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
bluez5_gst_dep = dependency('gstreamer-1.0', version : '>= 1.14', required : get_option('bluez5-gstreamer'))
|
||||||
|
bluez5_gstapp_dep = dependency('gstreamer-app-1.0', required : get_option('bluez5-gstreamer'))
|
||||||
|
have_bluez5_gstreamer = false
|
||||||
|
if bluez5_gst_dep.found() and bluez5_gstapp_dep.found()
|
||||||
|
have_bluez5_gstreamer = true
|
||||||
|
cdata.set('HAVE_GSTLDAC', 1)
|
||||||
|
cdata.set('HAVE_GSTAPTX', 1)
|
||||||
|
endif
|
||||||
|
|
||||||
# These are required for the CMake file generation
|
# These are required for the CMake file generation
|
||||||
cdata.set('PA_LIBDIR', libdir)
|
cdata.set('PA_LIBDIR', libdir)
|
||||||
cdata.set('PA_INCDIR', includedir)
|
cdata.set('PA_INCDIR', includedir)
|
||||||
|
|
@ -695,6 +805,9 @@ check_dep = dependency('check', version : '>= 0.9.10', required : get_option('te
|
||||||
|
|
||||||
# Subdirs
|
# Subdirs
|
||||||
|
|
||||||
|
if get_option('doxygen')
|
||||||
|
subdir('doxygen')
|
||||||
|
endif
|
||||||
subdir('po')
|
subdir('po')
|
||||||
if get_option('man')
|
if get_option('man')
|
||||||
subdir('man')
|
subdir('man')
|
||||||
|
|
@ -788,6 +901,7 @@ summary = [
|
||||||
'sysconfdir: @0@'.format(sysconfdir),
|
'sysconfdir: @0@'.format(sysconfdir),
|
||||||
'localstatedir: @0@'.format(localstatedir),
|
'localstatedir: @0@'.format(localstatedir),
|
||||||
'modlibexecdir: @0@'.format(modlibexecdir),
|
'modlibexecdir: @0@'.format(modlibexecdir),
|
||||||
|
'alsadatadir: @0@'.format(alsadatadir),
|
||||||
'System Runtime Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
|
'System Runtime Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
|
||||||
'System State Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
|
'System State Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
|
||||||
'System Config Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
|
'System Config Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
|
||||||
|
|
@ -797,18 +911,20 @@ summary = [
|
||||||
# 'CFLAGS: @0@'.format(${CFLAGS}),
|
# 'CFLAGS: @0@'.format(${CFLAGS}),
|
||||||
# 'CPPFLAGS: @0@'.format(${CPPFLAGS}),
|
# 'CPPFLAGS: @0@'.format(${CPPFLAGS}),
|
||||||
# 'LIBS: @0@'.format(${LIBS}),
|
# 'LIBS: @0@'.format(${LIBS}),
|
||||||
|
'',
|
||||||
|
'Enable pulseaudio daemon: @0@'.format(get_option('daemon')),
|
||||||
'',
|
'',
|
||||||
'Enable memfd shared memory: @0@'.format(cdata.has('HAVE_MEMFD')),
|
'Enable memfd shared memory: @0@'.format(cdata.has('HAVE_MEMFD')),
|
||||||
'Enable X11: @0@'.format(x11_dep.found()),
|
'Enable X11: @0@'.format(x11_dep.found()),
|
||||||
# 'Enable OSS Output: @0@'.format(${ENABLE_OSS_OUTPUT}),
|
' Safe X11 I/O errors: @0@'.format(cdata.has('HAVE_XSETIOERROREXITHANDLER')),
|
||||||
# 'Enable OSS Wrapper: @0@'.format(${ENABLE_OSS_WRAPPER}),
|
'Enable OSS Output: @0@'.format(cdata.has('HAVE_OSS_OUTPUT')),
|
||||||
|
'Enable OSS Wrapper: @0@'.format(cdata.has('HAVE_OSS_WRAPPER')),
|
||||||
# 'Enable EsounD: @0@'.format(${ENABLE_ESOUND}),
|
# 'Enable EsounD: @0@'.format(${ENABLE_ESOUND}),
|
||||||
'Enable Alsa: @0@'.format(alsa_dep.found()),
|
'Enable Alsa: @0@'.format(alsa_dep.found()),
|
||||||
# 'Enable CoreAudio: @0@'.format(${ENABLE_COREAUDIO}),
|
# 'Enable CoreAudio: @0@'.format(${ENABLE_COREAUDIO}),
|
||||||
# 'Enable Solaris: @0@'.format(${ENABLE_SOLARIS}),
|
# 'Enable Solaris: @0@'.format(${ENABLE_SOLARIS}),
|
||||||
# 'Enable WaveOut: @0@'.format(${ENABLE_WAVEOUT}),
|
# 'Enable WaveOut: @0@'.format(${ENABLE_WAVEOUT}),
|
||||||
'Enable GLib 2: @0@'.format(glib_dep.found()),
|
'Enable GLib 2: @0@'.format(glib_dep.found()),
|
||||||
# 'Enable GConf: @0@'.format(${ENABLE_GCONF}),
|
|
||||||
'Enable GSettings: @0@'.format(gio_dep.found()),
|
'Enable GSettings: @0@'.format(gio_dep.found()),
|
||||||
'Enable Gtk+ 3: @0@'.format(gtk_dep.found()),
|
'Enable Gtk+ 3: @0@'.format(gtk_dep.found()),
|
||||||
'Enable Avahi: @0@'.format(avahi_dep.found()),
|
'Enable Avahi: @0@'.format(avahi_dep.found()),
|
||||||
|
|
@ -816,13 +932,15 @@ summary = [
|
||||||
'Enable Async DNS: @0@'.format(asyncns_dep.found()),
|
'Enable Async DNS: @0@'.format(asyncns_dep.found()),
|
||||||
'Enable LIRC: @0@'.format(lirc_dep.found()),
|
'Enable LIRC: @0@'.format(lirc_dep.found()),
|
||||||
'Enable D-Bus: @0@'.format(dbus_dep.found()),
|
'Enable D-Bus: @0@'.format(dbus_dep.found()),
|
||||||
' Enable BlueZ 5: @0@'.format(get_option('bluez5')),
|
' Enable BlueZ 5: @0@'.format(cdata.has('HAVE_BLUEZ_5')),
|
||||||
' Enable native headsets: @0@'.format(get_option('bluez5-native-headset')),
|
' Enable native headsets: @0@'.format(cdata.has('HAVE_BLUEZ_5_NATIVE_HEADSET')),
|
||||||
' Enable ofono headsets: @0@'.format(get_option('bluez5-ofono-headset')),
|
' Enable ofono headsets: @0@'.format(cdata.has('HAVE_BLUEZ_5_OFONO_HEADSET')),
|
||||||
|
' Enable GStreamer based codecs: @0@'.format(have_bluez5_gstreamer),
|
||||||
'Enable udev: @0@'.format(udev_dep.found()),
|
'Enable udev: @0@'.format(udev_dep.found()),
|
||||||
' Enable HAL->udev compat: @0@'.format(get_option('hal-compat')),
|
' Enable HAL->udev compat: @0@'.format(get_option('hal-compat')),
|
||||||
'Enable systemd: @0@'.format(libsystemd_dep.found()),
|
'Enable systemd: @0@'.format(libsystemd_dep.found()),
|
||||||
# 'Enable TCP Wrappers: @0@'.format(${ENABLE_TCPWRAP}),
|
'Enable elogind: @0@'.format(libelogind_dep.found()),
|
||||||
|
'Enable TCP Wrappers: @0@'.format(tcpwrap_dep.found()),
|
||||||
'Enable libsamplerate: @0@'.format(samplerate_dep.found()),
|
'Enable libsamplerate: @0@'.format(samplerate_dep.found()),
|
||||||
'Enable IPv6: @0@'.format(get_option('ipv6')),
|
'Enable IPv6: @0@'.format(get_option('ipv6')),
|
||||||
'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
|
'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
|
||||||
|
|
@ -834,6 +952,7 @@ summary = [
|
||||||
'Enable SoXR (resampler): @0@'.format(soxr_dep.found()),
|
'Enable SoXR (resampler): @0@'.format(soxr_dep.found()),
|
||||||
'Enable WebRTC echo canceller: @0@'.format(webrtc_dep.found()),
|
'Enable WebRTC echo canceller: @0@'.format(webrtc_dep.found()),
|
||||||
'Enable Gcov coverage: @0@'.format(get_option('gcov')),
|
'Enable Gcov coverage: @0@'.format(get_option('gcov')),
|
||||||
|
'Enable Valgrind: @0@'.format(cdata.has('HAVE_VALGRIND_MEMCHECK_H')),
|
||||||
'Enable man pages: @0@'.format(get_option('man')),
|
'Enable man pages: @0@'.format(get_option('man')),
|
||||||
'Enable unit tests: @0@'.format(get_option('tests')),
|
'Enable unit tests: @0@'.format(get_option('tests')),
|
||||||
'',
|
'',
|
||||||
|
|
@ -874,7 +993,7 @@ if host_machine.system() != 'windows'
|
||||||
]
|
]
|
||||||
warning('\n' + '\n'.join(message))
|
warning('\n' + '\n'.join(message))
|
||||||
endif
|
endif
|
||||||
if not udev_dep.found()
|
if host_machine.system() == 'linux' and not udev_dep.found()
|
||||||
message = [
|
message = [
|
||||||
'You do not have udev support enabled. It is strongly recommended',
|
'You do not have udev support enabled. It is strongly recommended',
|
||||||
'that you enable udev support if your platform supports it as it is',
|
'that you enable udev support if your platform supports it as it is',
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
|
option('daemon',
|
||||||
|
type : 'boolean', value : true,
|
||||||
|
description : 'Enable building and installation of pulseaudio daemon and supporting configuration files')
|
||||||
|
option('doxygen',
|
||||||
|
type : 'boolean', value : true,
|
||||||
|
description : 'Enable building and installation of documentation generated with doxygen')
|
||||||
option('gcov',
|
option('gcov',
|
||||||
type : 'boolean', value : false,
|
type : 'boolean', value : false,
|
||||||
description : 'Enable optional gcov coverage analysis')
|
description : 'Enable optional gcov coverage analysis')
|
||||||
|
|
@ -51,6 +57,9 @@ option('pulsedsp-location',
|
||||||
option('modlibexecdir',
|
option('modlibexecdir',
|
||||||
type : 'string',
|
type : 'string',
|
||||||
description : 'Specify location where modules will be installed')
|
description : 'Specify location where modules will be installed')
|
||||||
|
option('alsadatadir',
|
||||||
|
type : 'string',
|
||||||
|
description : 'Directory for ALSA card profiles (defaults to ${datadir}/pulseaudio/alsa-mixer)')
|
||||||
option('systemduserunitdir',
|
option('systemduserunitdir',
|
||||||
type : 'string',
|
type : 'string',
|
||||||
description : 'Directory for systemd user service files')
|
description : 'Directory for systemd user service files')
|
||||||
|
|
@ -76,8 +85,11 @@ option('avahi',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'auto',
|
||||||
description : 'Optional Avahi support')
|
description : 'Optional Avahi support')
|
||||||
option('bluez5',
|
option('bluez5',
|
||||||
type : 'boolean', value : 'true',
|
type : 'feature', value : 'auto',
|
||||||
description : 'Optional BlueZ 5 support')
|
description : 'Optional BlueZ 5 support')
|
||||||
|
option('bluez5-gstreamer',
|
||||||
|
type : 'feature', value: 'auto',
|
||||||
|
description : 'Optional BlueZ 5 GStreamer support')
|
||||||
option('bluez5-native-headset',
|
option('bluez5-native-headset',
|
||||||
type : 'boolean',
|
type : 'boolean',
|
||||||
description : 'Optional native headset backend support (BlueZ 5)')
|
description : 'Optional native headset backend support (BlueZ 5)')
|
||||||
|
|
@ -87,6 +99,9 @@ option('bluez5-ofono-headset',
|
||||||
option('dbus',
|
option('dbus',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'auto',
|
||||||
description : 'Optional D-Bus support')
|
description : 'Optional D-Bus support')
|
||||||
|
option('elogind',
|
||||||
|
type : 'feature', value : 'auto',
|
||||||
|
description : 'Optional elogind support')
|
||||||
option('fftw',
|
option('fftw',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'auto',
|
||||||
description : 'Optional FFTW support')
|
description : 'Optional FFTW support')
|
||||||
|
|
@ -97,7 +112,7 @@ option('gsettings',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'auto',
|
||||||
description : 'Optional GSettings support')
|
description : 'Optional GSettings support')
|
||||||
option('gstreamer',
|
option('gstreamer',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'disabled',
|
||||||
description : 'Optional GStreamer dependency for media-related functionality')
|
description : 'Optional GStreamer dependency for media-related functionality')
|
||||||
option('gtk',
|
option('gtk',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'auto',
|
||||||
|
|
@ -120,6 +135,9 @@ option('openssl',
|
||||||
option('orc',
|
option('orc',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'auto',
|
||||||
description : 'Optimized Inner Loop Runtime Compiler')
|
description : 'Optimized Inner Loop Runtime Compiler')
|
||||||
|
option('oss-output',
|
||||||
|
type : 'feature', value : 'auto',
|
||||||
|
description : 'Optional OSS output support')
|
||||||
option('samplerate',
|
option('samplerate',
|
||||||
type : 'feature', value : 'disabled',
|
type : 'feature', value : 'disabled',
|
||||||
description : 'Optional libsamplerate support (DEPRECATED)')
|
description : 'Optional libsamplerate support (DEPRECATED)')
|
||||||
|
|
@ -132,9 +150,15 @@ option('speex',
|
||||||
option('systemd',
|
option('systemd',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'auto',
|
||||||
description : 'Optional systemd support')
|
description : 'Optional systemd support')
|
||||||
|
option('tcpwrap',
|
||||||
|
type : 'feature', value : 'auto',
|
||||||
|
description : 'Optional TCP wrappers support')
|
||||||
option('udev',
|
option('udev',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'auto',
|
||||||
description : 'Optional udev support')
|
description : 'Optional udev support')
|
||||||
|
option('valgrind',
|
||||||
|
type : 'feature', value : 'auto',
|
||||||
|
description : 'Optional Valgrind support')
|
||||||
option('x11',
|
option('x11',
|
||||||
type : 'feature', value : 'auto',
|
type : 'feature', value : 'auto',
|
||||||
description : 'Optional X11 support')
|
description : 'Optional X11 support')
|
||||||
|
|
|
||||||
|
|
@ -46,3 +46,5 @@ tr
|
||||||
uk
|
uk
|
||||||
zh_CN
|
zh_CN
|
||||||
zh_TW
|
zh_TW
|
||||||
|
eo
|
||||||
|
si
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ src/daemon/ltdl-bind-now.c
|
||||||
src/daemon/main.c
|
src/daemon/main.c
|
||||||
src/daemon/pulseaudio.desktop.in
|
src/daemon/pulseaudio.desktop.in
|
||||||
src/daemon/systemd/user/pulseaudio.service.in
|
src/daemon/systemd/user/pulseaudio.service.in
|
||||||
|
src/daemon/systemd/user/pulseaudio-x11.service.in
|
||||||
src/modules/alsa/alsa-mixer.c
|
src/modules/alsa/alsa-mixer.c
|
||||||
src/modules/alsa/alsa-sink.c
|
src/modules/alsa/alsa-sink.c
|
||||||
src/modules/alsa/alsa-source.c
|
src/modules/alsa/alsa-source.c
|
||||||
|
|
@ -16,8 +17,6 @@ src/modules/alsa/module-alsa-sink.c
|
||||||
src/modules/alsa/module-alsa-source.c
|
src/modules/alsa/module-alsa-source.c
|
||||||
src/modules/bluetooth/module-bluez5-device.c
|
src/modules/bluetooth/module-bluez5-device.c
|
||||||
src/modules/echo-cancel/module-echo-cancel.c
|
src/modules/echo-cancel/module-echo-cancel.c
|
||||||
src/modules/gconf/gconf-helper.c
|
|
||||||
src/modules/gconf/module-gconf.c
|
|
||||||
src/modules/jack/module-jack-sink.c
|
src/modules/jack/module-jack-sink.c
|
||||||
src/modules/jack/module-jack-source.c
|
src/modules/jack/module-jack-source.c
|
||||||
src/modules/macosx/module-coreaudio-device.c
|
src/modules/macosx/module-coreaudio-device.c
|
||||||
|
|
@ -96,7 +95,6 @@ src/pulsecore/core-subscribe.c
|
||||||
src/pulsecore/core-util.c
|
src/pulsecore/core-util.c
|
||||||
src/pulsecore/core-util.h
|
src/pulsecore/core-util.h
|
||||||
src/pulsecore/dbus-util.c
|
src/pulsecore/dbus-util.c
|
||||||
src/pulsecore/dllmain.c
|
|
||||||
src/pulsecore/dynarray.c
|
src/pulsecore/dynarray.c
|
||||||
src/pulsecore/fdsem.c
|
src/pulsecore/fdsem.c
|
||||||
src/pulsecore/ffmpeg/resample2.c
|
src/pulsecore/ffmpeg/resample2.c
|
||||||
|
|
|
||||||
3800
po/bn_IN.po
3800
po/bn_IN.po
File diff suppressed because it is too large
Load diff
3750
po/de_CH.po
3750
po/de_CH.po
File diff suppressed because it is too large
Load diff
1707
po/pt_BR.po
1707
po/pt_BR.po
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
3838
po/sr@latin.po
3838
po/sr@latin.po
File diff suppressed because it is too large
Load diff
1660
po/zh_CN.po
1660
po/zh_CN.po
File diff suppressed because it is too large
Load diff
1024
po/zh_TW.po
1024
po/zh_TW.po
File diff suppressed because it is too large
Load diff
23
scripts/generate-map-file.sh
Executable file
23
scripts/generate-map-file.sh
Executable file
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Generator for linker version script.
|
||||||
|
# We use the same linker version script for all public .so files
|
||||||
|
#
|
||||||
|
# generate-map-file.sh where-is/map-file public_interface_1.h public_interface_2.h ... public_interface_N.h
|
||||||
|
#
|
||||||
|
|
||||||
|
CTAGS_IDENTIFIER_LIST="PA_GCC_MALLOC,PA_GCC_ALLOC_SIZE2,PA_GCC_ALLOC_SIZE,PA_GCC_PURE,PA_GCC_CONST,PA_GCC_DEPRECATED,PA_GCC_PRINTF_ATTR"
|
||||||
|
|
||||||
|
print_map_file() {
|
||||||
|
echo "PULSE_0 {"
|
||||||
|
echo "global:"
|
||||||
|
ctags -I ${CTAGS_IDENTIFIER_LIST} -f - --c-kinds=p "$@" | awk '/^pa_/ { print $1 ";" }' | sort
|
||||||
|
echo "local:"
|
||||||
|
echo "*;"
|
||||||
|
echo "};"
|
||||||
|
}
|
||||||
|
|
||||||
|
TARGET_FILE=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
cd "${MESON_SOURCE_ROOT}/${MESON_SUBDIR}" && print_map_file "$@" > ${TARGET_FILE}
|
||||||
8
scripts/save-tarball-version.sh
Executable file
8
scripts/save-tarball-version.sh
Executable file
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "x${1}" == "x" ]; then
|
||||||
|
echo "Package version must be specified to generate tarball version"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${1}" > "$MESON_DIST_ROOT/.tarball-version"
|
||||||
|
|
@ -1,13 +1,20 @@
|
||||||
if bashcompletiondir != 'no'
|
if bashcompletiondir != 'no'
|
||||||
aliases = [
|
aliases = []
|
||||||
|
|
||||||
|
if get_option('daemon')
|
||||||
|
aliases += [
|
||||||
|
'pacmd',
|
||||||
|
'pasuspender',
|
||||||
|
]
|
||||||
|
endif
|
||||||
|
|
||||||
|
aliases += [
|
||||||
'pacat',
|
'pacat',
|
||||||
'pacmd',
|
|
||||||
'pactl',
|
'pactl',
|
||||||
'padsp',
|
'padsp',
|
||||||
'paplay',
|
'paplay',
|
||||||
'parec',
|
'parec',
|
||||||
'parecord',
|
'parecord',
|
||||||
'pasuspender',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
install_data('pulseaudio', install_dir : bashcompletiondir)
|
install_data('pulseaudio', install_dir : bashcompletiondir)
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ _pactl() {
|
||||||
local comps
|
local comps
|
||||||
local flags='-h --help --version -s --server= --client-name='
|
local flags='-h --help --version -s --server= --client-name='
|
||||||
local list_types='short sinks sources sink-inputs source-outputs cards
|
local list_types='short sinks sources sink-inputs source-outputs cards
|
||||||
modules samples clients'
|
modules samples clients message-handlers'
|
||||||
local commands=(stat info list exit upload-sample play-sample remove-sample
|
local commands=(stat info list exit upload-sample play-sample remove-sample
|
||||||
load-module unload-module move-sink-input move-source-output
|
load-module unload-module move-sink-input move-source-output
|
||||||
suspend-sink suspend-source set-card-profile set-default-sink
|
suspend-sink suspend-source set-card-profile set-default-sink
|
||||||
|
|
@ -121,7 +121,7 @@ _pactl() {
|
||||||
set-source-volume set-sink-input-volume set-source-output-volume
|
set-source-volume set-sink-input-volume set-source-output-volume
|
||||||
set-sink-mute set-source-mute set-sink-input-mute
|
set-sink-mute set-source-mute set-sink-input-mute
|
||||||
set-source-output-mute set-sink-formats set-port-latency-offset
|
set-source-output-mute set-sink-formats set-port-latency-offset
|
||||||
subscribe help)
|
subscribe send-message help)
|
||||||
|
|
||||||
_init_completion -n = || return
|
_init_completion -n = || return
|
||||||
preprev=${words[$cword-2]}
|
preprev=${words[$cword-2]}
|
||||||
|
|
@ -271,7 +271,7 @@ _pacmd() {
|
||||||
move-sink-input move-source-output suspend-sink suspend-source
|
move-sink-input move-source-output suspend-sink suspend-source
|
||||||
suspend set-card-profile set-sink-port set-source-port
|
suspend set-card-profile set-sink-port set-source-port
|
||||||
set-port-latency-offset set-log-target set-log-level set-log-meta
|
set-port-latency-offset set-log-target set-log-level set-log-meta
|
||||||
set-log-time set-log-backtrace)
|
set-log-time set-log-backtrace send-message)
|
||||||
_init_completion -n = || return
|
_init_completion -n = || return
|
||||||
preprev=${words[$cword-2]}
|
preprev=${words[$cword-2]}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ _devices() {
|
||||||
case $words[$((CURRENT - 2))] in
|
case $words[$((CURRENT - 2))] in
|
||||||
move-sink-input) cmd=('sinks');;
|
move-sink-input) cmd=('sinks');;
|
||||||
move-source-output) cmd=('sources');;
|
move-source-output) cmd=('sources');;
|
||||||
|
play-sample) cmd=('sinks');;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
elif [[ $service == (pacat|paplay|parec|parecord) ]]; then
|
elif [[ $service == (pacat|paplay|parec|parecord) ]]; then
|
||||||
|
|
@ -147,7 +148,7 @@ _ports() {
|
||||||
if [[ $line != [[:blank:]] &&
|
if [[ $line != [[:blank:]] &&
|
||||||
$line != (*Part?of*|*Properties:*|*device.icon_name*) ]]; then
|
$line != (*Part?of*|*Properties:*|*device.icon_name*) ]]; then
|
||||||
_port_name=${line%%: *}
|
_port_name=${line%%: *}
|
||||||
_port_name=${_port_name//[[:blank:]]/}
|
_port_name=${_port_name##[[:blank:]]#}
|
||||||
_port_description=${line#*: }
|
_port_description=${line#*: }
|
||||||
_port_list+=($_port_name:$_port_description)
|
_port_list+=($_port_name:$_port_description)
|
||||||
fi
|
fi
|
||||||
|
|
@ -158,6 +159,13 @@ _ports() {
|
||||||
_describe 'port list' _port_list
|
_describe 'port list' _port_list
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_sample_names() {
|
||||||
|
local -a _sample_names
|
||||||
|
sample_names=(${${${(f)"$(_call_program samples_tag "pactl $remote list samples short 2> /dev/null")"}##[[:digit:]]#[[:blank:]]#}%%[[:blank:]]*})
|
||||||
|
|
||||||
|
_wanted pactl-samples expl 'sample list' compadd $sample_names
|
||||||
|
}
|
||||||
|
|
||||||
_cards(){
|
_cards(){
|
||||||
local -a _card_list
|
local -a _card_list
|
||||||
local _card _cad_name
|
local _card _cad_name
|
||||||
|
|
@ -263,6 +271,7 @@ _pactl_completion() {
|
||||||
'set-sink-input-mute: mute a stream'
|
'set-sink-input-mute: mute a stream'
|
||||||
'set-source-output-mute: mute a recording stream'
|
'set-source-output-mute: mute a recording stream'
|
||||||
'set-sink-formats: set supported formats of a sink'
|
'set-sink-formats: set supported formats of a sink'
|
||||||
|
'send-message: send a message to a pulseaudio object'
|
||||||
'subscribe: subscribe to events'
|
'subscribe: subscribe to events'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -284,6 +293,7 @@ _pactl_completion() {
|
||||||
'clients: list connected clients'
|
'clients: list connected clients'
|
||||||
'samples: list samples'
|
'samples: list samples'
|
||||||
'cards: list available cards'
|
'cards: list available cards'
|
||||||
|
'message-handlers: list available message-handlers'
|
||||||
)
|
)
|
||||||
|
|
||||||
if ((CURRENT == 2)); then
|
if ((CURRENT == 2)); then
|
||||||
|
|
@ -304,10 +314,10 @@ _pactl_completion() {
|
||||||
_play_sample_parameter() {
|
_play_sample_parameter() {
|
||||||
if ((CURRENT == 2)); then
|
if ((CURRENT == 2)); then
|
||||||
# We're completing the first parameter after "play-sample".
|
# We're completing the first parameter after "play-sample".
|
||||||
# TODO: Implement sample name completion.
|
_sample_names
|
||||||
elif ((CURRENT == 3)); then
|
elif ((CURRENT == 3)); then
|
||||||
# We're completing the second parameter after "play-sample".
|
# We're completing the second parameter after "play-sample".
|
||||||
# TODO: Implement sink name completion.
|
_devices
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -470,7 +480,7 @@ _pactl_completion() {
|
||||||
list) _list_parameter;;
|
list) _list_parameter;;
|
||||||
upload-sample) if ((CURRENT == 2)); then _files; fi;;
|
upload-sample) if ((CURRENT == 2)); then _files; fi;;
|
||||||
play-sample) _play_sample_parameter;;
|
play-sample) _play_sample_parameter;;
|
||||||
remove-sample) ;; # TODO: Implement sample name completion.
|
remove-sample) if ((CURRENT == 2)); then _sample_names; fi;;
|
||||||
load-module) _load_module_parameter;;
|
load-module) _load_module_parameter;;
|
||||||
unload-module) if ((CURRENT == 2)); then _loaded_modules; fi;;
|
unload-module) if ((CURRENT == 2)); then _loaded_modules; fi;;
|
||||||
move-sink-input) _move_sink_input_parameter;;
|
move-sink-input) _move_sink_input_parameter;;
|
||||||
|
|
@ -561,6 +571,7 @@ _pacmd_completion() {
|
||||||
'dump: show daemon configuration'
|
'dump: show daemon configuration'
|
||||||
'dump-volumes: show the state of all volumes'
|
'dump-volumes: show the state of all volumes'
|
||||||
'shared: show shared properties'
|
'shared: show shared properties'
|
||||||
|
'send-message: send a message to a pulseaudio object'
|
||||||
'exit: ask the PulseAudio daemon to exit'
|
'exit: ask the PulseAudio daemon to exit'
|
||||||
)
|
)
|
||||||
_describe 'pacmd commands' _pacmd_commands
|
_describe 'pacmd commands' _pacmd_commands
|
||||||
|
|
@ -668,7 +679,7 @@ _pacat_completion() {
|
||||||
'--process-time-msec=[request the specified process time in msec]:msec' \
|
'--process-time-msec=[request the specified process time in msec]:msec' \
|
||||||
'--property=[set the specified property]:property' \
|
'--property=[set the specified property]:property' \
|
||||||
'--raw[record/play raw PCM data]' \
|
'--raw[record/play raw PCM data]' \
|
||||||
'--passthrough[passtrough data]' \
|
'--passthrough[passthrough data]' \
|
||||||
'--file-format=[record/play formatted PCM data]:format:_pacat_file_formats' \
|
'--file-format=[record/play formatted PCM data]:format:_pacat_file_formats' \
|
||||||
'--list-file-formats[list available formats]' \
|
'--list-file-formats[list available formats]' \
|
||||||
'::files:_files' \
|
'::files:_files' \
|
||||||
|
|
|
||||||
|
|
@ -665,9 +665,21 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
|
||||||
pa_xfree(c->config_file);
|
pa_xfree(c->config_file);
|
||||||
c->config_file = NULL;
|
c->config_file = NULL;
|
||||||
|
|
||||||
|
const char *default_config_file = DEFAULT_CONFIG_FILE;
|
||||||
|
#ifdef HAVE_RUNNING_FROM_BUILD_TREE
|
||||||
|
if (pa_run_from_build_tree()) {
|
||||||
|
pa_log_notice("Detected that we are run from the build tree, fixing default daemon.conf file path.");
|
||||||
|
#ifdef MESON_BUILD
|
||||||
|
default_config_file = PA_BUILDDIR PA_PATH_SEP "src" PA_PATH_SEP "daemon" PA_PATH_SEP "daemon.conf";
|
||||||
|
#else
|
||||||
|
default_config_file = PA_BUILDDIR PA_PATH_SEP "daemon.conf";
|
||||||
|
#endif // Endof #ifdef MESON_BUILD
|
||||||
|
}
|
||||||
|
#endif // Endof #ifdef HAVE_RUNNING_FROM_BUILD_TREE
|
||||||
|
|
||||||
f = filename ?
|
f = filename ?
|
||||||
pa_fopen_cloexec(c->config_file = pa_xstrdup(filename), "r") :
|
pa_fopen_cloexec(c->config_file = pa_xstrdup(filename), "r") :
|
||||||
pa_open_config_file(DEFAULT_CONFIG_FILE, DEFAULT_CONFIG_FILE_USER, ENV_CONFIG_FILE, &c->config_file);
|
pa_open_config_file(default_config_file, DEFAULT_CONFIG_FILE_USER, ENV_CONFIG_FILE, &c->config_file);
|
||||||
|
|
||||||
if (!f && errno != ENOENT) {
|
if (!f && errno != ENOENT) {
|
||||||
pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno));
|
pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno));
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,12 @@ load-module module-coreaudio-detect
|
||||||
### Use the static hardware detection module (for systems that lack udev support)
|
### Use the static hardware detection module (for systems that lack udev support)
|
||||||
load-module module-detect
|
load-module module-detect
|
||||||
.endif
|
.endif
|
||||||
|
ifelse(@OS_IS_FREEBSD@, 1, [dnl
|
||||||
|
### FreeBSD devd is used in addition to static detection (only handles hotplug)
|
||||||
|
.ifexists module-devd-detect@PA_SOEXT@
|
||||||
|
load-module module-devd-detect
|
||||||
|
.endif
|
||||||
|
])dnl
|
||||||
|
|
||||||
### Automatically connect sink and source if JACK server is present
|
### Automatically connect sink and source if JACK server is present
|
||||||
.ifexists module-jackdbus-detect@PA_SOEXT@
|
.ifexists module-jackdbus-detect@PA_SOEXT@
|
||||||
|
|
@ -121,17 +127,6 @@ load-module module-gsettings
|
||||||
.endif
|
.endif
|
||||||
])dnl
|
])dnl
|
||||||
|
|
||||||
ifelse(@HAVE_GCONF@, 1, [dnl
|
|
||||||
### Load additional modules from GConf settings. This can be configured with the paprefs tool.
|
|
||||||
### Please keep in mind that the modules configured by paprefs might conflict with manually
|
|
||||||
### loaded modules.
|
|
||||||
.ifexists module-gconf@PA_SOEXT@
|
|
||||||
.nofail
|
|
||||||
load-module module-gconf
|
|
||||||
.fail
|
|
||||||
.endif
|
|
||||||
])dnl
|
|
||||||
|
|
||||||
### Automatically restore the default sink/source when changed by the user
|
### Automatically restore the default sink/source when changed by the user
|
||||||
### during runtime
|
### during runtime
|
||||||
### NOTE: This should be loaded as early as possible so that subsequent modules
|
### NOTE: This should be loaded as early as possible so that subsequent modules
|
||||||
|
|
@ -173,3 +168,8 @@ load-module module-filter-apply
|
||||||
### Make some devices default
|
### Make some devices default
|
||||||
#set-default-sink output
|
#set-default-sink output
|
||||||
#set-default-source input
|
#set-default-source input
|
||||||
|
|
||||||
|
### Allow including a default.pa.d directory, which if present, can be used
|
||||||
|
### for additional configuration snippets.
|
||||||
|
.nofail
|
||||||
|
.include @PA_DEFAULT_CONFIG_DIR_UNQUOTED@/default.pa.d
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,12 @@
|
||||||
#include <systemd/sd-daemon.h>
|
#include <systemd/sd-daemon.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#include <windows.h>
|
||||||
|
#include <aclapi.h>
|
||||||
|
#include <sddl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <pulse/client-conf.h>
|
#include <pulse/client-conf.h>
|
||||||
#include <pulse/mainloop.h>
|
#include <pulse/mainloop.h>
|
||||||
#include <pulse/mainloop-signal.h>
|
#include <pulse/mainloop-signal.h>
|
||||||
|
|
@ -101,7 +107,7 @@
|
||||||
#ifdef DISABLE_LIBTOOL_PRELOAD
|
#ifdef DISABLE_LIBTOOL_PRELOAD
|
||||||
/* FIXME: work around a libtool bug by making sure we have 2 elements. Bug has
|
/* FIXME: work around a libtool bug by making sure we have 2 elements. Bug has
|
||||||
* been reported: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=29576 */
|
* been reported: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=29576 */
|
||||||
const lt_dlsymlist lt_preloaded_symbols[] = {
|
LT_DLSYM_CONST lt_dlsymlist lt_preloaded_symbols[] = {
|
||||||
{ "@PROGRAM@", NULL },
|
{ "@PROGRAM@", NULL },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
@ -156,7 +162,95 @@ static void signal_callback(pa_mainloop_api* m, pa_signal_event *e, int sig, voi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
|
|
||||||
|
#if defined(OS_IS_WIN32)
|
||||||
|
|
||||||
|
static int change_user(void) {
|
||||||
|
pa_log_info("Overriding system runtime/config base dir to '%s'.", pa_win32_get_system_appdata());
|
||||||
|
|
||||||
|
/* On other platforms, these paths are compiled into PulseAudio. This isn't
|
||||||
|
* suitable on Windows. Firstly, Windows doesn't follow the FHS or use Unix
|
||||||
|
* paths and the build system can't handle Windows-style paths properly.
|
||||||
|
* Secondly, the idiomatic location for a service's state and shared data is
|
||||||
|
* ProgramData, and the location of special folders is dynamic on Windows.
|
||||||
|
* Also, this method of handling paths is consistent with how they are
|
||||||
|
* handled on Windows in other parts of PA. Note that this is only needed
|
||||||
|
* in system-wide mode since paths in user instances are already handled
|
||||||
|
* properly.
|
||||||
|
*/
|
||||||
|
|
||||||
|
char *run_path = pa_sprintf_malloc("%s" PA_PATH_SEP "run", pa_win32_get_system_appdata());
|
||||||
|
char *lib_path = pa_sprintf_malloc("%s" PA_PATH_SEP "lib", pa_win32_get_system_appdata());
|
||||||
|
|
||||||
|
/* https://docs.microsoft.com/en-us/windows/win32/secauthz/ace-strings */
|
||||||
|
/* https://docs.microsoft.com/en-us/windows/win32/secauthz/modifying-the-acls-of-an-object-in-c-- */
|
||||||
|
/* https://docs.microsoft.com/en-us/windows/win32/api/sddl/nf-sddl-convertstringsecuritydescriptortosecuritydescriptora */
|
||||||
|
{
|
||||||
|
mkdir(run_path);
|
||||||
|
PSECURITY_DESCRIPTOR sd;
|
||||||
|
if (ConvertStringSecurityDescriptorToSecurityDescriptorA(
|
||||||
|
"D:PAI" /* DACL, disable inheritance from parent, enable propagation to children */
|
||||||
|
"(A;OICI;FA;;;SY)" /* give system full access */
|
||||||
|
"(A;OICI;FA;;;CO)" /* give owner full access */
|
||||||
|
"(A;OICI;FA;;;BA)" /* give administrators full access */
|
||||||
|
"(A;OICI;0x1200a9;;;WD)", /* give everyone read/write/execute access */
|
||||||
|
SDDL_REVISION_1, &sd, NULL
|
||||||
|
)) {
|
||||||
|
PACL acl;
|
||||||
|
BOOL acl_present, acl_default;
|
||||||
|
if (GetSecurityDescriptorDacl(sd, &acl_present, &acl, &acl_default)) {
|
||||||
|
if (SetNamedSecurityInfo(run_path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, acl, NULL) != ERROR_SUCCESS) {
|
||||||
|
pa_log_warn("Failed to set DACL for runtime dir: failed to apply DACL: error %lu.", GetLastError());
|
||||||
|
}
|
||||||
|
LocalFree(acl);
|
||||||
|
} else {
|
||||||
|
pa_log_warn("Failed to set DACL for runtime dir: failed to get security descriptor DACL: error %lu.", GetLastError());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pa_log_warn("Failed to set DACL for runtime dir: failed to parse security descriptor: error %lu.", GetLastError());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mkdir(lib_path);
|
||||||
|
PSECURITY_DESCRIPTOR sd;
|
||||||
|
if (ConvertStringSecurityDescriptorToSecurityDescriptorA(
|
||||||
|
"D:PAI" /* DACL, disable inheritance from parent, enable propagation to children */
|
||||||
|
"(A;OICI;FA;;;SY)" /* give system full access */
|
||||||
|
"(A;OICI;FA;;;CO)" /* give owner full access */
|
||||||
|
"(A;OICI;FA;;;BA)", /* give administrators full access */
|
||||||
|
SDDL_REVISION_1, &sd, NULL
|
||||||
|
)) {
|
||||||
|
PACL acl;
|
||||||
|
BOOL acl_present, acl_default;
|
||||||
|
if (GetSecurityDescriptorDacl(sd, &acl_present, &acl, &acl_default)) {
|
||||||
|
if (SetNamedSecurityInfo(lib_path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, acl, NULL) != ERROR_SUCCESS) {
|
||||||
|
pa_log_warn("Failed to set DACL for lib dir: failed to apply DACL: error %lu.", GetLastError());
|
||||||
|
}
|
||||||
|
LocalFree(acl);
|
||||||
|
} else {
|
||||||
|
pa_log_warn("Failed to set DACL for lib dir: failed to get security descriptor DACL: error %lu.", GetLastError());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pa_log_warn("Failed to set DACL for lib dir: failed to parse security descriptor: error %lu.", GetLastError());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_set_env("HOME", run_path);
|
||||||
|
if (!getenv("PULSE_RUNTIME_PATH"))
|
||||||
|
pa_set_env("PULSE_RUNTIME_PATH", run_path);
|
||||||
|
if (!getenv("PULSE_CONFIG_PATH"))
|
||||||
|
pa_set_env("PULSE_CONFIG_PATH", lib_path);
|
||||||
|
if (!getenv("PULSE_STATE_PATH"))
|
||||||
|
pa_set_env("PULSE_STATE_PATH", lib_path);
|
||||||
|
|
||||||
|
pa_xfree(run_path);
|
||||||
|
pa_xfree(lib_path);
|
||||||
|
|
||||||
|
pa_log_info("Not changing user for system instance on Windows.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
|
||||||
|
|
||||||
static int change_user(void) {
|
static int change_user(void) {
|
||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
|
|
@ -377,7 +471,45 @@ fail:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef OS_IS_WIN32
|
||||||
|
#define SVC_NAME "PulseAudio"
|
||||||
|
static bool is_svc = true;
|
||||||
|
static int argc;
|
||||||
|
static char **argv;
|
||||||
|
static int real_main(int s_argc, char *s_argv[]);
|
||||||
|
static SERVICE_STATUS_HANDLE svc_status;
|
||||||
|
|
||||||
|
DWORD svc_callback(DWORD ctl, DWORD evt, LPVOID data, LPVOID userdata) {
|
||||||
|
pa_mainloop **m = userdata;
|
||||||
|
switch (ctl) {
|
||||||
|
case SERVICE_CONTROL_STOP:
|
||||||
|
case SERVICE_CONTROL_SHUTDOWN:
|
||||||
|
if (m) {
|
||||||
|
pa_log_info("Exiting.");
|
||||||
|
pa_mainloop_get_api(*m)->quit(pa_mainloop_get_api(*m), 0);
|
||||||
|
}
|
||||||
|
return NO_ERROR;
|
||||||
|
case SERVICE_CONTROL_INTERROGATE:
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int p_argc, char *p_argv[]) {
|
||||||
|
argc = p_argc;
|
||||||
|
argv = p_argv;
|
||||||
|
if (StartServiceCtrlDispatcherA((SERVICE_TABLE_ENTRYA[]){
|
||||||
|
{SVC_NAME, (LPSERVICE_MAIN_FUNCTIONA) real_main},
|
||||||
|
{0},
|
||||||
|
})) return 0;
|
||||||
|
is_svc = false;
|
||||||
|
return real_main(0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int real_main(int s_argc, char *s_argv[]) {
|
||||||
|
#else
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
#endif
|
||||||
pa_core *c = NULL;
|
pa_core *c = NULL;
|
||||||
pa_strbuf *buf = NULL;
|
pa_strbuf *buf = NULL;
|
||||||
pa_daemon_conf *conf = NULL;
|
pa_daemon_conf *conf = NULL;
|
||||||
|
|
@ -402,6 +534,23 @@ int main(int argc, char *argv[]) {
|
||||||
bool start_server;
|
bool start_server;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef OS_IS_WIN32
|
||||||
|
if (is_svc && !(svc_status = RegisterServiceCtrlHandlerExA(SVC_NAME, (LPHANDLER_FUNCTION_EX) svc_callback, &mainloop))) {
|
||||||
|
pa_log("Failed to register service control handler.");
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_svc) {
|
||||||
|
SetServiceStatus(svc_status, &(SERVICE_STATUS){
|
||||||
|
.dwServiceType = SERVICE_WIN32,
|
||||||
|
.dwCurrentState = SERVICE_START_PENDING,
|
||||||
|
.dwControlsAccepted = 0,
|
||||||
|
.dwWin32ExitCode = NO_ERROR,
|
||||||
|
.dwWaitHint = 3000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
pa_log_set_ident("pulseaudio");
|
pa_log_set_ident("pulseaudio");
|
||||||
pa_log_set_level(PA_LOG_NOTICE);
|
pa_log_set_level(PA_LOG_NOTICE);
|
||||||
pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
|
pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
|
||||||
|
|
@ -480,7 +629,13 @@ int main(int argc, char *argv[]) {
|
||||||
pa_unblock_sigs(-1);
|
pa_unblock_sigs(-1);
|
||||||
pa_reset_priority();
|
pa_reset_priority();
|
||||||
|
|
||||||
|
/* Load locale from the environment. */
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "");
|
||||||
|
|
||||||
|
/* Set LC_NUMERIC to C so that floating point strings are consistently
|
||||||
|
* formatted and parsed across locales. */
|
||||||
|
setlocale(LC_NUMERIC, "C");
|
||||||
|
|
||||||
pa_init_i18n();
|
pa_init_i18n();
|
||||||
|
|
||||||
conf = pa_daemon_conf_new();
|
conf = pa_daemon_conf_new();
|
||||||
|
|
@ -916,7 +1071,6 @@ int main(int argc, char *argv[]) {
|
||||||
pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
|
pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
|
||||||
|
|
||||||
pa_log_info("This is PulseAudio %s", PACKAGE_VERSION);
|
pa_log_info("This is PulseAudio %s", PACKAGE_VERSION);
|
||||||
pa_log_debug("Compilation host: %s", CANONICAL_HOST);
|
|
||||||
pa_log_debug("Compilation CFLAGS: %s", PA_CFLAGS);
|
pa_log_debug("Compilation CFLAGS: %s", PA_CFLAGS);
|
||||||
|
|
||||||
#ifdef HAVE_LIBSAMPLERATE
|
#ifdef HAVE_LIBSAMPLERATE
|
||||||
|
|
@ -1067,6 +1221,10 @@ int main(int argc, char *argv[]) {
|
||||||
c->server_type = conf->local_server_type;
|
c->server_type = conf->local_server_type;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
pa_core_check_idle(c);
|
||||||
|
|
||||||
|
c->state = PA_CORE_RUNNING;
|
||||||
|
|
||||||
pa_cpu_init(&c->cpu_info);
|
pa_cpu_init(&c->cpu_info);
|
||||||
|
|
||||||
pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
|
pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
|
||||||
|
|
@ -1163,6 +1321,18 @@ int main(int argc, char *argv[]) {
|
||||||
sd_notify(0, "READY=1");
|
sd_notify(0, "READY=1");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef OS_IS_WIN32
|
||||||
|
if (is_svc) {
|
||||||
|
SetServiceStatus(svc_status, &(SERVICE_STATUS){
|
||||||
|
.dwServiceType = SERVICE_WIN32,
|
||||||
|
.dwCurrentState = SERVICE_RUNNING,
|
||||||
|
.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN,
|
||||||
|
.dwWin32ExitCode = NO_ERROR,
|
||||||
|
.dwWaitHint = 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
retval = 0;
|
retval = 0;
|
||||||
if (pa_mainloop_run(mainloop, &retval) < 0)
|
if (pa_mainloop_run(mainloop, &retval) < 0)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
@ -1173,6 +1343,18 @@ int main(int argc, char *argv[]) {
|
||||||
sd_notify(0, "STOPPING=1");
|
sd_notify(0, "STOPPING=1");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef OS_IS_WIN32
|
||||||
|
if (is_svc) {
|
||||||
|
SetServiceStatus(svc_status, &(SERVICE_STATUS){
|
||||||
|
.dwServiceType = SERVICE_WIN32,
|
||||||
|
.dwCurrentState = SERVICE_STOP_PENDING,
|
||||||
|
.dwControlsAccepted = 0,
|
||||||
|
.dwWin32ExitCode = NO_ERROR,
|
||||||
|
.dwWaitHint = 2000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
#ifdef HAVE_DBUS
|
#ifdef HAVE_DBUS
|
||||||
if (server_bus)
|
if (server_bus)
|
||||||
|
|
@ -1240,5 +1422,17 @@ finish:
|
||||||
dbus_shutdown();
|
dbus_shutdown();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef OS_IS_WIN32
|
||||||
|
if (is_svc) {
|
||||||
|
SetServiceStatus(svc_status, &(SERVICE_STATUS){
|
||||||
|
.dwServiceType = SERVICE_WIN32,
|
||||||
|
.dwCurrentState = SERVICE_STOPPED,
|
||||||
|
.dwControlsAccepted = 0,
|
||||||
|
.dwWin32ExitCode = retval ? ERROR_PROCESS_ABORTED : NO_ERROR,
|
||||||
|
.dwWaitHint = 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ executable('pulseaudio',
|
||||||
include_directories : [configinc, topinc],
|
include_directories : [configinc, topinc],
|
||||||
link_args : ['-ffast-math'],
|
link_args : ['-ffast-math'],
|
||||||
link_with : [libpulsecore, libpulsecommon, libpulse],
|
link_with : [libpulsecore, libpulsecommon, libpulse],
|
||||||
dependencies : [ltdl_dep, cap_dep, dbus_dep, libsystemd_dep, dl_dep, libintl_dep],
|
dependencies : [ltdl_dep, cap_dep, dbus_dep, libsystemd_dep, dl_dep, libintl_dep, platform_dep, platform_socket_dep],
|
||||||
c_args : pa_c_args,
|
c_args : pa_c_args,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -47,6 +47,14 @@ if x11_dep.found()
|
||||||
install_dir : bindir,
|
install_dir : bindir,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
input : 'start-pulseaudio-x11.in',
|
||||||
|
output : '00-pulseaudio-x11',
|
||||||
|
configuration : conf,
|
||||||
|
install : true,
|
||||||
|
install_dir : join_paths(sysconfdir, 'xdg', 'Xwayland-session.d'),
|
||||||
|
)
|
||||||
|
|
||||||
desktop_file = i18n.merge_file(
|
desktop_file = i18n.merge_file(
|
||||||
input : 'pulseaudio.desktop.in',
|
input : 'pulseaudio.desktop.in',
|
||||||
output : 'pulseaudio.desktop',
|
output : 'pulseaudio.desktop',
|
||||||
|
|
@ -92,11 +100,9 @@ default_conf = configuration_data()
|
||||||
default_conf.merge_from(cdata)
|
default_conf.merge_from(cdata)
|
||||||
default_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY'))
|
default_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY'))
|
||||||
default_conf.set('PA_SOEXT', cdata.get_unquoted('PA_SOEXT'))
|
default_conf.set('PA_SOEXT', cdata.get_unquoted('PA_SOEXT'))
|
||||||
default_conf.set10('HAVE_AF_UNIX', cc.has_header('sys/un.h'))
|
default_conf.set10('HAVE_AF_UNIX', cc.has_header('sys/un.h') ? true : cc.has_header('winsock2.h'))
|
||||||
default_conf.set10('OS_IS_WIN32', host_machine.system() == 'windows')
|
default_conf.set10('OS_IS_WIN32', host_machine.system() == 'windows')
|
||||||
default_conf.set10('HAVE_MKFIFO', cc.has_function('mkfifo'))
|
default_conf.set10('HAVE_MKFIFO', cc.has_function('mkfifo'))
|
||||||
# We don't support the deprecated GConf option in meson
|
|
||||||
default_conf.set10('HAVE_GCONF', 0)
|
|
||||||
|
|
||||||
default_template_file = configure_file(
|
default_template_file = configure_file(
|
||||||
input : 'default.pa.in',
|
input : 'default.pa.in',
|
||||||
|
|
@ -115,9 +121,7 @@ custom_target('default.pa',
|
||||||
)
|
)
|
||||||
|
|
||||||
system_conf = configuration_data()
|
system_conf = configuration_data()
|
||||||
system_conf.merge_from(cdata)
|
system_conf.merge_from(default_conf)
|
||||||
system_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY'))
|
|
||||||
system_conf.set('PA_SOEXT', cdata.get_unquoted('PA_SOEXT'))
|
|
||||||
|
|
||||||
system_template_file = configure_file(
|
system_template_file = configure_file(
|
||||||
input : 'system.pa.in',
|
input : 'system.pa.in',
|
||||||
|
|
@ -144,6 +148,8 @@ endif
|
||||||
if systemd_dep.found()
|
if systemd_dep.found()
|
||||||
sd_user_service_conf = configuration_data()
|
sd_user_service_conf = configuration_data()
|
||||||
sd_user_service_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY'))
|
sd_user_service_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY'))
|
||||||
|
sd_user_service_conf.set('PACTL_BINARY', join_paths(bindir, 'pactl'))
|
||||||
|
sd_user_service_conf.set('PA_X11_BINARY', join_paths(bindir, 'start-pulseaudio-x11'))
|
||||||
|
|
||||||
sd_user_service_file = configure_file(
|
sd_user_service_file = configure_file(
|
||||||
input : 'systemd/user/pulseaudio.service.in',
|
input : 'systemd/user/pulseaudio.service.in',
|
||||||
|
|
@ -153,6 +159,14 @@ if systemd_dep.found()
|
||||||
install_dir : systemduserunitdir,
|
install_dir : systemduserunitdir,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sd_user_x11_service_file = configure_file(
|
||||||
|
input : 'systemd/user/pulseaudio-x11.service.in',
|
||||||
|
output : 'pulseaudio-x11.service',
|
||||||
|
configuration : sd_user_service_conf,
|
||||||
|
install : true,
|
||||||
|
install_dir : systemduserunitdir,
|
||||||
|
)
|
||||||
|
|
||||||
install_data('systemd/user/pulseaudio.socket',
|
install_data('systemd/user/pulseaudio.socket',
|
||||||
install_dir: systemduserunitdir,
|
install_dir: systemduserunitdir,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -6,4 +6,5 @@ Exec=start-pulseaudio-x11
|
||||||
Terminal=false
|
Terminal=false
|
||||||
Type=Application
|
Type=Application
|
||||||
X-GNOME-Autostart-Phase=Initialization
|
X-GNOME-Autostart-Phase=Initialization
|
||||||
|
X-GNOME-HiddenUnderSystemd=true
|
||||||
X-KDE-autostart-phase=1
|
X-KDE-autostart-phase=1
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,25 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
if [ -n "$1" ] ; then
|
||||||
|
case $1 in
|
||||||
|
stop)
|
||||||
|
@PACTL_BINARY@ unload-module module-x11-publish > /dev/null
|
||||||
|
@PACTL_BINARY@ unload-module module-x11-cork-request > /dev/null
|
||||||
|
@PACTL_BINARY@ unload-module module-device-manager > /dev/null
|
||||||
|
@PACTL_BINARY@ unload-module module-x11-xsmp > /dev/null
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
# Let it continue further down
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown argument $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
if [ x"$DISPLAY" != x ] ; then
|
if [ x"$DISPLAY" != x ] ; then
|
||||||
|
|
||||||
@PACTL_BINARY@ load-module module-x11-publish "display=$DISPLAY xauthority=$XAUTHORITY" > /dev/null
|
@PACTL_BINARY@ load-module module-x11-publish "display=$DISPLAY xauthority=$XAUTHORITY" > /dev/null
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,12 @@ load-module module-coreaudio-detect
|
||||||
### Use the static hardware detection module (for systems that lack udev/hal support)
|
### Use the static hardware detection module (for systems that lack udev/hal support)
|
||||||
load-module module-detect
|
load-module module-detect
|
||||||
.endif
|
.endif
|
||||||
|
ifelse(@OS_IS_FREEBSD@, 1, [dnl
|
||||||
|
### FreeBSD devd is used in addition to static detection (only handles hotplug)
|
||||||
|
.ifexists module-devd-detect@PA_SOEXT@
|
||||||
|
load-module module-devd-detect
|
||||||
|
.endif
|
||||||
|
])dnl
|
||||||
|
|
||||||
### Load several protocols
|
### Load several protocols
|
||||||
.ifexists module-esound-protocol-unix@PA_SOEXT@
|
.ifexists module-esound-protocol-unix@PA_SOEXT@
|
||||||
|
|
@ -60,3 +66,8 @@ load-module module-suspend-on-idle
|
||||||
|
|
||||||
### Enable positioned event sounds
|
### Enable positioned event sounds
|
||||||
load-module module-position-event-sounds
|
load-module module-position-event-sounds
|
||||||
|
|
||||||
|
### Allow including a system.pa.d directory, which if present, can be used
|
||||||
|
### for additional configuration snippets.
|
||||||
|
.nofail
|
||||||
|
.include @PA_DEFAULT_CONFIG_DIR_UNQUOTED@/system.pa.d
|
||||||
|
|
|
||||||
18
src/daemon/systemd/user/pulseaudio-x11.service.in
Normal file
18
src/daemon/systemd/user/pulseaudio-x11.service.in
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Sound Service (X11 Plugins)
|
||||||
|
Requires=pulseaudio.service
|
||||||
|
After=pulseaudio.service
|
||||||
|
ConditionUser=!root
|
||||||
|
PartOf=gnome-session-x11.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=@PA_X11_BINARY@
|
||||||
|
ExecStop=@PA_X11_BINARY@ stop
|
||||||
|
LockPersonality=yes
|
||||||
|
MemoryDenyWriteExecute=yes
|
||||||
|
NoNewPrivileges=yes
|
||||||
|
RestrictNamespaces=yes
|
||||||
|
SystemCallArchitectures=native
|
||||||
|
SystemCallFilter=@system-service
|
||||||
|
Type=simple
|
||||||
|
UMask=0077
|
||||||
|
|
@ -28,6 +28,7 @@ SystemCallFilter=@system-service
|
||||||
# Note that notify will only work if --daemonize=no
|
# Note that notify will only work if --daemonize=no
|
||||||
Type=notify
|
Type=notify
|
||||||
UMask=0077
|
UMask=0077
|
||||||
|
Slice=session.slice
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
Also=pulseaudio.socket
|
Also=pulseaudio.socket
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ libpulsecommon_sources = [
|
||||||
'pulse/error.c',
|
'pulse/error.c',
|
||||||
'pulse/fork-detect.c',
|
'pulse/fork-detect.c',
|
||||||
'pulse/format.c',
|
'pulse/format.c',
|
||||||
'pulse/json.c',
|
|
||||||
'pulse/mainloop-api.c',
|
'pulse/mainloop-api.c',
|
||||||
'pulse/xmalloc.c',
|
'pulse/xmalloc.c',
|
||||||
'pulse/proplist.c',
|
'pulse/proplist.c',
|
||||||
|
|
@ -31,6 +30,7 @@ libpulsecommon_sources = [
|
||||||
'pulsecore/iochannel.c',
|
'pulsecore/iochannel.c',
|
||||||
'pulsecore/ioline.c',
|
'pulsecore/ioline.c',
|
||||||
'pulsecore/ipacl.c',
|
'pulsecore/ipacl.c',
|
||||||
|
'pulsecore/json.c',
|
||||||
'pulsecore/lock-autospawn.c',
|
'pulsecore/lock-autospawn.c',
|
||||||
'pulsecore/log.c',
|
'pulsecore/log.c',
|
||||||
'pulsecore/ratelimit.c',
|
'pulsecore/ratelimit.c',
|
||||||
|
|
@ -38,7 +38,6 @@ libpulsecommon_sources = [
|
||||||
'pulsecore/memblock.c',
|
'pulsecore/memblock.c',
|
||||||
'pulsecore/memblockq.c',
|
'pulsecore/memblockq.c',
|
||||||
'pulsecore/memchunk.c',
|
'pulsecore/memchunk.c',
|
||||||
'pulsecore/mutex-posix.c',
|
|
||||||
'pulsecore/native-common.c',
|
'pulsecore/native-common.c',
|
||||||
'pulsecore/once.c',
|
'pulsecore/once.c',
|
||||||
'pulsecore/packet.c',
|
'pulsecore/packet.c',
|
||||||
|
|
@ -55,7 +54,6 @@ libpulsecommon_sources = [
|
||||||
'pulsecore/random.c',
|
'pulsecore/random.c',
|
||||||
'pulsecore/srbchannel.c',
|
'pulsecore/srbchannel.c',
|
||||||
'pulsecore/sample-util.c',
|
'pulsecore/sample-util.c',
|
||||||
'pulsecore/semaphore-posix.c',
|
|
||||||
'pulsecore/shm.c',
|
'pulsecore/shm.c',
|
||||||
'pulsecore/bitset.c',
|
'pulsecore/bitset.c',
|
||||||
'pulsecore/socket-client.c',
|
'pulsecore/socket-client.c',
|
||||||
|
|
@ -64,7 +62,6 @@ libpulsecommon_sources = [
|
||||||
'pulsecore/strbuf.c',
|
'pulsecore/strbuf.c',
|
||||||
'pulsecore/strlist.c',
|
'pulsecore/strlist.c',
|
||||||
'pulsecore/tagstruct.c',
|
'pulsecore/tagstruct.c',
|
||||||
'pulsecore/thread-posix.c',
|
|
||||||
'pulsecore/time-smoother.c',
|
'pulsecore/time-smoother.c',
|
||||||
'pulsecore/tokenizer.c',
|
'pulsecore/tokenizer.c',
|
||||||
'pulsecore/usergroup.c',
|
'pulsecore/usergroup.c',
|
||||||
|
|
@ -76,7 +73,6 @@ libpulsecommon_headers = [
|
||||||
'pulse/error.h',
|
'pulse/error.h',
|
||||||
'pulse/fork-detect.h',
|
'pulse/fork-detect.h',
|
||||||
'pulse/format.h',
|
'pulse/format.h',
|
||||||
'pulse/json.h',
|
|
||||||
'pulse/mainloop-api.h',
|
'pulse/mainloop-api.h',
|
||||||
'pulse/xmalloc.h',
|
'pulse/xmalloc.h',
|
||||||
'pulse/proplist.h',
|
'pulse/proplist.h',
|
||||||
|
|
@ -107,6 +103,7 @@ libpulsecommon_headers = [
|
||||||
'pulsecore/iochannel.h',
|
'pulsecore/iochannel.h',
|
||||||
'pulsecore/ioline.h',
|
'pulsecore/ioline.h',
|
||||||
'pulsecore/ipacl.h',
|
'pulsecore/ipacl.h',
|
||||||
|
'pulsecore/json.h',
|
||||||
'pulsecore/llist.h',
|
'pulsecore/llist.h',
|
||||||
'pulsecore/lock-autospawn.h',
|
'pulsecore/lock-autospawn.h',
|
||||||
'pulsecore/log.h',
|
'pulsecore/log.h',
|
||||||
|
|
@ -175,6 +172,20 @@ if x11_dep.found()
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# FIXME: Do non-POSIX thread things
|
# FIXME: Do non-POSIX thread things
|
||||||
|
if host_machine.system() == 'windows'
|
||||||
|
libpulsecommon_sources += [
|
||||||
|
'pulsecore/mutex-win32.c',
|
||||||
|
'pulsecore/poll-win32.c',
|
||||||
|
'pulsecore/semaphore-win32.c',
|
||||||
|
'pulsecore/thread-win32.c',
|
||||||
|
]
|
||||||
|
else
|
||||||
|
libpulsecommon_sources += [
|
||||||
|
'pulsecore/mutex-posix.c',
|
||||||
|
'pulsecore/semaphore-posix.c',
|
||||||
|
'pulsecore/thread-posix.c'
|
||||||
|
]
|
||||||
|
endif
|
||||||
# FIXME: Do SIMD things
|
# FIXME: Do SIMD things
|
||||||
|
|
||||||
libpulsecommon = shared_library('pulsecommon-' + pa_version_major_minor,
|
libpulsecommon = shared_library('pulsecommon-' + pa_version_major_minor,
|
||||||
|
|
@ -187,16 +198,20 @@ libpulsecommon = shared_library('pulsecommon-' + pa_version_major_minor,
|
||||||
install_dir : privlibdir,
|
install_dir : privlibdir,
|
||||||
dependencies : [
|
dependencies : [
|
||||||
libm_dep, thread_dep, dl_dep, shm_dep, iconv_dep, sndfile_dep, dbus_dep,
|
libm_dep, thread_dep, dl_dep, shm_dep, iconv_dep, sndfile_dep, dbus_dep,
|
||||||
x11_dep, libsystemd_dep, glib_dep, gtk_dep, asyncns_dep, libintl_dep,
|
x11_dep, libsystemd_dep, glib_dep.partial_dependency(compile_args: true),
|
||||||
|
gtk_dep.partial_dependency(compile_args: true), asyncns_dep, libintl_dep,
|
||||||
|
platform_dep, tcpwrap_dep, platform_socket_dep, execinfo_dep,
|
||||||
],
|
],
|
||||||
implicit_include_directories : false)
|
implicit_include_directories : false)
|
||||||
|
|
||||||
libpulsecommon_dep = declare_dependency(link_with: libpulsecommon)
|
libpulsecommon_dep = declare_dependency(link_with: libpulsecommon)
|
||||||
|
|
||||||
subdir('pulse')
|
subdir('pulse')
|
||||||
subdir('pulsecore')
|
if get_option('daemon')
|
||||||
subdir('daemon')
|
subdir('pulsecore')
|
||||||
subdir('modules')
|
subdir('daemon')
|
||||||
|
subdir('modules')
|
||||||
|
endif
|
||||||
if get_option('tests')
|
if get_option('tests')
|
||||||
subdir('tests')
|
subdir('tests')
|
||||||
endif
|
endif
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ SUBSYSTEM!="sound", GOTO="pulseaudio_end"
|
||||||
ACTION!="change", GOTO="pulseaudio_end"
|
ACTION!="change", GOTO="pulseaudio_end"
|
||||||
KERNEL!="card*", GOTO="pulseaudio_end"
|
KERNEL!="card*", GOTO="pulseaudio_end"
|
||||||
SUBSYSTEMS=="usb", GOTO="pulseaudio_check_usb"
|
SUBSYSTEMS=="usb", GOTO="pulseaudio_check_usb"
|
||||||
|
SUBSYSTEMS=="pci", GOTO="pulseaudio_check_pci"
|
||||||
SUBSYSTEMS=="firewire", GOTO="pulseaudio_firewire_quirk"
|
SUBSYSTEMS=="firewire", GOTO="pulseaudio_firewire_quirk"
|
||||||
|
|
||||||
SUBSYSTEMS=="platform", DRIVERS=="thinkpad_acpi", ENV{PULSE_IGNORE}="1"
|
SUBSYSTEMS=="platform", DRIVERS=="thinkpad_acpi", ENV{PULSE_IGNORE}="1"
|
||||||
|
|
@ -104,12 +105,17 @@ ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="041d", ENV{PULSE_PROFILE_SET}="nativ
|
||||||
ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1010", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio6.conf"
|
ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1010", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio6.conf"
|
||||||
ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1011", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio6.conf"
|
ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1011", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio6.conf"
|
||||||
|
|
||||||
|
|
||||||
|
ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1001", ENV{PULSE_PROFILE_SET}="native-instruments-komplete-audio6.conf"
|
||||||
ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1021", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio10.conf"
|
ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1021", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio10.conf"
|
||||||
ATTRS{idVendor}=="0763", ATTRS{idProduct}=="2012", ENV{PULSE_PROFILE_SET}="maudio-fasttrack-pro.conf"
|
ATTRS{idVendor}=="0763", ATTRS{idProduct}=="2012", ENV{PULSE_PROFILE_SET}="maudio-fasttrack-pro.conf"
|
||||||
ATTRS{idVendor}=="045e", ATTRS{idProduct}=="02bb", ENV{PULSE_PROFILE_SET}="kinect-audio.conf"
|
ATTRS{idVendor}=="045e", ATTRS{idProduct}=="02bb", ENV{PULSE_PROFILE_SET}="kinect-audio.conf"
|
||||||
ATTRS{idVendor}=="041e", ATTRS{idProduct}=="322c", ENV{PULSE_PROFILE_SET}="sb-omni-surround-5.1.conf"
|
ATTRS{idVendor}=="041e", ATTRS{idProduct}=="322c", ENV{PULSE_PROFILE_SET}="sb-omni-surround-5.1.conf"
|
||||||
ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="4014", ENV{PULSE_PROFILE_SET}="dell-dock-tb16-usb-audio.conf"
|
ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="4014", ENV{PULSE_PROFILE_SET}="dell-dock-tb16-usb-audio.conf"
|
||||||
|
ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="402e", ENV{PULSE_PROFILE_SET}="dell-dock-tb16-usb-audio.conf"
|
||||||
|
ATTRS{idVendor}=="08bb", ATTRS{idProduct}=="2902", ENV{PULSE_PROFILE_SET}="behringer-umc22.conf"
|
||||||
|
ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="0269", ENV{PULSE_PROFILE_SET}="hp-tbt-dock-120w-g2.conf"
|
||||||
|
ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="0567", ENV{PULSE_PROFILE_SET}="hp-tbt-dock-audio-module.conf"
|
||||||
|
|
||||||
# ID 1038:12ad is for the 2018 refresh of the Arctis 7.
|
# ID 1038:12ad is for the 2018 refresh of the Arctis 7.
|
||||||
# ID 1038:1294 is for Arctis Pro Wireless (which works with the Arctis 7 configuration).
|
# ID 1038:1294 is for Arctis Pro Wireless (which works with the Arctis 7 configuration).
|
||||||
|
|
@ -117,8 +123,15 @@ ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1260", ENV{PULSE_PROFILE_SET}="usb-g
|
||||||
ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12ad", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12ad", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
||||||
ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1294", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1294", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
||||||
ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1730", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1730", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
||||||
|
# ID 1038:12c4 is for Arctis 9
|
||||||
|
ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12c4", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
||||||
# Lucidsound LS31
|
# Lucidsound LS31
|
||||||
ATTRS{idVendor}=="2f12", ATTRS{idProduct}=="0109", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
ATTRS{idVendor}=="2f12", ATTRS{idProduct}=="0109", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
||||||
|
# ID 9886:002c is for the Astro A50 Gen4
|
||||||
|
ATTRS{idVendor}=="9886", ATTRS{idProduct}=="002c", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
||||||
|
# ID 1532:0520 is for the Razer Kraken Tournament Edition
|
||||||
|
ATTRS{idVendor}=="1532", ATTRS{idProduct}=="0520", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
|
||||||
|
|
||||||
|
|
||||||
# ID 1038:1250 is for the Arctis 5
|
# ID 1038:1250 is for the Arctis 5
|
||||||
# ID 1037:12aa is for the Arctis 5 2019
|
# ID 1037:12aa is for the Arctis 5 2019
|
||||||
|
|
@ -129,17 +142,51 @@ ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1252", ENV{PULSE_PROFILE_SET}="steel
|
||||||
|
|
||||||
ATTRS{idVendor}=="147a", ATTRS{idProduct}=="e055", ENV{PULSE_PROFILE_SET}="cmedia-high-speed-true-hdaudio.conf"
|
ATTRS{idVendor}=="147a", ATTRS{idProduct}=="e055", ENV{PULSE_PROFILE_SET}="cmedia-high-speed-true-hdaudio.conf"
|
||||||
|
|
||||||
|
# HyperX Cloud Orbit S has three modes. Each mode has a separate product ID.
|
||||||
|
# ID_SERIAL for this device is the device name + mode repeated three times.
|
||||||
|
# ID_SERIAL is used for the ID_ID property, and the ID_ID property is used in
|
||||||
|
# the card name in PulseAudio. The resulting card name is too long for the name
|
||||||
|
# length limit, so we set a more sensible ID_ID here (the same as the default
|
||||||
|
# ID_ID, but without repetition in the serial part).
|
||||||
|
ATTRS{idVendor}=="0951", ATTRS{idProduct}=="16ff", ENV{ID_ID}="usb-HyperX_Cloud_Orbit_S_2Ch-$env{ID_USB_INTERFACE_NUM}"
|
||||||
|
ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1702", ENV{ID_ID}="usb-HyperX_Cloud_Orbit_S_Hi-Res_2Ch-$env{ID_USB_INTERFACE_NUM}"
|
||||||
|
ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1703", ENV{ID_ID}="usb-HyperX_Cloud_Orbit_S_3D_8Ch-$env{ID_USB_INTERFACE_NUM}"
|
||||||
|
|
||||||
|
# OnePlus Type-C Bullets (ED117)
|
||||||
|
ATTRS{idVendor}=="2a70", ATTRS{idProduct}=="1881", ENV{PULSE_PROFILE_SET}="simple-headphones-mic.conf"
|
||||||
|
|
||||||
|
# ID 1395:005e is for Sennheiser GSX 1000
|
||||||
|
# ID 1395:00a0 is for Sennheiser GSX 1000
|
||||||
|
# ID 1395:005f is for Sennheiser GSX 1200
|
||||||
|
# ID 1395:00a1 is for Sennheiser GSX 1200
|
||||||
|
ATTRS{idVendor}=="1395", ATTRS{idProduct}=="005e", ENV{PULSE_PROFILE_SET}="sennheiser-gsx.conf"
|
||||||
|
ATTRS{idVendor}=="1395", ATTRS{idProduct}=="00a0", ENV{PULSE_PROFILE_SET}="sennheiser-gsx.conf"
|
||||||
|
ATTRS{idVendor}=="1395", ATTRS{idProduct}=="005f", ENV{PULSE_PROFILE_SET}="sennheiser-gsx.conf"
|
||||||
|
ATTRS{idVendor}=="1395", ATTRS{idProduct}=="00a1", ENV{PULSE_PROFILE_SET}="sennheiser-gsx.conf"
|
||||||
|
|
||||||
|
GOTO="pulseaudio_end"
|
||||||
|
|
||||||
|
LABEL="pulseaudio_check_pci"
|
||||||
|
|
||||||
|
# Creative SoundBlaster Audigy-based cards
|
||||||
|
# EMU10k2/CA0100/CA0102/CA10200
|
||||||
|
ATTRS{vendor}=="0x1102", ATTRS{device}=="0x0004", ENV{PULSE_PROFILE_SET}="audigy.conf"
|
||||||
|
# CA0108/CA10300
|
||||||
|
ATTRS{vendor}=="0x1102", ATTRS{device}=="0x0008", ENV{PULSE_PROFILE_SET}="audigy.conf"
|
||||||
|
|
||||||
GOTO="pulseaudio_end"
|
GOTO="pulseaudio_end"
|
||||||
|
|
||||||
LABEL="pulseaudio_firewire_quirk"
|
LABEL="pulseaudio_firewire_quirk"
|
||||||
|
|
||||||
# Focusrite Saffire Pro 10/26 i/o has a quirk to disappear from IEEE 1394 bus when losing connections.
|
# Focusrite Saffire Pro 10 i/o and Pro 26 i/o have a quirk to disappear from
|
||||||
# https://bugzilla.kernel.org/show_bug.cgi?id=199365
|
# IEEE 1394 bus when breaking connections. This brings an issue for PulseAudio
|
||||||
ENV{ID_VENDOR_ID}=="0x00130e", ENV{ID_MODEL_ID}=="0x000003", ENV{PULSE_IGNORE}="1"
|
# to continue the routine for ever that:
|
||||||
# Both of Saffire Pro 10 i/o and Liquid Saffire 56 have the same ID_MODEL_ID
|
# - detecting sound card
|
||||||
# (0x000006), but Liquid Saffire 56 doesn't suffer from the problem, so we
|
# - starting PCM substream
|
||||||
# can't use ID_MODEL_ID to identify the problematic card. ID_MODEL works
|
# - stopping the PCM substream
|
||||||
# better here.
|
# - the card disappears
|
||||||
ENV{ID_VENDOR_ID}=="0x00130e", ENV{ID_MODEL}=="Pro10IO" ENV{PULSE_IGNORE}="1"
|
# - the card appears
|
||||||
|
# In detail, see: https://bugzilla.kernel.org/show_bug.cgi?id=199365
|
||||||
|
ATTRS{vendor}=="0x00130e", ATTRS{model}=="0x00000[36]", ATTRS{units}=="0x00a02d:0x010001", ENV{PULSE_IGNORE}="1"
|
||||||
|
|
||||||
LABEL="pulseaudio_end"
|
LABEL="pulseaudio_end"
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -50,6 +50,8 @@ typedef struct pa_alsa_port_data pa_alsa_port_data;
|
||||||
#include "alsa-util.h"
|
#include "alsa-util.h"
|
||||||
#include "alsa-ucm.h"
|
#include "alsa-ucm.h"
|
||||||
|
|
||||||
|
#define POSITION_MASK_CHANNELS 8
|
||||||
|
|
||||||
typedef enum pa_alsa_switch_use {
|
typedef enum pa_alsa_switch_use {
|
||||||
PA_ALSA_SWITCH_IGNORE,
|
PA_ALSA_SWITCH_IGNORE,
|
||||||
PA_ALSA_SWITCH_MUTE, /* make this switch follow mute status */
|
PA_ALSA_SWITCH_MUTE, /* make this switch follow mute status */
|
||||||
|
|
@ -113,6 +115,8 @@ struct pa_alsa_mixer_id {
|
||||||
int index;
|
int index;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
char *pa_alsa_mixer_id_to_string(char *dst, size_t dst_len, pa_alsa_mixer_id *id);
|
||||||
|
|
||||||
/* An option belongs to an element and refers to one enumeration item
|
/* An option belongs to an element and refers to one enumeration item
|
||||||
* of the element is an enumeration item, or a switch status if the
|
* of the element is an enumeration item, or a switch status if the
|
||||||
* element is a switch item. */
|
* element is a switch item. */
|
||||||
|
|
@ -152,7 +156,7 @@ struct pa_alsa_element {
|
||||||
|
|
||||||
long constant_volume;
|
long constant_volume;
|
||||||
|
|
||||||
bool override_map:1;
|
unsigned int override_map;
|
||||||
bool direction_try_other:1;
|
bool direction_try_other:1;
|
||||||
|
|
||||||
bool has_dB:1;
|
bool has_dB:1;
|
||||||
|
|
@ -160,7 +164,7 @@ struct pa_alsa_element {
|
||||||
long volume_limit; /* -1 for no configured limit */
|
long volume_limit; /* -1 for no configured limit */
|
||||||
double min_dB, max_dB;
|
double min_dB, max_dB;
|
||||||
|
|
||||||
pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST + 1][2];
|
pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST + 1][POSITION_MASK_CHANNELS];
|
||||||
unsigned n_channels;
|
unsigned n_channels;
|
||||||
|
|
||||||
pa_channel_position_mask_t merged_mask;
|
pa_channel_position_mask_t merged_mask;
|
||||||
|
|
@ -177,8 +181,8 @@ struct pa_alsa_jack {
|
||||||
snd_mixer_t *mixer_handle;
|
snd_mixer_t *mixer_handle;
|
||||||
char *mixer_device_name;
|
char *mixer_device_name;
|
||||||
|
|
||||||
|
struct pa_alsa_mixer_id alsa_id;
|
||||||
char *name; /* E g "Headphone" */
|
char *name; /* E g "Headphone" */
|
||||||
char *alsa_name; /* E g "Headphone Jack" */
|
|
||||||
bool has_control; /* is the jack itself present? */
|
bool has_control; /* is the jack itself present? */
|
||||||
bool plugged_in; /* is this jack currently plugged in? */
|
bool plugged_in; /* is this jack currently plugged in? */
|
||||||
snd_mixer_elem_t *melem; /* Jack detection handle */
|
snd_mixer_elem_t *melem; /* Jack detection handle */
|
||||||
|
|
@ -194,7 +198,7 @@ struct pa_alsa_jack {
|
||||||
bool append_pcm_to_name;
|
bool append_pcm_to_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
pa_alsa_jack *pa_alsa_jack_new(pa_alsa_path *path, const char *mixer_device_name, const char *name);
|
pa_alsa_jack *pa_alsa_jack_new(pa_alsa_path *path, const char *mixer_device_name, const char *name, int index);
|
||||||
void pa_alsa_jack_free(pa_alsa_jack *jack);
|
void pa_alsa_jack_free(pa_alsa_jack *jack);
|
||||||
void pa_alsa_jack_set_has_control(pa_alsa_jack *jack, bool has_control);
|
void pa_alsa_jack_set_has_control(pa_alsa_jack *jack, bool has_control);
|
||||||
void pa_alsa_jack_set_plugged_in(pa_alsa_jack *jack, bool plugged_in);
|
void pa_alsa_jack_set_plugged_in(pa_alsa_jack *jack, bool plugged_in);
|
||||||
|
|
@ -211,7 +215,7 @@ struct pa_alsa_path {
|
||||||
char *name;
|
char *name;
|
||||||
char *description_key;
|
char *description_key;
|
||||||
char *description;
|
char *description;
|
||||||
char *available_group;
|
char *availability_group;
|
||||||
pa_device_port_type_t device_port_type;
|
pa_device_port_type_t device_port_type;
|
||||||
unsigned priority;
|
unsigned priority;
|
||||||
bool autodetect_eld_device;
|
bool autodetect_eld_device;
|
||||||
|
|
@ -281,6 +285,7 @@ struct pa_alsa_mapping {
|
||||||
|
|
||||||
char *name;
|
char *name;
|
||||||
char *description;
|
char *description;
|
||||||
|
char *description_key;
|
||||||
unsigned priority;
|
unsigned priority;
|
||||||
pa_alsa_direction_t direction;
|
pa_alsa_direction_t direction;
|
||||||
/* These are copied over to the resultant sink/source */
|
/* These are copied over to the resultant sink/source */
|
||||||
|
|
@ -322,6 +327,7 @@ struct pa_alsa_profile {
|
||||||
|
|
||||||
char *name;
|
char *name;
|
||||||
char *description;
|
char *description;
|
||||||
|
char *description_key;
|
||||||
unsigned priority;
|
unsigned priority;
|
||||||
|
|
||||||
char *input_name;
|
char *input_name;
|
||||||
|
|
|
||||||
|
|
@ -1494,6 +1494,7 @@ static void sink_set_volume_cb(pa_sink *s) {
|
||||||
pa_cvolume r;
|
pa_cvolume r;
|
||||||
char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
|
char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
|
||||||
bool deferred_volume = !!(s->flags & PA_SINK_DEFERRED_VOLUME);
|
bool deferred_volume = !!(s->flags & PA_SINK_DEFERRED_VOLUME);
|
||||||
|
bool write_to_hw = !deferred_volume;
|
||||||
|
|
||||||
pa_assert(u);
|
pa_assert(u);
|
||||||
pa_assert(u->mixer_path);
|
pa_assert(u->mixer_path);
|
||||||
|
|
@ -1502,7 +1503,14 @@ static void sink_set_volume_cb(pa_sink *s) {
|
||||||
/* Shift up by the base volume */
|
/* Shift up by the base volume */
|
||||||
pa_sw_cvolume_divide_scalar(&r, &s->real_volume, s->base_volume);
|
pa_sw_cvolume_divide_scalar(&r, &s->real_volume, s->base_volume);
|
||||||
|
|
||||||
if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r, deferred_volume, !deferred_volume) < 0)
|
/* If the set_volume() is called because of ucm active_port changing, the
|
||||||
|
* volume should be written to hw immediately, otherwise this volume will be
|
||||||
|
* overridden by calling get_volume_cb() which is called by
|
||||||
|
* _disdev/_enadev() -> io_mixer_callback() */
|
||||||
|
if (u->ucm_context && s->port_changing)
|
||||||
|
write_to_hw = true;
|
||||||
|
|
||||||
|
if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r, deferred_volume, write_to_hw) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Shift down by the base volume, so that 0dB becomes maximum volume */
|
/* Shift down by the base volume, so that 0dB becomes maximum volume */
|
||||||
|
|
@ -1825,6 +1833,9 @@ static int process_rewind(struct userdata *u) {
|
||||||
|
|
||||||
pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes);
|
pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes);
|
||||||
|
|
||||||
|
if (rewind_nbytes == 0)
|
||||||
|
goto rewind_done;
|
||||||
|
|
||||||
if (PA_UNLIKELY((unused = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
|
if (PA_UNLIKELY((unused = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
|
||||||
if ((err = try_recover(u, "snd_pcm_avail", (int) unused)) < 0) {
|
if ((err = try_recover(u, "snd_pcm_avail", (int) unused)) < 0) {
|
||||||
pa_log_warn("Trying to recover from underrun failed during rewind");
|
pa_log_warn("Trying to recover from underrun failed during rewind");
|
||||||
|
|
@ -1877,8 +1888,11 @@ static int process_rewind(struct userdata *u) {
|
||||||
u->after_rewind = true;
|
u->after_rewind = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else
|
} else {
|
||||||
pa_log_debug("Mhmm, actually there is nothing to rewind.");
|
pa_log_debug("Mhmm, actually there is nothing to rewind.");
|
||||||
|
if (u->use_tsched)
|
||||||
|
increase_watermark(u);
|
||||||
|
}
|
||||||
|
|
||||||
rewind_done:
|
rewind_done:
|
||||||
pa_sink_process_rewind(u->sink, 0);
|
pa_sink_process_rewind(u->sink, 0);
|
||||||
|
|
@ -2107,7 +2121,7 @@ static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char
|
||||||
u->mixers = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func,
|
u->mixers = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func,
|
||||||
NULL, (pa_free_cb_t) pa_alsa_mixer_free);
|
NULL, (pa_free_cb_t) pa_alsa_mixer_free);
|
||||||
|
|
||||||
mdev = pa_proplist_gets(mapping->proplist, "alsa.mixer_device");
|
mdev = mapping ? pa_proplist_gets(mapping->proplist, "alsa.mixer_device") : NULL;
|
||||||
if (mdev) {
|
if (mdev) {
|
||||||
u->mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, mdev, true);
|
u->mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, mdev, true);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -2267,7 +2281,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
|
||||||
bool volume_is_set;
|
bool volume_is_set;
|
||||||
bool mute_is_set;
|
bool mute_is_set;
|
||||||
pa_alsa_profile_set *profile_set = NULL;
|
pa_alsa_profile_set *profile_set = NULL;
|
||||||
void *state = NULL;
|
void *state;
|
||||||
|
|
||||||
pa_assert(m);
|
pa_assert(m);
|
||||||
pa_assert(ma);
|
pa_assert(ma);
|
||||||
|
|
@ -2563,6 +2577,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
|
||||||
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name);
|
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name);
|
||||||
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description);
|
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description);
|
||||||
|
|
||||||
|
state = NULL;
|
||||||
while ((key = pa_proplist_iterate(mapping->proplist, &state)))
|
while ((key = pa_proplist_iterate(mapping->proplist, &state)))
|
||||||
pa_proplist_sets(data.proplist, key, pa_proplist_gets(mapping->proplist, key));
|
pa_proplist_sets(data.proplist, key, pa_proplist_gets(mapping->proplist, key));
|
||||||
}
|
}
|
||||||
|
|
@ -2600,7 +2615,6 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
|
||||||
|
|
||||||
if (u->ucm_context) {
|
if (u->ucm_context) {
|
||||||
pa_device_port *port;
|
pa_device_port *port;
|
||||||
void *state;
|
|
||||||
unsigned h_prio = 0;
|
unsigned h_prio = 0;
|
||||||
PA_HASHMAP_FOREACH(port, u->sink->ports, state) {
|
PA_HASHMAP_FOREACH(port, u->sink->ports, state) {
|
||||||
if (!h_prio || port->priority > h_prio)
|
if (!h_prio || port->priority > h_prio)
|
||||||
|
|
|
||||||
|
|
@ -1365,6 +1365,7 @@ static void source_set_volume_cb(pa_source *s) {
|
||||||
pa_cvolume r;
|
pa_cvolume r;
|
||||||
char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
|
char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
|
||||||
bool deferred_volume = !!(s->flags & PA_SOURCE_DEFERRED_VOLUME);
|
bool deferred_volume = !!(s->flags & PA_SOURCE_DEFERRED_VOLUME);
|
||||||
|
bool write_to_hw = !deferred_volume;
|
||||||
|
|
||||||
pa_assert(u);
|
pa_assert(u);
|
||||||
pa_assert(u->mixer_path);
|
pa_assert(u->mixer_path);
|
||||||
|
|
@ -1373,7 +1374,14 @@ static void source_set_volume_cb(pa_source *s) {
|
||||||
/* Shift up by the base volume */
|
/* Shift up by the base volume */
|
||||||
pa_sw_cvolume_divide_scalar(&r, &s->real_volume, s->base_volume);
|
pa_sw_cvolume_divide_scalar(&r, &s->real_volume, s->base_volume);
|
||||||
|
|
||||||
if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r, deferred_volume, !deferred_volume) < 0)
|
/* If the set_volume() is called because of ucm active_port changing, the
|
||||||
|
* volume should be written to hw immediately, otherwise this volume will be
|
||||||
|
* overridden by calling get_volume_cb() which is called by
|
||||||
|
* _disdev/_enadev() -> io_mixer_callback() */
|
||||||
|
if (u->ucm_context && s->port_changing)
|
||||||
|
write_to_hw = true;
|
||||||
|
|
||||||
|
if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r, deferred_volume, write_to_hw) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Shift down by the base volume, so that 0dB becomes maximum volume */
|
/* Shift down by the base volume, so that 0dB becomes maximum volume */
|
||||||
|
|
@ -1813,7 +1821,7 @@ static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char
|
||||||
u->mixers = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func,
|
u->mixers = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func,
|
||||||
NULL, (pa_free_cb_t) pa_alsa_mixer_free);
|
NULL, (pa_free_cb_t) pa_alsa_mixer_free);
|
||||||
|
|
||||||
mdev = pa_proplist_gets(mapping->proplist, "alsa.mixer_device");
|
mdev = mapping ? pa_proplist_gets(mapping->proplist, "alsa.mixer_device") : NULL;
|
||||||
if (mdev) {
|
if (mdev) {
|
||||||
u->mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, mdev, false);
|
u->mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, mdev, false);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1972,7 +1980,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
|
||||||
bool volume_is_set;
|
bool volume_is_set;
|
||||||
bool mute_is_set;
|
bool mute_is_set;
|
||||||
pa_alsa_profile_set *profile_set = NULL;
|
pa_alsa_profile_set *profile_set = NULL;
|
||||||
void *state = NULL;
|
void *state;
|
||||||
|
|
||||||
pa_assert(m);
|
pa_assert(m);
|
||||||
pa_assert(ma);
|
pa_assert(ma);
|
||||||
|
|
@ -2250,6 +2258,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
|
||||||
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name);
|
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name);
|
||||||
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description);
|
pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description);
|
||||||
|
|
||||||
|
state = NULL;
|
||||||
while ((key = pa_proplist_iterate(mapping->proplist, &state)))
|
while ((key = pa_proplist_iterate(mapping->proplist, &state)))
|
||||||
pa_proplist_sets(data.proplist, key, pa_proplist_gets(mapping->proplist, key));
|
pa_proplist_sets(data.proplist, key, pa_proplist_gets(mapping->proplist, key));
|
||||||
}
|
}
|
||||||
|
|
@ -2286,7 +2295,6 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
|
||||||
|
|
||||||
if (u->ucm_context) {
|
if (u->ucm_context) {
|
||||||
pa_device_port *port;
|
pa_device_port *port;
|
||||||
void *state;
|
|
||||||
unsigned h_prio = 0;
|
unsigned h_prio = 0;
|
||||||
PA_HASHMAP_FOREACH(port, u->source->ports, state) {
|
PA_HASHMAP_FOREACH(port, u->source->ports, state) {
|
||||||
if (!h_prio || port->priority > h_prio)
|
if (!h_prio || port->priority > h_prio)
|
||||||
|
|
|
||||||
|
|
@ -691,7 +691,7 @@ static char *modifier_name_to_role(const char *mod_name, bool *is_sink) {
|
||||||
|
|
||||||
if (!sub || !*sub) {
|
if (!sub || !*sub) {
|
||||||
pa_xfree(sub);
|
pa_xfree(sub);
|
||||||
pa_log_warn("Can't match media roles for modifer %s", mod_name);
|
pa_log_warn("Can't match media roles for modifier %s", mod_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -757,13 +757,11 @@ static void append_lost_relationship(pa_alsa_ucm_device *dev) {
|
||||||
|
|
||||||
int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index) {
|
int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index) {
|
||||||
char *card_name;
|
char *card_name;
|
||||||
const char **verb_list;
|
const char **verb_list, *value;
|
||||||
int num_verbs, i, err = 0;
|
int num_verbs, i, err = 0;
|
||||||
|
|
||||||
/* support multiple card instances, address card directly by index */
|
/* support multiple card instances, address card directly by index */
|
||||||
card_name = pa_sprintf_malloc("hw:%i", card_index);
|
card_name = pa_sprintf_malloc("hw:%i", card_index);
|
||||||
if (card_name == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
err = snd_use_case_mgr_open(&ucm->ucm_mgr, card_name);
|
err = snd_use_case_mgr_open(&ucm->ucm_mgr, card_name);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
/* fallback longname: is UCM available for this card ? */
|
/* fallback longname: is UCM available for this card ? */
|
||||||
|
|
@ -771,22 +769,36 @@ int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index) {
|
||||||
err = snd_card_get_name(card_index, &card_name);
|
err = snd_card_get_name(card_index, &card_name);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
pa_log("Card can't get card_name from card_index %d", card_index);
|
pa_log("Card can't get card_name from card_index %d", card_index);
|
||||||
|
err = -PA_ALSA_ERR_UNSPECIFIED;
|
||||||
goto name_fail;
|
goto name_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = snd_use_case_mgr_open(&ucm->ucm_mgr, card_name);
|
err = snd_use_case_mgr_open(&ucm->ucm_mgr, card_name);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
pa_log_info("UCM not available for card %s", card_name);
|
pa_log_info("UCM not available for card %s", card_name);
|
||||||
|
err = -PA_ALSA_ERR_UCM_OPEN;
|
||||||
goto ucm_mgr_fail;
|
goto ucm_mgr_fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = snd_use_case_get(ucm->ucm_mgr, "=Linked", &value);
|
||||||
|
if (err >= 0) {
|
||||||
|
if (strcasecmp(value, "true") == 0 || strcasecmp(value, "1") == 0) {
|
||||||
|
free((void *)value);
|
||||||
|
pa_log_info("Empty (linked) UCM for card %s", card_name);
|
||||||
|
err = -PA_ALSA_ERR_UCM_LINKED;
|
||||||
|
goto ucm_verb_fail;
|
||||||
|
}
|
||||||
|
free((void *)value);
|
||||||
|
}
|
||||||
|
|
||||||
pa_log_info("UCM available for card %s", card_name);
|
pa_log_info("UCM available for card %s", card_name);
|
||||||
|
|
||||||
/* get a list of all UCM verbs (profiles) for this card */
|
/* get a list of all UCM verbs (profiles) for this card */
|
||||||
num_verbs = snd_use_case_verb_list(ucm->ucm_mgr, &verb_list);
|
num_verbs = snd_use_case_verb_list(ucm->ucm_mgr, &verb_list);
|
||||||
if (num_verbs < 0) {
|
if (num_verbs < 0) {
|
||||||
pa_log("UCM verb list not found for %s", card_name);
|
pa_log("UCM verb list not found for %s", card_name);
|
||||||
|
err = -PA_ALSA_ERR_UNSPECIFIED;
|
||||||
goto ucm_verb_fail;
|
goto ucm_verb_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -806,7 +818,7 @@ int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index) {
|
||||||
|
|
||||||
if (!ucm->verbs) {
|
if (!ucm->verbs) {
|
||||||
pa_log("No UCM verb is valid for %s", card_name);
|
pa_log("No UCM verb is valid for %s", card_name);
|
||||||
err = -1;
|
err = -PA_ALSA_ERR_UCM_NO_VERB;
|
||||||
}
|
}
|
||||||
|
|
||||||
snd_use_case_free_list(verb_list, num_verbs);
|
snd_use_case_free_list(verb_list, num_verbs);
|
||||||
|
|
@ -950,10 +962,10 @@ static void probe_volumes(pa_hashmap *hash, bool is_sink, snd_pcm_t *pcm_handle,
|
||||||
|
|
||||||
PA_HASHMAP_FOREACH_KV(profile, path, data->paths, state2) {
|
PA_HASHMAP_FOREACH_KV(profile, path, data->paths, state2) {
|
||||||
if (pa_alsa_path_probe(path, NULL, mixer_handle, ignore_dB) < 0) {
|
if (pa_alsa_path_probe(path, NULL, mixer_handle, ignore_dB) < 0) {
|
||||||
pa_log_warn("Could not probe path: %s, using s/w volume", data->path->name);
|
pa_log_warn("Could not probe path: %s, using s/w volume", path->name);
|
||||||
pa_hashmap_remove(data->paths, profile);
|
pa_hashmap_remove(data->paths, profile);
|
||||||
} else if (!path->has_volume) {
|
} else if (!path->has_volume) {
|
||||||
pa_log_warn("Path %s is not a volume control", data->path->name);
|
pa_log_warn("Path %s is not a volume control", path->name);
|
||||||
pa_hashmap_remove(data->paths, profile);
|
pa_hashmap_remove(data->paths, profile);
|
||||||
} else
|
} else
|
||||||
pa_log_debug("Set up h/w volume using '%s' for %s:%s", path->name, profile, port->name);
|
pa_log_debug("Set up h/w volume using '%s' for %s:%s", path->name, profile, port->name);
|
||||||
|
|
@ -1065,7 +1077,7 @@ static void ucm_add_port_combination(
|
||||||
pa_device_port_new_data_set_type(&port_data, type);
|
pa_device_port_new_data_set_type(&port_data, type);
|
||||||
pa_device_port_new_data_set_direction(&port_data, is_sink ? PA_DIRECTION_OUTPUT : PA_DIRECTION_INPUT);
|
pa_device_port_new_data_set_direction(&port_data, is_sink ? PA_DIRECTION_OUTPUT : PA_DIRECTION_INPUT);
|
||||||
if (jack)
|
if (jack)
|
||||||
pa_device_port_new_data_set_available_group(&port_data, jack->name);
|
pa_device_port_new_data_set_availability_group(&port_data, jack->name);
|
||||||
|
|
||||||
port = pa_device_port_new(core, &port_data, sizeof(pa_alsa_ucm_port_data));
|
port = pa_device_port_new(core, &port_data, sizeof(pa_alsa_ucm_port_data));
|
||||||
pa_device_port_new_data_done(&port_data);
|
pa_device_port_new_data_done(&port_data);
|
||||||
|
|
@ -1526,6 +1538,32 @@ static void alsa_mapping_add_ucm_modifier(pa_alsa_mapping *m, pa_alsa_ucm_modifi
|
||||||
pa_channel_map_init(&m->channel_map);
|
pa_channel_map_init(&m->channel_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pa_alsa_mapping* ucm_alsa_mapping_get(pa_alsa_ucm_config *ucm, pa_alsa_profile_set *ps, const char *verb_name, const char *device_str, bool is_sink) {
|
||||||
|
pa_alsa_mapping *m;
|
||||||
|
char *mapping_name;
|
||||||
|
size_t ucm_alibpref_len = 0;
|
||||||
|
const char *value;
|
||||||
|
|
||||||
|
/* find private alsa-lib's configuration device prefix */
|
||||||
|
if (snd_use_case_get(ucm->ucm_mgr, "_alibpref", &value) == 0) {
|
||||||
|
if (value[0] && pa_startswith(device_str, value))
|
||||||
|
ucm_alibpref_len = strlen(value);
|
||||||
|
|
||||||
|
free((void *)value);
|
||||||
|
}
|
||||||
|
|
||||||
|
mapping_name = pa_sprintf_malloc("Mapping %s: %s: %s", verb_name, device_str + ucm_alibpref_len, is_sink ? "sink" : "source");
|
||||||
|
|
||||||
|
m = pa_alsa_mapping_get(ps, mapping_name);
|
||||||
|
|
||||||
|
if (!m)
|
||||||
|
pa_log("No mapping for %s", mapping_name);
|
||||||
|
|
||||||
|
pa_xfree(mapping_name);
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
static int ucm_create_mapping_direction(
|
static int ucm_create_mapping_direction(
|
||||||
pa_alsa_ucm_config *ucm,
|
pa_alsa_ucm_config *ucm,
|
||||||
pa_alsa_profile_set *ps,
|
pa_alsa_profile_set *ps,
|
||||||
|
|
@ -1537,19 +1575,14 @@ static int ucm_create_mapping_direction(
|
||||||
bool is_sink) {
|
bool is_sink) {
|
||||||
|
|
||||||
pa_alsa_mapping *m;
|
pa_alsa_mapping *m;
|
||||||
char *mapping_name;
|
|
||||||
unsigned priority, rate, channels;
|
unsigned priority, rate, channels;
|
||||||
|
|
||||||
mapping_name = pa_sprintf_malloc("Mapping %s: %s: %s", verb_name, device_str, is_sink ? "sink" : "source");
|
m = ucm_alsa_mapping_get(ucm, ps, verb_name, device_str, is_sink);
|
||||||
|
|
||||||
m = pa_alsa_mapping_get(ps, mapping_name);
|
if (!m)
|
||||||
if (!m) {
|
|
||||||
pa_log("No mapping for %s", mapping_name);
|
|
||||||
pa_xfree(mapping_name);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
pa_log_debug("UCM mapping: %s dev %s", mapping_name, device_name);
|
pa_log_debug("UCM mapping: %s dev %s", m->name, device_name);
|
||||||
pa_xfree(mapping_name);
|
|
||||||
|
|
||||||
priority = is_sink ? device->playback_priority : device->capture_priority;
|
priority = is_sink ? device->playback_priority : device->capture_priority;
|
||||||
rate = is_sink ? device->playback_rate : device->capture_rate;
|
rate = is_sink ? device->playback_rate : device->capture_rate;
|
||||||
|
|
@ -1594,18 +1627,13 @@ static int ucm_create_mapping_for_modifier(
|
||||||
bool is_sink) {
|
bool is_sink) {
|
||||||
|
|
||||||
pa_alsa_mapping *m;
|
pa_alsa_mapping *m;
|
||||||
char *mapping_name;
|
|
||||||
|
|
||||||
mapping_name = pa_sprintf_malloc("Mapping %s: %s: %s", verb_name, device_str, is_sink ? "sink" : "source");
|
m = ucm_alsa_mapping_get(ucm, ps, verb_name, device_str, is_sink);
|
||||||
|
|
||||||
m = pa_alsa_mapping_get(ps, mapping_name);
|
if (!m)
|
||||||
if (!m) {
|
|
||||||
pa_log("no mapping for %s", mapping_name);
|
|
||||||
pa_xfree(mapping_name);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
pa_log_info("ucm mapping: %s modifier %s", mapping_name, mod_name);
|
pa_log_info("UCM mapping: %s modifier %s", m->name, mod_name);
|
||||||
pa_xfree(mapping_name);
|
|
||||||
|
|
||||||
if (!m->ucm_context.ucm_devices && !m->ucm_context.ucm_modifiers) { /* new mapping */
|
if (!m->ucm_context.ucm_devices && !m->ucm_context.ucm_modifiers) { /* new mapping */
|
||||||
m->ucm_context.ucm_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
|
m->ucm_context.ucm_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
|
||||||
|
|
@ -1707,7 +1735,7 @@ static pa_alsa_jack* ucm_get_jack(pa_alsa_ucm_config *ucm, pa_alsa_ucm_device *d
|
||||||
pa_log("[%s] No mixer device name for JackControl \"%s\"", device_name, jack_control);
|
pa_log("[%s] No mixer device name for JackControl \"%s\"", device_name, jack_control);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
j = pa_alsa_jack_new(NULL, mixer_device_name, name);
|
j = pa_alsa_jack_new(NULL, mixer_device_name, name, 0);
|
||||||
PA_LLIST_PREPEND(pa_alsa_jack, ucm->jacks, j);
|
PA_LLIST_PREPEND(pa_alsa_jack, ucm->jacks, j);
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
|
|
@ -1941,7 +1969,7 @@ static void ucm_mapping_jack_probe(pa_alsa_mapping *m, pa_hashmap *mixers) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
has_control = pa_alsa_mixer_find_card(mixer_handle, dev->jack->alsa_name, 0) != NULL;
|
has_control = pa_alsa_mixer_find_card(mixer_handle, &dev->jack->alsa_id, 0) != NULL;
|
||||||
pa_alsa_jack_set_has_control(dev->jack, has_control);
|
pa_alsa_jack_set_has_control(dev->jack, has_control);
|
||||||
pa_log_info("UCM jack %s has_control=%d", dev->jack->name, dev->jack->has_control);
|
pa_log_info("UCM jack %s has_control=%d", dev->jack->name, dev->jack->has_control);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -731,7 +731,7 @@ snd_pcm_t *pa_alsa_open_by_device_string(
|
||||||
if (!pa_startswith(d, "plug:") && !pa_startswith(d, "plughw:")) {
|
if (!pa_startswith(d, "plug:") && !pa_startswith(d, "plughw:")) {
|
||||||
char *t;
|
char *t;
|
||||||
|
|
||||||
t = pa_sprintf_malloc("plug:%s", d);
|
t = pa_sprintf_malloc("plug:SLAVE='%s'", d);
|
||||||
pa_xfree(d);
|
pa_xfree(d);
|
||||||
d = t;
|
d = t;
|
||||||
|
|
||||||
|
|
@ -1180,7 +1180,7 @@ snd_pcm_sframes_t pa_alsa_safe_avail(snd_pcm_t *pcm, size_t hwbuf_size, const pa
|
||||||
|
|
||||||
PA_ONCE_BEGIN {
|
PA_ONCE_BEGIN {
|
||||||
char *dn = pa_alsa_get_driver_name_by_pcm(pcm);
|
char *dn = pa_alsa_get_driver_name_by_pcm(pcm);
|
||||||
pa_log(ngettext("snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu ms).\n"
|
pa_log_debug(ngettext("snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu ms).\n"
|
||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
||||||
"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
|
"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
|
||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
||||||
|
|
@ -1189,7 +1189,7 @@ snd_pcm_sframes_t pa_alsa_safe_avail(snd_pcm_t *pcm, size_t hwbuf_size, const pa
|
||||||
(unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC),
|
(unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC),
|
||||||
pa_strnull(dn));
|
pa_strnull(dn));
|
||||||
pa_xfree(dn);
|
pa_xfree(dn);
|
||||||
pa_alsa_dump(PA_LOG_ERROR, pcm);
|
pa_alsa_dump(PA_LOG_DEBUG, pcm);
|
||||||
} PA_ONCE_END;
|
} PA_ONCE_END;
|
||||||
|
|
||||||
/* Mhmm, let's try not to fail completely */
|
/* Mhmm, let's try not to fail completely */
|
||||||
|
|
@ -1246,7 +1246,7 @@ int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_status_t *status, snd_pcm_sframes
|
||||||
|
|
||||||
PA_ONCE_BEGIN {
|
PA_ONCE_BEGIN {
|
||||||
char *dn = pa_alsa_get_driver_name_by_pcm(pcm);
|
char *dn = pa_alsa_get_driver_name_by_pcm(pcm);
|
||||||
pa_log(ngettext("snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s%lu ms).\n"
|
pa_log_debug(ngettext("snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s%lu ms).\n"
|
||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
|
"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
|
||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
||||||
|
|
@ -1256,7 +1256,7 @@ int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_status_t *status, snd_pcm_sframes
|
||||||
(unsigned long) (pa_bytes_to_usec(abs_k, ss) / PA_USEC_PER_MSEC),
|
(unsigned long) (pa_bytes_to_usec(abs_k, ss) / PA_USEC_PER_MSEC),
|
||||||
pa_strnull(dn));
|
pa_strnull(dn));
|
||||||
pa_xfree(dn);
|
pa_xfree(dn);
|
||||||
pa_alsa_dump(PA_LOG_ERROR, pcm);
|
pa_alsa_dump(PA_LOG_DEBUG, pcm);
|
||||||
} PA_ONCE_END;
|
} PA_ONCE_END;
|
||||||
|
|
||||||
/* Mhmm, let's try not to fail completely */
|
/* Mhmm, let's try not to fail completely */
|
||||||
|
|
@ -1274,7 +1274,7 @@ int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_status_t *status, snd_pcm_sframes
|
||||||
|
|
||||||
PA_ONCE_BEGIN {
|
PA_ONCE_BEGIN {
|
||||||
char *dn = pa_alsa_get_driver_name_by_pcm(pcm);
|
char *dn = pa_alsa_get_driver_name_by_pcm(pcm);
|
||||||
pa_log(ngettext("snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu ms).\n"
|
pa_log_debug(ngettext("snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu ms).\n"
|
||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
||||||
"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
|
"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
|
||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
||||||
|
|
@ -1283,7 +1283,7 @@ int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_status_t *status, snd_pcm_sframes
|
||||||
(unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC),
|
(unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC),
|
||||||
pa_strnull(dn));
|
pa_strnull(dn));
|
||||||
pa_xfree(dn);
|
pa_xfree(dn);
|
||||||
pa_alsa_dump(PA_LOG_ERROR, pcm);
|
pa_alsa_dump(PA_LOG_DEBUG, pcm);
|
||||||
} PA_ONCE_END;
|
} PA_ONCE_END;
|
||||||
|
|
||||||
/* Mhmm, let's try not to fail completely */
|
/* Mhmm, let's try not to fail completely */
|
||||||
|
|
@ -1336,7 +1336,7 @@ int pa_alsa_safe_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas
|
||||||
k >= pa_bytes_per_second(ss)*10))
|
k >= pa_bytes_per_second(ss)*10))
|
||||||
PA_ONCE_BEGIN {
|
PA_ONCE_BEGIN {
|
||||||
char *dn = pa_alsa_get_driver_name_by_pcm(pcm);
|
char *dn = pa_alsa_get_driver_name_by_pcm(pcm);
|
||||||
pa_log(ngettext("snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte (%lu ms).\n"
|
pa_log_debug(ngettext("snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte (%lu ms).\n"
|
||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
||||||
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
|
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
|
||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.",
|
||||||
|
|
@ -1345,7 +1345,7 @@ int pa_alsa_safe_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas
|
||||||
(unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC),
|
(unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC),
|
||||||
pa_strnull(dn));
|
pa_strnull(dn));
|
||||||
pa_xfree(dn);
|
pa_xfree(dn);
|
||||||
pa_alsa_dump(PA_LOG_ERROR, pcm);
|
pa_alsa_dump(PA_LOG_DEBUG, pcm);
|
||||||
} PA_ONCE_END;
|
} PA_ONCE_END;
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
|
|
@ -1635,8 +1635,8 @@ static snd_mixer_elem_t *pa_alsa_mixer_find(snd_mixer_t *mixer,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
snd_mixer_elem_t *pa_alsa_mixer_find_card(snd_mixer_t *mixer, const char *name, unsigned int device) {
|
snd_mixer_elem_t *pa_alsa_mixer_find_card(snd_mixer_t *mixer, struct pa_alsa_mixer_id *alsa_id, unsigned int device) {
|
||||||
return pa_alsa_mixer_find(mixer, SND_CTL_ELEM_IFACE_CARD, name, 0, device);
|
return pa_alsa_mixer_find(mixer, SND_CTL_ELEM_IFACE_CARD, alsa_id->name, alsa_id->index, device);
|
||||||
}
|
}
|
||||||
|
|
||||||
snd_mixer_elem_t *pa_alsa_mixer_find_pcm(snd_mixer_t *mixer, const char *name, unsigned int device) {
|
snd_mixer_elem_t *pa_alsa_mixer_find_pcm(snd_mixer_t *mixer, const char *name, unsigned int device) {
|
||||||
|
|
@ -1752,7 +1752,7 @@ snd_mixer_t *pa_alsa_open_mixer_by_name(pa_hashmap *mixers, const char *dev, boo
|
||||||
if (!pm && pa_strneq(dev, "hw:", 3)) {
|
if (!pm && pa_strneq(dev, "hw:", 3)) {
|
||||||
const char *s = dev + 3;
|
const char *s = dev + 3;
|
||||||
int card_index;
|
int card_index;
|
||||||
while (*s && *s >= 0 && *s <= '9') s++;
|
while (*s && *s >= '0' && *s <= '9') s++;
|
||||||
if (*s == '\0' && pa_atoi(dev + 3, &card_index) >= 0) {
|
if (*s == '\0' && pa_atoi(dev + 3, &card_index) >= 0) {
|
||||||
PA_HASHMAP_FOREACH_KV(dev2, pm, mixers, state) {
|
PA_HASHMAP_FOREACH_KV(dev2, pm, mixers, state) {
|
||||||
if (pm->card_index == card_index) {
|
if (pm->card_index == card_index) {
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,13 @@
|
||||||
|
|
||||||
#include "alsa-mixer.h"
|
#include "alsa-mixer.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PA_ALSA_ERR_UNSPECIFIED = 1,
|
||||||
|
PA_ALSA_ERR_UCM_OPEN = 1000,
|
||||||
|
PA_ALSA_ERR_UCM_NO_VERB = 1001,
|
||||||
|
PA_ALSA_ERR_UCM_LINKED = 1002
|
||||||
|
};
|
||||||
|
|
||||||
int pa_alsa_set_hw_params(
|
int pa_alsa_set_hw_params(
|
||||||
snd_pcm_t *pcm_handle,
|
snd_pcm_t *pcm_handle,
|
||||||
pa_sample_spec *ss, /* modified at return */
|
pa_sample_spec *ss, /* modified at return */
|
||||||
|
|
@ -141,7 +148,7 @@ const char* pa_alsa_strerror(int errnum);
|
||||||
|
|
||||||
bool pa_alsa_may_tsched(bool want);
|
bool pa_alsa_may_tsched(bool want);
|
||||||
|
|
||||||
snd_mixer_elem_t *pa_alsa_mixer_find_card(snd_mixer_t *mixer, const char *name, unsigned int device);
|
snd_mixer_elem_t *pa_alsa_mixer_find_card(snd_mixer_t *mixer, struct pa_alsa_mixer_id *alsa_id, unsigned int device);
|
||||||
snd_mixer_elem_t *pa_alsa_mixer_find_pcm(snd_mixer_t *mixer, const char *name, unsigned int device);
|
snd_mixer_elem_t *pa_alsa_mixer_find_pcm(snd_mixer_t *mixer, const char *name, unsigned int device);
|
||||||
|
|
||||||
snd_mixer_t *pa_alsa_open_mixer(pa_hashmap *mixers, int alsa_card_index, bool probe);
|
snd_mixer_t *pa_alsa_open_mixer(pa_hashmap *mixers, int alsa_card_index, bool probe);
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,9 @@ required-any = any
|
||||||
state.plugged = unknown
|
state.plugged = unknown
|
||||||
state.unplugged = unknown
|
state.unplugged = unknown
|
||||||
|
|
||||||
|
[Jack Line - Input]
|
||||||
|
required-any = any
|
||||||
|
|
||||||
[Element Capture]
|
[Element Capture]
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = merge
|
volume = merge
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,9 @@ required-any = any
|
||||||
state.plugged = unknown
|
state.plugged = unknown
|
||||||
state.unplugged = unknown
|
state.unplugged = unknown
|
||||||
|
|
||||||
|
[Jack Mic - Input]
|
||||||
|
required-any = any
|
||||||
|
|
||||||
[Element Capture]
|
[Element Capture]
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = merge
|
volume = merge
|
||||||
|
|
|
||||||
5
src/modules/alsa/mixer/paths/analog-output-chat.conf
Normal file
5
src/modules/alsa/mixer/paths/analog-output-chat.conf
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
; Some gaming devices have a separate "chat" device, this is for voice chat
|
||||||
|
; while playing games. This device is just a fairly standard analog mono
|
||||||
|
; device, but it's nicer to make it clear that this is the "chat" device
|
||||||
|
; as is mentioned in the marketing info and manual.
|
||||||
|
.include analog-output.conf.common
|
||||||
|
|
@ -13,17 +13,24 @@
|
||||||
# You should have received a copy of the GNU Lesser General Public License
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
; Path for mixers that have a 'Headphone2' control
|
; Path for the second headphone output on dual-headphone machines.
|
||||||
;
|
;
|
||||||
; See analog-output.conf.common for an explanation on the directives
|
; See analog-output.conf.common for an explanation on the directives
|
||||||
|
|
||||||
[General]
|
[General]
|
||||||
priority = 98
|
priority = 98
|
||||||
description-key = analog-output-headphones
|
|
||||||
|
|
||||||
[Properties]
|
[Properties]
|
||||||
device.icon_name = audio-headphones
|
device.icon_name = audio-headphones
|
||||||
|
|
||||||
|
; HP EliteDesk 800 SFF Headphone
|
||||||
|
[Jack Front Headphone,1]
|
||||||
|
required-any = any
|
||||||
|
|
||||||
|
; HP EliteDesk 800 DM Headphone
|
||||||
|
[Jack Front Headphone Surround]
|
||||||
|
required-any = any
|
||||||
|
|
||||||
[Element Hardware Master]
|
[Element Hardware Master]
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = merge
|
volume = merge
|
||||||
|
|
@ -47,6 +54,13 @@ volume = off
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = zero
|
volume = zero
|
||||||
|
|
||||||
|
[Element Headphone,1]
|
||||||
|
required-any = any
|
||||||
|
switch = mute
|
||||||
|
volume = merge
|
||||||
|
override-map.1 = all
|
||||||
|
override-map.2 = all-left,all-right
|
||||||
|
|
||||||
[Element Headphone+LO]
|
[Element Headphone+LO]
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = zero
|
volume = zero
|
||||||
|
|
@ -56,7 +70,7 @@ switch = off
|
||||||
volume = off
|
volume = off
|
||||||
|
|
||||||
[Element Headphone2]
|
[Element Headphone2]
|
||||||
required = any
|
required-any = any
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = merge
|
volume = merge
|
||||||
override-map.1 = all
|
override-map.1 = all
|
||||||
|
|
@ -70,9 +84,11 @@ volume = off
|
||||||
switch = off
|
switch = off
|
||||||
volume = off
|
volume = off
|
||||||
|
|
||||||
; On some machines Front is actually a part of the Headphone path
|
; On some machines, the Front Volume Control is shared by Headphone and Lineout,
|
||||||
|
; or Headphone and Speaker, but they have independent Volume Switch. Here only
|
||||||
|
; use switch to mute Lineout or Speaker.
|
||||||
[Element Front]
|
[Element Front]
|
||||||
switch = mute
|
switch = off
|
||||||
volume = zero
|
volume = zero
|
||||||
|
|
||||||
[Element Rear]
|
[Element Rear]
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,10 @@ state.unplugged = unknown
|
||||||
[Jack Front Headphone]
|
[Jack Front Headphone]
|
||||||
required-any = any
|
required-any = any
|
||||||
|
|
||||||
|
; HP EliteDesk 800 DM Headset
|
||||||
|
[Jack Front Headphone Front]
|
||||||
|
required-any = any
|
||||||
|
|
||||||
[Jack Front Headphone Phantom]
|
[Jack Front Headphone Phantom]
|
||||||
required-any = any
|
required-any = any
|
||||||
state.plugged = unknown
|
state.plugged = unknown
|
||||||
|
|
@ -52,6 +56,9 @@ state.unplugged = unknown
|
||||||
[Jack Headphone Mic]
|
[Jack Headphone Mic]
|
||||||
required-any = any
|
required-any = any
|
||||||
|
|
||||||
|
[Jack Headphone - Output]
|
||||||
|
required-any = any
|
||||||
|
|
||||||
[Element Hardware Master]
|
[Element Hardware Master]
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = merge
|
volume = merge
|
||||||
|
|
@ -86,6 +93,13 @@ volume = merge
|
||||||
override-map.1 = all
|
override-map.1 = all
|
||||||
override-map.2 = all-left,all-right
|
override-map.2 = all-left,all-right
|
||||||
|
|
||||||
|
; This path is intended to control the first headphones, not
|
||||||
|
; the second headphones. But it should not hurt if we leave the second
|
||||||
|
; headphone jack enabled nonetheless.
|
||||||
|
[Element Headphone,1]
|
||||||
|
switch = mute
|
||||||
|
volume = zero
|
||||||
|
|
||||||
[Element Headset]
|
[Element Headset]
|
||||||
required-any = any
|
required-any = any
|
||||||
switch = mute
|
switch = mute
|
||||||
|
|
@ -112,9 +126,11 @@ volume = off
|
||||||
switch = off
|
switch = off
|
||||||
volume = off
|
volume = off
|
||||||
|
|
||||||
; On some machines Front is actually a part of the Headphone path
|
; On some machines, the Front Volume Control is shared by Headphone and Lineout,
|
||||||
|
; or Headphone and Speaker, but they have independent Volume Switch. Here only
|
||||||
|
; use switch to mute Lineout or Speaker.
|
||||||
[Element Front]
|
[Element Front]
|
||||||
switch = mute
|
switch = off
|
||||||
volume = zero
|
volume = zero
|
||||||
|
|
||||||
[Element Rear]
|
[Element Rear]
|
||||||
|
|
@ -157,4 +173,8 @@ volume = off
|
||||||
switch = off
|
switch = off
|
||||||
volume = off
|
volume = off
|
||||||
|
|
||||||
|
[Element Speaker Center/LFE]
|
||||||
|
switch = off
|
||||||
|
volume = off
|
||||||
|
|
||||||
.include analog-output.conf.common
|
.include analog-output.conf.common
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,10 @@ required-any = any
|
||||||
switch = off
|
switch = off
|
||||||
volume = off
|
volume = off
|
||||||
|
|
||||||
|
[Element Headphone,1]
|
||||||
|
switch = off
|
||||||
|
volume = off
|
||||||
|
|
||||||
[Element Headphone2]
|
[Element Headphone2]
|
||||||
switch = off
|
switch = off
|
||||||
volume = off
|
volume = off
|
||||||
|
|
@ -181,6 +185,12 @@ volume = merge
|
||||||
override-map.1 = all-center
|
override-map.1 = all-center
|
||||||
override-map.2 = all-center,lfe
|
override-map.2 = all-center,lfe
|
||||||
|
|
||||||
|
[Element Center/LFE]
|
||||||
|
switch = mute
|
||||||
|
volume = merge
|
||||||
|
override-map.1 = all-center
|
||||||
|
override-map.2 = all-center,lfe
|
||||||
|
|
||||||
[Element Bass Speaker]
|
[Element Bass Speaker]
|
||||||
switch = off
|
switch = off
|
||||||
volume = off
|
volume = off
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,10 @@ override-map.2 = all-left,all-right
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = zero
|
volume = zero
|
||||||
|
|
||||||
|
[Element Headphone,1]
|
||||||
|
switch = mute
|
||||||
|
volume = zero
|
||||||
|
|
||||||
[Element Headphone+LO]
|
[Element Headphone+LO]
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = zero
|
volume = zero
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,10 @@ volume = off
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = zero
|
volume = zero
|
||||||
|
|
||||||
|
[Element Headphone,1]
|
||||||
|
switch = mute
|
||||||
|
volume = zero
|
||||||
|
|
||||||
[Element Headphone2]
|
[Element Headphone2]
|
||||||
switch = mute
|
switch = mute
|
||||||
volume = zero
|
volume = zero
|
||||||
|
|
@ -174,4 +178,10 @@ volume = merge
|
||||||
override-map.1 = all-center
|
override-map.1 = all-center
|
||||||
override-map.2 = all-center,lfe
|
override-map.2 = all-center,lfe
|
||||||
|
|
||||||
|
[Element Center/LFE]
|
||||||
|
switch = mute
|
||||||
|
volume = merge
|
||||||
|
override-map.1 = all-center
|
||||||
|
override-map.2 = all-center,lfe
|
||||||
|
|
||||||
.include analog-output.conf.common
|
.include analog-output.conf.common
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue