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