update upstream-2021-08-15

This commit is contained in:
Chengyi Zhao 2021-08-15 02:35:23 +08:00
parent c8653c13fa
commit 1703683def
297 changed files with 91782 additions and 54869 deletions

67
CONTRIBUTING.md Normal file
View 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
View file

@ -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
Changes at a glance:

View file

@ -429,7 +429,28 @@ Added two values to the pa_encoding_t enum:
## 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
## module-tunnel depends on the sink/source/sink-input/source-input protocol

13
README
View file

@ -19,7 +19,7 @@ TRAC/BUGZILLA TICKET CHANGES MAILING LIST:
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-bugs
IRC:
#pulseaudio on irc.freenode.org
https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Community/#ircandmatrix
FRESHMEAT:
http://freshmeat.net/projects/pulseaudio/
@ -31,13 +31,10 @@ AUTHORS:
Several
HACKING:
In order to run pulseaudio from the build dir __OPTIMIZE__ should be
disabled (look at src/pulsecore/core-util.h::pa_run_from_build_tree()),
this can be done by passing "CFLAGS=-O0" to the configure script:
./autogen.sh
CFLAGS="-ggdb3 -O0" LDFLAGS="-ggdb3" ./configure
make
./src/pulseaudio -n -F src/default.pa -p $(pwd)/src/
In order to run pulseaudio from the build dir:
meson build
meson compile -C build
build/src/daemon/pulseaudio -n -F build/src/daemon/default.pa -p $(pwd)/build/src/modules/
SPELLING:
PulseAudio

49
doc/messaging_api.txt Normal file
View 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"

View file

@ -52,7 +52,7 @@ PROJECT_LOGO =
# 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.
OUTPUT_DIRECTORY =
OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@
# 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
@ -668,37 +668,37 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = @srcdir@/../src/pulse/channelmap.h \
@srcdir@/../src/pulse/context.h \
@srcdir@/../src/pulse/def.h \
@srcdir@/../src/pulse/direction.h \
@srcdir@/../src/pulse/error.h \
@srcdir@/../src/pulse/ext-stream-restore.h \
@srcdir@/../src/pulse/ext-device-manager.h \
@srcdir@/../src/pulse/ext-device-restore.h \
@srcdir@/../src/pulse/format.h \
@srcdir@/../src/pulse/gccmacro.h \
@srcdir@/../src/pulse/glib-mainloop.h \
@srcdir@/../src/pulse/introspect.h \
@srcdir@/../src/pulse/mainloop-api.h \
@srcdir@/../src/pulse/mainloop-signal.h \
@srcdir@/../src/pulse/mainloop.h \
@srcdir@/../src/pulse/operation.h \
@srcdir@/../src/pulse/proplist.h \
@srcdir@/../src/pulse/pulseaudio.h \
@srcdir@/../src/pulse/rtclock.h \
@srcdir@/../src/pulse/sample.h \
@srcdir@/../src/pulse/scache.h \
@srcdir@/../src/pulse/simple.h \
@srcdir@/../src/pulse/stream.h \
@srcdir@/../src/pulse/subscribe.h \
@srcdir@/../src/pulse/thread-mainloop.h \
@srcdir@/../src/pulse/timeval.h \
@srcdir@/../src/pulse/utf8.h \
@srcdir@/../src/pulse/util.h \
@srcdir@/../src/pulse/version.h \
@srcdir@/../src/pulse/volume.h \
@srcdir@/../src/pulse/xmalloc.h
INPUT = @top_srcdir@/src/pulse/channelmap.h \
@top_srcdir@/src/pulse/context.h \
@top_srcdir@/src/pulse/def.h \
@top_srcdir@/src/pulse/direction.h \
@top_srcdir@/src/pulse/error.h \
@top_srcdir@/src/pulse/ext-stream-restore.h \
@top_srcdir@/src/pulse/ext-device-manager.h \
@top_srcdir@/src/pulse/ext-device-restore.h \
@top_srcdir@/src/pulse/format.h \
@top_srcdir@/src/pulse/gccmacro.h \
@top_srcdir@/src/pulse/glib-mainloop.h \
@top_srcdir@/src/pulse/introspect.h \
@top_srcdir@/src/pulse/mainloop-api.h \
@top_srcdir@/src/pulse/mainloop-signal.h \
@top_srcdir@/src/pulse/mainloop.h \
@top_srcdir@/src/pulse/operation.h \
@top_srcdir@/src/pulse/proplist.h \
@top_srcdir@/src/pulse/pulseaudio.h \
@top_srcdir@/src/pulse/rtclock.h \
@top_srcdir@/src/pulse/sample.h \
@top_srcdir@/src/pulse/scache.h \
@top_srcdir@/src/pulse/simple.h \
@top_srcdir@/src/pulse/stream.h \
@top_srcdir@/src/pulse/subscribe.h \
@top_srcdir@/src/pulse/thread-mainloop.h \
@top_srcdir@/src/pulse/timeval.h \
@top_srcdir@/src/pulse/utf8.h \
@top_srcdir@/src/pulse/util.h \
@top_srcdir@/src/pulse/version.h \
@top_srcdir@/src/pulse/volume.h \
@top_srcdir@/src/pulse/xmalloc.h
# 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
@ -758,8 +758,8 @@ EXCLUDE_SYMBOLS =
# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH = @srcdir@/../src/utils \
@srcdir@/../src/tests
EXAMPLE_PATH = @top_srcdir@/src/utils \
@top_srcdir@/src/tests
# 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

10
doxygen/meson.build Normal file
View 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])

View file

@ -1,19 +1,36 @@
# man page name, section, [aliases]
manpages = [
manpages = []
if get_option('daemon')
manpages += [
['default.pa', '5'],
['pacat', '1', ['paplay', 'parec', 'parecord', 'pamon']],
['pacmd', '1'],
['pactl', '1'],
['padsp', '1'],
['pasuspender', '1'],
['pax11publish', '1'],
['pulse-cli-syntax', '5'],
['pulse-client.conf', '5'],
['pulse-daemon.conf', '5'],
['pulseaudio', '1'],
['start-pulseaudio-x11', '1'],
]
endif
manpages += [
['pacat', '1', ['paplay', 'parec', 'parecord', 'pamon']],
['pactl', '1'],
['pulse-client.conf', '5'],
]
if cdata.has('HAVE_OSS_WRAPPER')
manpages += [
['padsp', '1'],
]
endif
if x11_dep.found()
manpages += [
['pax11publish', '1'],
]
endif
# FIXME: Add esdcompat if HAVE_ESOUND
#manpages += ['esdcompat', '1'],

View file

@ -202,7 +202,7 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<option>
<p><opt>--process-time-msec</opt><arg>=MSEC</arg></p>
<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>,
but not both.</p></optdesc>
</option>

View file

@ -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>
</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>
<p><opt>-n | --client-name</opt><arg>=NAME</arg></p>
@ -80,8 +86,8 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<option>
<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:
modules, sinks, sources, sink-inputs, source-outputs, clients, samples, cards. If not specified, all info is listed. If
short is given, output is in a tabular format, for easy parsing by scripts.</p></optdesc>
modules, sinks, sources, sink-inputs, source-outputs, clients, samples, cards, message-handlers. If not specified, all info is listed
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>
@ -135,7 +141,7 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<option>
<p><opt>suspend-sink</opt> <arg>SINK</arg> <arg>true|false</arg></p>
<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
a sink will pause all playback. Depending on the module implementing
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>
<p><opt>suspend-source</opt> <arg>SOURCE</arg> <arg>true|false</arg></p>
<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
a source will pause all capturing. Depending on the module implementing
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>
</option>
<option>
<p><opt>get-default-sink</opt></p>
<optdesc><p>Returns the symbolic name of the default sink.</p></optdesc>
</option>
<option>
<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>
@ -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>
</option>
<option>
<p><opt>get-default-source</opt></p>
<optdesc><p>Returns the symbolic name of the default source.</p></optdesc>
</option>
<option>
<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>
@ -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>
</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>
<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).
@ -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>
</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>
<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).
@ -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>
</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>
<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>
</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>
<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>
@ -253,6 +290,13 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
for possible encodings. </p></optdesc>
</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>
<p><opt>subscribe</opt></p>
<optdesc><p>Subscribe to events, pactl does not exit by itself, but keeps waiting for new events.</p></optdesc>

View file

@ -306,6 +306,13 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<optdesc><p>Debug: Show shared properties.</p></optdesc>
</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>
<p><opt>exit</opt></p>
<optdesc><p>Terminate the daemon. If you want to terminate a CLI

View file

@ -77,8 +77,17 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
</option>
<option>
<p><opt>autospawn=</opt> Autospawn a PulseAudio daemon when
needed. Takes a boolean value, defaults to <opt>yes</opt>.</p>
<p><opt>autospawn=</opt> Autospawn a PulseAudio daemon when needed. Takes
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>

View file

@ -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
will terminate immediately on logout. A positive value therefore has
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>
<p>When PulseAudio runs in the system mode, automatic exit is always

View file

@ -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
will terminate immediately on logout. A positive value therefore has
effect only in environments where there's no support for login session
tracking. A negative value can still be used to disable any automatic
exit.</p>
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>
<p>When PulseAudio runs in the system mode, automatic exit is always
disabled, so this option does nothing.</p>

View file

@ -4,6 +4,8 @@ project('pulseaudio', 'c', 'cpp',
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()
# 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
@ -19,11 +21,11 @@ endif
pa_version_major_minor = pa_version_major + '.' + pa_version_minor
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
# 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
# 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
# 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_info[0] - libpulse_version_info[2],
@ -66,7 +68,16 @@ localedir = join_paths(prefix, get_option('localedir'))
localstatedir = join_paths(prefix, get_option('localstatedir'))
sysconfdir = join_paths(prefix, get_option('sysconfdir'))
privlibdir = join_paths(libdir, 'pulseaudio')
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')
pulselibexecdir = join_paths(libexecdir, 'pulse')
@ -121,7 +132,6 @@ cdata = configuration_data()
cdata.set_quoted('PACKAGE', 'pulseaudio')
cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
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_MINOR', pa_version_minor)
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_SOEXT', '.so')
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_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', '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('GETTEXT_PACKAGE', 'pulseaudio')
cdata.set('ENABLE_NLS', 1)
cdata.set('top_srcdir', meson.source_root())
# Platform specifics
# First some defaults to keep config file generation happy
cdata.set('HAVE_COREAUDIO', 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,
# rather than ending up in the config.h file?
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
elif host_machine.system() == 'windows'
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('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'
# # Apparently meson has no solaris support?
# # Needed to get declarations for msg_control and msg_controllen on Solaris
@ -180,7 +216,6 @@ endif
check_headers = [
'arpa/inet.h',
'byteswap.h',
'cpuid.h',
'dlfcn.h',
'execinfo.h',
'grp.h',
@ -215,7 +250,6 @@ check_headers = [
'sys/un.h',
'sys/wait.h',
'syslog.h',
'valgrind/memcheck.h',
'xlocale.h',
]
@ -226,15 +260,34 @@ foreach h : check_headers
endif
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
if host_machine.system() != 'windows'
if cc.has_header('pthread.h')
cdata.set('HAVE_PTHREAD', 1)
endif
endif
if cc.has_header_symbol('pthread.h', 'PTHREAD_PRIO_INHERIT')
cdata.set('HAVE_PTHREAD_PRIO_INHERIT', 1)
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
check_functions = [
@ -288,19 +341,33 @@ check_functions = [
foreach f : check_functions
if cc.has_function(f)
define = 'HAVE_' + f.underscorify().to_upper()
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
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)
endif
if cc.has_function('dgettext')
if host_machine.system() != 'windows'
libintl_dep = []
else
libintl_dep = cc.find_library('intl')
endif
else
libintl_dep = cc.find_library('intl')
endif
# Symbols
@ -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,
# 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.
# Windows doesn't support this flag.
if host_machine.system() != 'windows'
nodelete_link_args = ['-Wl,-z,nodelete']
else
nodelete_link_args = []
endif
# Code coverage
@ -376,12 +448,12 @@ endforeach
cap_dep = cc.find_library('cap', 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)
endif
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)
endif
@ -389,6 +461,8 @@ have_iconv = false
if cc.has_function('iconv_open')
iconv_dep = dependency('', required : false)
have_iconv = true
# tell the libiconv header to pretend to be libc iconv
cdata.set('LIBICONV_PLUG', 1)
else
iconv_dep = cc.find_library('iconv', required : false)
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
# Used for backtraces on BSD
execinfo_dep = cc.find_library('execinfo', required : false)
# Atomic operations
if get_option('atomic-arm-memory-barrier')
@ -500,8 +577,11 @@ if host_machine.cpu_family() == 'arm'
endif
# NEON checks are automatically done by the unstable-simd module
if get_option('daemon')
# FIXME: make sure it's >= 2.2
ltdl_dep = cc.find_library('ltdl', required : true)
endif
# FIXME: can meson support libtool -dlopen/-dlpreopen things?
# and do we still want to support this at all?
cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
@ -546,12 +626,15 @@ if dbus_dep.found()
cdata.set('HAVE_DBUS', 1)
endif
gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
if gio_dep.found()
gio_dep = dependency('gio-2.0', version : '>= 2.26.0')
if get_option('gsettings').enabled()
assert(gio_dep.found(), 'GSettings support needs glib I/O library (GIO)')
cdata.set('HAVE_GSETTINGS', 1)
else
cdata.set('HAVE_GSETTINGS', 0)
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()
cdata.set('HAVE_GLIB', 1)
endif
@ -597,18 +680,30 @@ if systemd_dep.found() and systemduserunitdir == ''
systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
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'))
if x11_dep.found()
xcb_dep = dependency('xcb', required : true, version : '>= 1.6')
ice_dep = dependency('ice', required : true)
sm_dep = dependency('sm', required : true)
xtst_dep = dependency('xtst', required : true)
ice_dep = dependency('ice', required : get_option('daemon'))
sm_dep = dependency('sm', required : get_option('daemon'))
xtst_dep = dependency('xtst', required : get_option('daemon'))
cdata.set('HAVE_X11', 1)
if cc.has_function('XSetIOErrorExitHandler', dependencies: x11_dep)
cdata.set('HAVE_XSETIOERROREXITHANDLER', 1)
endif
endif
# Module dependencies
if cc.has_header('sys/soundcard.h')
if cc.has_header('sys/soundcard.h', required: get_option('oss-output'))
cdata.set('HAVE_OSS_OUTPUT', 1)
cdata.set('HAVE_OSS_WRAPPER', 1)
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)
if avahi_dep.found()
cdata.set('HAVE_AVAHI', 1)
else
cdata.set('HAVE_AVAHI', 0)
endif
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(sbc_dep.found(), 'BlueZ requires SBC support')
cdata.set('HAVE_SBC', 1)
@ -673,15 +773,25 @@ if webrtc_dep.found()
cdata.set('HAVE_WEBRTC', 1)
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'))
gstrtp_dep = dependency('gstreamer-rtp-1.0', required : get_option('gstreamer'))
have_gstreamer = false
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
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
cdata.set('PA_LIBDIR', libdir)
cdata.set('PA_INCDIR', includedir)
@ -695,6 +805,9 @@ check_dep = dependency('check', version : '>= 0.9.10', required : get_option('te
# Subdirs
if get_option('doxygen')
subdir('doxygen')
endif
subdir('po')
if get_option('man')
subdir('man')
@ -788,6 +901,7 @@ summary = [
'sysconfdir: @0@'.format(sysconfdir),
'localstatedir: @0@'.format(localstatedir),
'modlibexecdir: @0@'.format(modlibexecdir),
'alsadatadir: @0@'.format(alsadatadir),
'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 Config Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
@ -797,18 +911,20 @@ summary = [
# 'CFLAGS: @0@'.format(${CFLAGS}),
# 'CPPFLAGS: @0@'.format(${CPPFLAGS}),
# 'LIBS: @0@'.format(${LIBS}),
'',
'Enable pulseaudio daemon: @0@'.format(get_option('daemon')),
'',
'Enable memfd shared memory: @0@'.format(cdata.has('HAVE_MEMFD')),
'Enable X11: @0@'.format(x11_dep.found()),
# 'Enable OSS Output: @0@'.format(${ENABLE_OSS_OUTPUT}),
# 'Enable OSS Wrapper: @0@'.format(${ENABLE_OSS_WRAPPER}),
' Safe X11 I/O errors: @0@'.format(cdata.has('HAVE_XSETIOERROREXITHANDLER')),
'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 Alsa: @0@'.format(alsa_dep.found()),
# 'Enable CoreAudio: @0@'.format(${ENABLE_COREAUDIO}),
# 'Enable Solaris: @0@'.format(${ENABLE_SOLARIS}),
# 'Enable WaveOut: @0@'.format(${ENABLE_WAVEOUT}),
'Enable GLib 2: @0@'.format(glib_dep.found()),
# 'Enable GConf: @0@'.format(${ENABLE_GCONF}),
'Enable GSettings: @0@'.format(gio_dep.found()),
'Enable Gtk+ 3: @0@'.format(gtk_dep.found()),
'Enable Avahi: @0@'.format(avahi_dep.found()),
@ -816,13 +932,15 @@ summary = [
'Enable Async DNS: @0@'.format(asyncns_dep.found()),
'Enable LIRC: @0@'.format(lirc_dep.found()),
'Enable D-Bus: @0@'.format(dbus_dep.found()),
' Enable BlueZ 5: @0@'.format(get_option('bluez5')),
' Enable native headsets: @0@'.format(get_option('bluez5-native-headset')),
' Enable ofono headsets: @0@'.format(get_option('bluez5-ofono-headset')),
' Enable BlueZ 5: @0@'.format(cdata.has('HAVE_BLUEZ_5')),
' Enable native headsets: @0@'.format(cdata.has('HAVE_BLUEZ_5_NATIVE_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 HAL->udev compat: @0@'.format(get_option('hal-compat')),
'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 IPv6: @0@'.format(get_option('ipv6')),
'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
@ -834,6 +952,7 @@ summary = [
'Enable SoXR (resampler): @0@'.format(soxr_dep.found()),
'Enable WebRTC echo canceller: @0@'.format(webrtc_dep.found()),
'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 unit tests: @0@'.format(get_option('tests')),
'',
@ -874,7 +993,7 @@ if host_machine.system() != 'windows'
]
warning('\n' + '\n'.join(message))
endif
if not udev_dep.found()
if host_machine.system() == 'linux' and not udev_dep.found()
message = [
'You do not have udev support enabled. It is strongly recommended',
'that you enable udev support if your platform supports it as it is',

View file

@ -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',
type : 'boolean', value : false,
description : 'Enable optional gcov coverage analysis')
@ -51,6 +57,9 @@ option('pulsedsp-location',
option('modlibexecdir',
type : 'string',
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',
type : 'string',
description : 'Directory for systemd user service files')
@ -76,8 +85,11 @@ option('avahi',
type : 'feature', value : 'auto',
description : 'Optional Avahi support')
option('bluez5',
type : 'boolean', value : 'true',
type : 'feature', value : 'auto',
description : 'Optional BlueZ 5 support')
option('bluez5-gstreamer',
type : 'feature', value: 'auto',
description : 'Optional BlueZ 5 GStreamer support')
option('bluez5-native-headset',
type : 'boolean',
description : 'Optional native headset backend support (BlueZ 5)')
@ -87,6 +99,9 @@ option('bluez5-ofono-headset',
option('dbus',
type : 'feature', value : 'auto',
description : 'Optional D-Bus support')
option('elogind',
type : 'feature', value : 'auto',
description : 'Optional elogind support')
option('fftw',
type : 'feature', value : 'auto',
description : 'Optional FFTW support')
@ -97,7 +112,7 @@ option('gsettings',
type : 'feature', value : 'auto',
description : 'Optional GSettings support')
option('gstreamer',
type : 'feature', value : 'auto',
type : 'feature', value : 'disabled',
description : 'Optional GStreamer dependency for media-related functionality')
option('gtk',
type : 'feature', value : 'auto',
@ -120,6 +135,9 @@ option('openssl',
option('orc',
type : 'feature', value : 'auto',
description : 'Optimized Inner Loop Runtime Compiler')
option('oss-output',
type : 'feature', value : 'auto',
description : 'Optional OSS output support')
option('samplerate',
type : 'feature', value : 'disabled',
description : 'Optional libsamplerate support (DEPRECATED)')
@ -132,9 +150,15 @@ option('speex',
option('systemd',
type : 'feature', value : 'auto',
description : 'Optional systemd support')
option('tcpwrap',
type : 'feature', value : 'auto',
description : 'Optional TCP wrappers support')
option('udev',
type : 'feature', value : 'auto',
description : 'Optional udev support')
option('valgrind',
type : 'feature', value : 'auto',
description : 'Optional Valgrind support')
option('x11',
type : 'feature', value : 'auto',
description : 'Optional X11 support')

View file

@ -46,3 +46,5 @@ tr
uk
zh_CN
zh_TW
eo
si

View file

@ -7,6 +7,7 @@ src/daemon/ltdl-bind-now.c
src/daemon/main.c
src/daemon/pulseaudio.desktop.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-sink.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/bluetooth/module-bluez5-device.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-source.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.h
src/pulsecore/dbus-util.c
src/pulsecore/dllmain.c
src/pulsecore/dynarray.c
src/pulsecore/fdsem.c
src/pulsecore/ffmpeg/resample2.c

932
po/af.po

File diff suppressed because it is too large Load diff

3790
po/as.po

File diff suppressed because it is too large Load diff

1790
po/be.po

File diff suppressed because it is too large Load diff

1946
po/bg.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

4683
po/ca.po

File diff suppressed because it is too large Load diff

1104
po/cs.po

File diff suppressed because it is too large Load diff

955
po/da.po

File diff suppressed because it is too large Load diff

1676
po/de.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

2293
po/el.po

File diff suppressed because it is too large Load diff

2957
po/eo.po Normal file

File diff suppressed because it is too large Load diff

2421
po/es.po

File diff suppressed because it is too large Load diff

3994
po/fi.po

File diff suppressed because it is too large Load diff

2567
po/fr.po

File diff suppressed because it is too large Load diff

1411
po/gl.po

File diff suppressed because it is too large Load diff

3801
po/gu.po

File diff suppressed because it is too large Load diff

3206
po/he.po

File diff suppressed because it is too large Load diff

3794
po/hi.po

File diff suppressed because it is too large Load diff

1420
po/hr.po

File diff suppressed because it is too large Load diff

1679
po/hu.po

File diff suppressed because it is too large Load diff

1582
po/id.po

File diff suppressed because it is too large Load diff

893
po/it.po

File diff suppressed because it is too large Load diff

2547
po/ja.po

File diff suppressed because it is too large Load diff

798
po/kk.po

File diff suppressed because it is too large Load diff

3813
po/kn.po

File diff suppressed because it is too large Load diff

4722
po/ko.po

File diff suppressed because it is too large Load diff

896
po/lt.po

File diff suppressed because it is too large Load diff

3781
po/ml.po

File diff suppressed because it is too large Load diff

3784
po/mr.po

File diff suppressed because it is too large Load diff

4327
po/nl.po

File diff suppressed because it is too large Load diff

2610
po/nn.po

File diff suppressed because it is too large Load diff

1711
po/oc.po

File diff suppressed because it is too large Load diff

3798
po/or.po

File diff suppressed because it is too large Load diff

3778
po/pa.po

File diff suppressed because it is too large Load diff

900
po/pl.po

File diff suppressed because it is too large Load diff

4234
po/pt.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

975
po/ru.po

File diff suppressed because it is too large Load diff

2951
po/si.po Normal file

File diff suppressed because it is too large Load diff

1725
po/sk.po

File diff suppressed because it is too large Load diff

3836
po/sr.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

1136
po/sv.po

File diff suppressed because it is too large Load diff

3805
po/ta.po

File diff suppressed because it is too large Load diff

3771
po/te.po

File diff suppressed because it is too large Load diff

1971
po/tr.po

File diff suppressed because it is too large Load diff

922
po/uk.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

23
scripts/generate-map-file.sh Executable file
View 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}

View 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"

View file

@ -1,13 +1,20 @@
if bashcompletiondir != 'no'
aliases = [
'pacat',
aliases = []
if get_option('daemon')
aliases += [
'pacmd',
'pasuspender',
]
endif
aliases += [
'pacat',
'pactl',
'padsp',
'paplay',
'parec',
'parecord',
'pasuspender',
]
install_data('pulseaudio', install_dir : bashcompletiondir)

View file

@ -113,7 +113,7 @@ _pactl() {
local comps
local flags='-h --help --version -s --server= --client-name='
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
load-module unload-module move-sink-input move-source-output
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-sink-mute set-source-mute set-sink-input-mute
set-source-output-mute set-sink-formats set-port-latency-offset
subscribe help)
subscribe send-message help)
_init_completion -n = || return
preprev=${words[$cword-2]}
@ -271,7 +271,7 @@ _pacmd() {
move-sink-input move-source-output suspend-sink suspend-source
suspend set-card-profile set-sink-port set-source-port
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
preprev=${words[$cword-2]}

View file

@ -34,6 +34,7 @@ _devices() {
case $words[$((CURRENT - 2))] in
move-sink-input) cmd=('sinks');;
move-source-output) cmd=('sources');;
play-sample) cmd=('sinks');;
esac
elif [[ $service == (pacat|paplay|parec|parecord) ]]; then
@ -147,7 +148,7 @@ _ports() {
if [[ $line != [[:blank:]] &&
$line != (*Part?of*|*Properties:*|*device.icon_name*) ]]; then
_port_name=${line%%: *}
_port_name=${_port_name//[[:blank:]]/}
_port_name=${_port_name##[[:blank:]]#}
_port_description=${line#*: }
_port_list+=($_port_name:$_port_description)
fi
@ -158,6 +159,13 @@ _ports() {
_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(){
local -a _card_list
local _card _cad_name
@ -263,6 +271,7 @@ _pactl_completion() {
'set-sink-input-mute: mute a stream'
'set-source-output-mute: mute a recording stream'
'set-sink-formats: set supported formats of a sink'
'send-message: send a message to a pulseaudio object'
'subscribe: subscribe to events'
)
@ -284,6 +293,7 @@ _pactl_completion() {
'clients: list connected clients'
'samples: list samples'
'cards: list available cards'
'message-handlers: list available message-handlers'
)
if ((CURRENT == 2)); then
@ -304,10 +314,10 @@ _pactl_completion() {
_play_sample_parameter() {
if ((CURRENT == 2)); then
# We're completing the first parameter after "play-sample".
# TODO: Implement sample name completion.
_sample_names
elif ((CURRENT == 3)); then
# We're completing the second parameter after "play-sample".
# TODO: Implement sink name completion.
_devices
fi
}
@ -470,7 +480,7 @@ _pactl_completion() {
list) _list_parameter;;
upload-sample) if ((CURRENT == 2)); then _files; fi;;
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;;
unload-module) if ((CURRENT == 2)); then _loaded_modules; fi;;
move-sink-input) _move_sink_input_parameter;;
@ -561,6 +571,7 @@ _pacmd_completion() {
'dump: show daemon configuration'
'dump-volumes: show the state of all volumes'
'shared: show shared properties'
'send-message: send a message to a pulseaudio object'
'exit: ask the PulseAudio daemon to exit'
)
_describe 'pacmd commands' _pacmd_commands
@ -668,7 +679,7 @@ _pacat_completion() {
'--process-time-msec=[request the specified process time in msec]:msec' \
'--property=[set the specified property]:property' \
'--raw[record/play raw PCM data]' \
'--passthrough[passtrough data]' \
'--passthrough[passthrough data]' \
'--file-format=[record/play formatted PCM data]:format:_pacat_file_formats' \
'--list-file-formats[list available formats]' \
'::files:_files' \

View file

@ -665,9 +665,21 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
pa_xfree(c->config_file);
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 ?
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) {
pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno));

View file

@ -67,6 +67,12 @@ load-module module-coreaudio-detect
### Use the static hardware detection module (for systems that lack udev support)
load-module module-detect
.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
.ifexists module-jackdbus-detect@PA_SOEXT@
@ -121,17 +127,6 @@ load-module module-gsettings
.endif
])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
### during runtime
### 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
#set-default-sink output
#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

View file

@ -60,6 +60,12 @@
#include <systemd/sd-daemon.h>
#endif
#ifdef HAVE_WINDOWS_H
#include <windows.h>
#include <aclapi.h>
#include <sddl.h>
#endif
#include <pulse/client-conf.h>
#include <pulse/mainloop.h>
#include <pulse/mainloop-signal.h>
@ -101,7 +107,7 @@
#ifdef DISABLE_LIBTOOL_PRELOAD
/* 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 */
const lt_dlsymlist lt_preloaded_symbols[] = {
LT_DLSYM_CONST lt_dlsymlist lt_preloaded_symbols[] = {
{ "@PROGRAM@", 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) {
struct passwd *pw;
@ -377,7 +471,45 @@ fail:
}
#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[]) {
#endif
pa_core *c = NULL;
pa_strbuf *buf = NULL;
pa_daemon_conf *conf = NULL;
@ -402,6 +534,23 @@ int main(int argc, char *argv[]) {
bool start_server;
#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_level(PA_LOG_NOTICE);
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_reset_priority();
/* Load locale from the environment. */
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();
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_log_info("This is PulseAudio %s", PACKAGE_VERSION);
pa_log_debug("Compilation host: %s", CANONICAL_HOST);
pa_log_debug("Compilation CFLAGS: %s", PA_CFLAGS);
#ifdef HAVE_LIBSAMPLERATE
@ -1067,6 +1221,10 @@ int main(int argc, char *argv[]) {
c->server_type = conf->local_server_type;
#endif
pa_core_check_idle(c);
c->state = PA_CORE_RUNNING;
pa_cpu_init(&c->cpu_info);
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");
#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;
if (pa_mainloop_run(mainloop, &retval) < 0)
goto finish;
@ -1173,6 +1343,18 @@ int main(int argc, char *argv[]) {
sd_notify(0, "STOPPING=1");
#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:
#ifdef HAVE_DBUS
if (server_bus)
@ -1240,5 +1422,17 @@ finish:
dbus_shutdown();
#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;
}

View file

@ -31,7 +31,7 @@ executable('pulseaudio',
include_directories : [configinc, topinc],
link_args : ['-ffast-math'],
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,
)
@ -47,6 +47,14 @@ if x11_dep.found()
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(
input : 'pulseaudio.desktop.in',
output : 'pulseaudio.desktop',
@ -92,11 +100,9 @@ default_conf = configuration_data()
default_conf.merge_from(cdata)
default_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY'))
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('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(
input : 'default.pa.in',
@ -115,9 +121,7 @@ custom_target('default.pa',
)
system_conf = configuration_data()
system_conf.merge_from(cdata)
system_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY'))
system_conf.set('PA_SOEXT', cdata.get_unquoted('PA_SOEXT'))
system_conf.merge_from(default_conf)
system_template_file = configure_file(
input : 'system.pa.in',
@ -144,6 +148,8 @@ endif
if systemd_dep.found()
sd_user_service_conf = configuration_data()
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(
input : 'systemd/user/pulseaudio.service.in',
@ -153,6 +159,14 @@ if systemd_dep.found()
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_dir: systemduserunitdir,
)

View file

@ -6,4 +6,5 @@ Exec=start-pulseaudio-x11
Terminal=false
Type=Application
X-GNOME-Autostart-Phase=Initialization
X-GNOME-HiddenUnderSystemd=true
X-KDE-autostart-phase=1

View file

@ -17,6 +17,25 @@
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
@PACTL_BINARY@ load-module module-x11-publish "display=$DISPLAY xauthority=$XAUTHORITY" > /dev/null

View file

@ -39,6 +39,12 @@ load-module module-coreaudio-detect
### Use the static hardware detection module (for systems that lack udev/hal support)
load-module module-detect
.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
.ifexists module-esound-protocol-unix@PA_SOEXT@
@ -60,3 +66,8 @@ load-module module-suspend-on-idle
### Enable positioned 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

View 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

View file

@ -28,6 +28,7 @@ SystemCallFilter=@system-service
# Note that notify will only work if --daemonize=no
Type=notify
UMask=0077
Slice=session.slice
[Install]
Also=pulseaudio.socket

View file

@ -3,7 +3,6 @@ libpulsecommon_sources = [
'pulse/error.c',
'pulse/fork-detect.c',
'pulse/format.c',
'pulse/json.c',
'pulse/mainloop-api.c',
'pulse/xmalloc.c',
'pulse/proplist.c',
@ -31,6 +30,7 @@ libpulsecommon_sources = [
'pulsecore/iochannel.c',
'pulsecore/ioline.c',
'pulsecore/ipacl.c',
'pulsecore/json.c',
'pulsecore/lock-autospawn.c',
'pulsecore/log.c',
'pulsecore/ratelimit.c',
@ -38,7 +38,6 @@ libpulsecommon_sources = [
'pulsecore/memblock.c',
'pulsecore/memblockq.c',
'pulsecore/memchunk.c',
'pulsecore/mutex-posix.c',
'pulsecore/native-common.c',
'pulsecore/once.c',
'pulsecore/packet.c',
@ -55,7 +54,6 @@ libpulsecommon_sources = [
'pulsecore/random.c',
'pulsecore/srbchannel.c',
'pulsecore/sample-util.c',
'pulsecore/semaphore-posix.c',
'pulsecore/shm.c',
'pulsecore/bitset.c',
'pulsecore/socket-client.c',
@ -64,7 +62,6 @@ libpulsecommon_sources = [
'pulsecore/strbuf.c',
'pulsecore/strlist.c',
'pulsecore/tagstruct.c',
'pulsecore/thread-posix.c',
'pulsecore/time-smoother.c',
'pulsecore/tokenizer.c',
'pulsecore/usergroup.c',
@ -76,7 +73,6 @@ libpulsecommon_headers = [
'pulse/error.h',
'pulse/fork-detect.h',
'pulse/format.h',
'pulse/json.h',
'pulse/mainloop-api.h',
'pulse/xmalloc.h',
'pulse/proplist.h',
@ -107,6 +103,7 @@ libpulsecommon_headers = [
'pulsecore/iochannel.h',
'pulsecore/ioline.h',
'pulsecore/ipacl.h',
'pulsecore/json.h',
'pulsecore/llist.h',
'pulsecore/lock-autospawn.h',
'pulsecore/log.h',
@ -175,6 +172,20 @@ if x11_dep.found()
endif
# 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
libpulsecommon = shared_library('pulsecommon-' + pa_version_major_minor,
@ -187,16 +198,20 @@ libpulsecommon = shared_library('pulsecommon-' + pa_version_major_minor,
install_dir : privlibdir,
dependencies : [
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)
libpulsecommon_dep = declare_dependency(link_with: libpulsecommon)
subdir('pulse')
if get_option('daemon')
subdir('pulsecore')
subdir('daemon')
subdir('modules')
endif
if get_option('tests')
subdir('tests')
endif

View file

@ -19,6 +19,7 @@ SUBSYSTEM!="sound", GOTO="pulseaudio_end"
ACTION!="change", GOTO="pulseaudio_end"
KERNEL!="card*", GOTO="pulseaudio_end"
SUBSYSTEMS=="usb", GOTO="pulseaudio_check_usb"
SUBSYSTEMS=="pci", GOTO="pulseaudio_check_pci"
SUBSYSTEMS=="firewire", GOTO="pulseaudio_firewire_quirk"
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}=="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}=="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}=="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}=="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: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}=="1294", 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
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 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"
# 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"
LABEL="pulseaudio_firewire_quirk"
# Focusrite Saffire Pro 10/26 i/o has a quirk to disappear from IEEE 1394 bus when losing connections.
# https://bugzilla.kernel.org/show_bug.cgi?id=199365
ENV{ID_VENDOR_ID}=="0x00130e", ENV{ID_MODEL_ID}=="0x000003", ENV{PULSE_IGNORE}="1"
# Both of Saffire Pro 10 i/o and Liquid Saffire 56 have the same ID_MODEL_ID
# (0x000006), but Liquid Saffire 56 doesn't suffer from the problem, so we
# can't use ID_MODEL_ID to identify the problematic card. ID_MODEL works
# better here.
ENV{ID_VENDOR_ID}=="0x00130e", ENV{ID_MODEL}=="Pro10IO" ENV{PULSE_IGNORE}="1"
# Focusrite Saffire Pro 10 i/o and Pro 26 i/o have a quirk to disappear from
# IEEE 1394 bus when breaking connections. This brings an issue for PulseAudio
# to continue the routine for ever that:
# - detecting sound card
# - starting PCM substream
# - stopping the PCM substream
# - the card disappears
# - 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"

File diff suppressed because it is too large Load diff

View file

@ -50,6 +50,8 @@ typedef struct pa_alsa_port_data pa_alsa_port_data;
#include "alsa-util.h"
#include "alsa-ucm.h"
#define POSITION_MASK_CHANNELS 8
typedef enum pa_alsa_switch_use {
PA_ALSA_SWITCH_IGNORE,
PA_ALSA_SWITCH_MUTE, /* make this switch follow mute status */
@ -113,6 +115,8 @@ struct pa_alsa_mixer_id {
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
* of the element is an enumeration item, or a switch status if the
* element is a switch item. */
@ -152,7 +156,7 @@ struct pa_alsa_element {
long constant_volume;
bool override_map:1;
unsigned int override_map;
bool direction_try_other:1;
bool has_dB:1;
@ -160,7 +164,7 @@ struct pa_alsa_element {
long volume_limit; /* -1 for no configured limit */
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;
pa_channel_position_mask_t merged_mask;
@ -177,8 +181,8 @@ struct pa_alsa_jack {
snd_mixer_t *mixer_handle;
char *mixer_device_name;
struct pa_alsa_mixer_id alsa_id;
char *name; /* E g "Headphone" */
char *alsa_name; /* E g "Headphone Jack" */
bool has_control; /* is the jack itself present? */
bool plugged_in; /* is this jack currently plugged in? */
snd_mixer_elem_t *melem; /* Jack detection handle */
@ -194,7 +198,7 @@ struct pa_alsa_jack {
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_set_has_control(pa_alsa_jack *jack, bool has_control);
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 *description_key;
char *description;
char *available_group;
char *availability_group;
pa_device_port_type_t device_port_type;
unsigned priority;
bool autodetect_eld_device;
@ -281,6 +285,7 @@ struct pa_alsa_mapping {
char *name;
char *description;
char *description_key;
unsigned priority;
pa_alsa_direction_t direction;
/* These are copied over to the resultant sink/source */
@ -322,6 +327,7 @@ struct pa_alsa_profile {
char *name;
char *description;
char *description_key;
unsigned priority;
char *input_name;

View file

@ -1494,6 +1494,7 @@ static void sink_set_volume_cb(pa_sink *s) {
pa_cvolume r;
char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
bool deferred_volume = !!(s->flags & PA_SINK_DEFERRED_VOLUME);
bool write_to_hw = !deferred_volume;
pa_assert(u);
pa_assert(u->mixer_path);
@ -1502,7 +1503,14 @@ static void sink_set_volume_cb(pa_sink *s) {
/* Shift up by the 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;
/* 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);
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 ((err = try_recover(u, "snd_pcm_avail", (int) unused)) < 0) {
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;
return 0;
}
} else
} else {
pa_log_debug("Mhmm, actually there is nothing to rewind.");
if (u->use_tsched)
increase_watermark(u);
}
rewind_done:
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,
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) {
u->mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, mdev, true);
} 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 mute_is_set;
pa_alsa_profile_set *profile_set = NULL;
void *state = NULL;
void *state;
pa_assert(m);
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_DESCRIPTION, mapping->description);
state = NULL;
while ((key = pa_proplist_iterate(mapping->proplist, &state)))
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) {
pa_device_port *port;
void *state;
unsigned h_prio = 0;
PA_HASHMAP_FOREACH(port, u->sink->ports, state) {
if (!h_prio || port->priority > h_prio)

View file

@ -1365,6 +1365,7 @@ static void source_set_volume_cb(pa_source *s) {
pa_cvolume r;
char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX];
bool deferred_volume = !!(s->flags & PA_SOURCE_DEFERRED_VOLUME);
bool write_to_hw = !deferred_volume;
pa_assert(u);
pa_assert(u->mixer_path);
@ -1373,7 +1374,14 @@ static void source_set_volume_cb(pa_source *s) {
/* Shift up by the 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;
/* 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,
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) {
u->mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, mdev, false);
} 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 mute_is_set;
pa_alsa_profile_set *profile_set = NULL;
void *state = NULL;
void *state;
pa_assert(m);
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_DESCRIPTION, mapping->description);
state = NULL;
while ((key = pa_proplist_iterate(mapping->proplist, &state)))
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) {
pa_device_port *port;
void *state;
unsigned h_prio = 0;
PA_HASHMAP_FOREACH(port, u->source->ports, state) {
if (!h_prio || port->priority > h_prio)

View file

@ -691,7 +691,7 @@ static char *modifier_name_to_role(const char *mod_name, bool *is_sink) {
if (!sub || !*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;
}
@ -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) {
char *card_name;
const char **verb_list;
const char **verb_list, *value;
int num_verbs, i, err = 0;
/* support multiple card instances, address card directly by 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);
if (err < 0) {
/* 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);
if (err < 0) {
pa_log("Card can't get card_name from card_index %d", card_index);
err = -PA_ALSA_ERR_UNSPECIFIED;
goto name_fail;
}
err = snd_use_case_mgr_open(&ucm->ucm_mgr, card_name);
if (err < 0) {
pa_log_info("UCM not available for card %s", card_name);
err = -PA_ALSA_ERR_UCM_OPEN;
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);
/* get a list of all UCM verbs (profiles) for this card */
num_verbs = snd_use_case_verb_list(ucm->ucm_mgr, &verb_list);
if (num_verbs < 0) {
pa_log("UCM verb list not found for %s", card_name);
err = -PA_ALSA_ERR_UNSPECIFIED;
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) {
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);
@ -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) {
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);
} 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);
} else
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_direction(&port_data, is_sink ? PA_DIRECTION_OUTPUT : PA_DIRECTION_INPUT);
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));
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);
}
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(
pa_alsa_ucm_config *ucm,
pa_alsa_profile_set *ps,
@ -1537,19 +1575,14 @@ static int ucm_create_mapping_direction(
bool is_sink) {
pa_alsa_mapping *m;
char *mapping_name;
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) {
pa_log("No mapping for %s", mapping_name);
pa_xfree(mapping_name);
if (!m)
return -1;
}
pa_log_debug("UCM mapping: %s dev %s", mapping_name, device_name);
pa_xfree(mapping_name);
pa_log_debug("UCM mapping: %s dev %s", m->name, device_name);
priority = is_sink ? device->playback_priority : device->capture_priority;
rate = is_sink ? device->playback_rate : device->capture_rate;
@ -1594,18 +1627,13 @@ static int ucm_create_mapping_for_modifier(
bool is_sink) {
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) {
pa_log("no mapping for %s", mapping_name);
pa_xfree(mapping_name);
if (!m)
return -1;
}
pa_log_info("ucm mapping: %s modifier %s", mapping_name, mod_name);
pa_xfree(mapping_name);
pa_log_info("UCM mapping: %s modifier %s", m->name, mod_name);
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);
@ -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);
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);
finish:
@ -1941,7 +1969,7 @@ static void ucm_mapping_jack_probe(pa_alsa_mapping *m, pa_hashmap *mixers) {
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_log_info("UCM jack %s has_control=%d", dev->jack->name, dev->jack->has_control);
}

View file

@ -731,7 +731,7 @@ snd_pcm_t *pa_alsa_open_by_device_string(
if (!pa_startswith(d, "plug:") && !pa_startswith(d, "plughw:")) {
char *t;
t = pa_sprintf_malloc("plug:%s", d);
t = pa_sprintf_malloc("plug:SLAVE='%s'", d);
pa_xfree(d);
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 {
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.",
"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.",
@ -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),
pa_strnull(dn));
pa_xfree(dn);
pa_alsa_dump(PA_LOG_ERROR, pcm);
pa_alsa_dump(PA_LOG_DEBUG, pcm);
} PA_ONCE_END;
/* 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 {
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.",
"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.",
@ -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),
pa_strnull(dn));
pa_xfree(dn);
pa_alsa_dump(PA_LOG_ERROR, pcm);
pa_alsa_dump(PA_LOG_DEBUG, pcm);
} PA_ONCE_END;
/* 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 {
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.",
"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.",
@ -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),
pa_strnull(dn));
pa_xfree(dn);
pa_alsa_dump(PA_LOG_ERROR, pcm);
pa_alsa_dump(PA_LOG_DEBUG, pcm);
} PA_ONCE_END;
/* 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))
PA_ONCE_BEGIN {
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.",
"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.",
@ -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),
pa_strnull(dn));
pa_xfree(dn);
pa_alsa_dump(PA_LOG_ERROR, pcm);
pa_alsa_dump(PA_LOG_DEBUG, pcm);
} PA_ONCE_END;
return r;
@ -1635,8 +1635,8 @@ static snd_mixer_elem_t *pa_alsa_mixer_find(snd_mixer_t *mixer,
return NULL;
}
snd_mixer_elem_t *pa_alsa_mixer_find_card(snd_mixer_t *mixer, const char *name, unsigned int device) {
return pa_alsa_mixer_find(mixer, SND_CTL_ELEM_IFACE_CARD, name, 0, 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, 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) {
@ -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)) {
const char *s = dev + 3;
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) {
PA_HASHMAP_FOREACH_KV(dev2, pm, mixers, state) {
if (pm->card_index == card_index) {

View file

@ -33,6 +33,13 @@
#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(
snd_pcm_t *pcm_handle,
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);
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_t *pa_alsa_open_mixer(pa_hashmap *mixers, int alsa_card_index, bool probe);

View file

@ -28,6 +28,9 @@ required-any = any
state.plugged = unknown
state.unplugged = unknown
[Jack Line - Input]
required-any = any
[Element Capture]
switch = mute
volume = merge

View file

@ -29,6 +29,9 @@ required-any = any
state.plugged = unknown
state.unplugged = unknown
[Jack Mic - Input]
required-any = any
[Element Capture]
switch = mute
volume = merge

View 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

View file

@ -13,17 +13,24 @@
# You should have received a copy of the GNU Lesser General Public License
# 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
[General]
priority = 98
description-key = analog-output-headphones
[Properties]
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]
switch = mute
volume = merge
@ -47,6 +54,13 @@ volume = off
switch = mute
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]
switch = mute
volume = zero
@ -56,7 +70,7 @@ switch = off
volume = off
[Element Headphone2]
required = any
required-any = any
switch = mute
volume = merge
override-map.1 = all
@ -70,9 +84,11 @@ volume = off
switch = 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]
switch = mute
switch = off
volume = zero
[Element Rear]

View file

@ -35,6 +35,10 @@ state.unplugged = unknown
[Jack Front Headphone]
required-any = any
; HP EliteDesk 800 DM Headset
[Jack Front Headphone Front]
required-any = any
[Jack Front Headphone Phantom]
required-any = any
state.plugged = unknown
@ -52,6 +56,9 @@ state.unplugged = unknown
[Jack Headphone Mic]
required-any = any
[Jack Headphone - Output]
required-any = any
[Element Hardware Master]
switch = mute
volume = merge
@ -86,6 +93,13 @@ volume = merge
override-map.1 = all
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]
required-any = any
switch = mute
@ -112,9 +126,11 @@ volume = off
switch = 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]
switch = mute
switch = off
volume = zero
[Element Rear]
@ -157,4 +173,8 @@ volume = off
switch = off
volume = off
[Element Speaker Center/LFE]
switch = off
volume = off
.include analog-output.conf.common

View file

@ -127,6 +127,10 @@ required-any = any
switch = off
volume = off
[Element Headphone,1]
switch = off
volume = off
[Element Headphone2]
switch = off
volume = off
@ -181,6 +185,12 @@ volume = merge
override-map.1 = all-center
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]
switch = off
volume = off

View file

@ -44,6 +44,10 @@ override-map.2 = all-left,all-right
switch = mute
volume = zero
[Element Headphone,1]
switch = mute
volume = zero
[Element Headphone+LO]
switch = mute
volume = zero

View file

@ -76,6 +76,10 @@ volume = off
switch = mute
volume = zero
[Element Headphone,1]
switch = mute
volume = zero
[Element Headphone2]
switch = mute
volume = zero
@ -174,4 +178,10 @@ volume = merge
override-map.1 = all-center
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

Some files were not shown because too many files have changed in this diff Show more