Commit graph

2205 commits

Author SHA1 Message Date
Tanu Kaskinen
c8bd93c5a7 core-util, cpu-x86: use __get_cpuid() instead of homegrown assembly
The get_cpuid() function in cpu-x86.c was buggy on x86-64. When building
without optimizations, the homegrown assembly code overwrote the
beginning of the function argument list on the stack. That happened to
work fine on regular x86-64, but caused crashing with the x32 ABI.

At least GCC and clang provide cpuid.h, which has the __get_cpuid()
function that can be used instead of the homegrown assembly.

The PA_REG_* constants can be removed as well, because they're not used
any more.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=103656
2017-12-07 01:06:48 +02:00
Georg Chini
59d264ac56 sink, source: Don't finish move if unlink happens after pa_*_move_all_start()
When a sink input was unlinked between the calls to pa_sink_move_all_start() and
pa_sink_move_all_finish(), pa_sink_move_all_finish() tried to finish the move
of the already unlinked sink input, which lead to an assertion in
pa_sink_input_finish_move(). The same applies for the source side.

This patch fixes the problem by checking the state of the sink input or
source output in pa_*_move_all_finish().

Bug report: https://bugs.freedesktop.org/show_bug.cgi?id=103752
2017-12-03 22:29:09 +01:00
Tanu Kaskinen
3d698d17af sink-input, source-output: add sink/source_requested_by_application flag
When a stream is created, and the stream creator specifies which device
should be used, that can affect automatic routing policies.
Specifically, module-device-manager shouldn't apply its priority list
routing when a stream has been routed by the application that created
the stream.

A stream that was initially routed by the application may be moved for
some valid reason (e.g. user requesting a move, or the original device
disappearing). When the stream is moved away from its initial device,
the "device requested by application" flag isn't relevant any more, so
it's set to false and never reset to true again.

The change in module-device-manager's routing logic will be done in the
following patch.
2017-12-02 16:13:21 +02:00
Constantine Kharlamov
f5f44950c2 sconv-s16be: declaration/implementation mismatches
Fixes the following compiler errors:

./pulsecore/sconv-s16be.h:41:6: warning: type of 'pa_sconv_s24_32be_from_float32ne' does not match original declaration [-Wlto-type-mismatch]
 void pa_sconv_s24_32be_from_float32ne(unsigned n, const float *a, uint8_t *b);
      ^
pulsecore/sconv-s16le.c:413:6: note: 'pa_sconv_s24_32be_from_float32ne' was previously declared here
 void pa_sconv_s24_32le_from_float32ne(unsigned n, const float *a, uint32_t *b) {
      ^
pulsecore/sconv-s16le.c:413:6: note: code may be misoptimized unless -fno-strict-aliasing is used
./pulsecore/sconv-s16be.h:40:6: warning: type of 'pa_sconv_s24_32be_to_float32ne' does not match original declaration [-Wlto-type-mismatch]
 void pa_sconv_s24_32be_to_float32ne(unsigned n, const uint8_t *a, float *b);
      ^
pulsecore/sconv-s16le.c:388:6: note: 'pa_sconv_s24_32be_to_float32ne' was previously declared here
 void pa_sconv_s24_32le_to_float32ne(unsigned n, const uint32_t *a, float *b) {
      ^
pulsecore/sconv-s16le.c:388:6: note: code may be misoptimized unless -fno-strict-aliasing is used
./pulsecore/sconv-s16be.h:56:6: warning: type of 'pa_sconv_s24_32be_from_s16ne' does not match original declaration [-Wlto-type-mismatch]
 void pa_sconv_s24_32be_from_s16ne(unsigned n, const int16_t *a, uint8_t *b);
      ^
pulsecore/sconv-s16le.c:365:6: note: 'pa_sconv_s24_32be_from_s16ne' was previously declared here
 void pa_sconv_s24_32le_from_s16ne(unsigned n, const int16_t *a, uint32_t *b) {
      ^
pulsecore/sconv-s16le.c:365:6: note: code may be misoptimized unless -fno-strict-aliasing is used
./pulsecore/sconv-s16be.h:55:6: warning: type of 'pa_sconv_s24_32be_to_s16ne' does not match original declaration [-Wlto-type-mismatch]
 void pa_sconv_s24_32be_to_s16ne(unsigned n, const uint8_t *a, int16_t *b);
      ^
pulsecore/sconv-s16le.c:342:6: note: 'pa_sconv_s24_32be_to_s16ne' was previously declared here
 void pa_sconv_s24_32le_to_s16ne(unsigned n, const uint32_t *a, int16_t *b) {
      ^
pulsecore/sconv-s16le.c:342:6: note: code may be misoptimized unless -fno-strict-aliasing is used

Signed-off-by: Constantine Kharlamov <Hi-Angel@yandex.ru>
2017-11-30 01:14:19 +02:00
Mihai Moldovan
3c45897d20 svolume: disable incompatible MMX and SSE code on x86 macOS
We need the same workaround FreeBSD uses.
2017-11-05 13:54:35 +02:00
Tanu Kaskinen
917730a555 sink-input, source-output: add a couple of assertions
Coverity complained about data->sink being possibly NULL when it's
dereferenced later. It was difficult for me to figure out whether that
was a false positive or not. Hopefully the comments make it a bit
easier to reason about the code in the future.

CID: 1323591
2017-10-30 16:46:15 +02:00
Arun Raghavan
7a7072557a sink, source: Rework reconfiguration logic to apply to more than rate
This rejigs the update_rate() logic to encompass changes to the sample
spec as a whole, as well as passthrough status. As a result,
sinks/sources provide a reconfigure() method which allows
reconfiguration as required.

The behaviour itself is currently unchanged -- alsa-sink/-source do not
actually implement anything other than rate updates for now (nor are
they ever requested to). This can be modified in the future, to allow,
for example 24-bit output when incoming media supports it, as well as
channel count changes for passthrough sinks.

Another related change is that passthrough status is now part of
sink/source reconfiguration, and we can stop doing a suspend/unsuspend
when entering/leaving passthrough state. So that part is now divided
in two -- pa_sink_reconfigure() sets the sink in passthrough mode if
required, and pa_sink_enter_passthrough() sets up everything else
(this currently means only volumes, but could disable other processing)
for passthrough mode.
2017-10-21 21:23:37 +05:30
Tanu Kaskinen
51bae8d547 source-output: fix copy-paste error 2017-10-15 19:24:11 +03:00
Peter Meerwald-Stadler
cbc4424821 core: Fix gcc-7 -Wimplicit-fallthrough= warnings by rearranging comment
'Fall through.' must appear separately

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-10-09 10:40:03 +02:00
Peter Meerwald-Stadler
78f964d605 core: Fix typo and gcc-7 -Wimplicit-fallthrough= warnings
Correct spelling of 'through' in a comment helps to fix a warning :)
also drop some unrelated comments

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-10-09 10:40:00 +02:00
Peter Meerwald-Stadler
6f065f9589 core: Fix gcc-7 -Wimplicit-fallthrough= warnings
the comment /* Fall through. */ fixes the warning, but gcc-7 seems to be more
picky about the position in the code

pulsecore/sink-input.c: In function ‘pa_sink_input_update_proplist’:
pulsecore/sink-input.c:1531:13: warning: this statement may fall through [-Wimplicit-fallthrough=]
             for (state = NULL; (key = pa_proplist_iterate(i->proplist, &state));) {
             ^~~
pulsecore/sink-input.c:1539:9: note: here
         case PA_UPDATE_REPLACE: {
         ^~~~

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-10-09 10:39:57 +02:00
Peter Meerwald-Stadler
a39098fe4d raop: Fix gcc-7 warnings, EWOULDBLOCK
EAGAIN is used allover the code rather than EWOULDBLOCK
POSIX allows EAGAIN and EWOULDBLOCK to have the same value (and in fact it is)
don't check for EWOULDBLOCK

modules/raop/raop-client.c: In function ‘send_udp_audio_packet’:
modules/raop/raop-client.c:473:41: warning: logical ‘or’ of equal expressions [-Wlogical-op]
     if (written < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
                                         ^~
modules/raop/raop-client.c: In function ‘resend_udp_audio_packets’:
modules/raop/raop-client.c:528:45: warning: logical ‘or’ of equal expressions [-Wlogical-op]
         if (written < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
                                             ^~

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-10-09 10:39:52 +02:00
Salvador Fandino
79ee19bb51 proplist-util: fix compilation on Windows without NLS
Under MinGW, LC_MESSAGES is defined in libint.h which is not
included when pulseaudio is configured with nls disabled.

LC_MESSAGES is referenced when setting PA_PROP_APPLICATION_LANGUAGE.

This patch just disables setting that property when ENABLE_NLS
is not defined.
2017-10-07 21:59:17 +03:00
Tanu Kaskinen
d1fa269216 thread-mq: create event on the right mainloop
It seems that the intention was to create create write_thread_event on
thread_mainloop instead of main_mainloop (the first parameter of
io_new() is thread_mainloop, io_free() is called on thread_mainloop
etc.).

As long as both mainloops are implemented with pa_mainloop, this bug has
no effect on behaviour, because the io_new() implementation is the same.
And indeed, with the current code base both mainloops are always
pa_mainloops. However, when the tunnel-new modules switches to pa_rtpoll
as the pa_mainloop_api provider, this bug would cause problems.
2017-10-03 17:20:32 +03:00
Tanu Kaskinen
bd151646dd sink: remove priority bonus for the "internal" form factor
We're supposed to prioritize USB sound cards over PCI sound cards, but
the priority bonus for the "internal" form factor prevents this from
happening. Not all (if any) USB sound cards have the form factor
property set, whereas at least on my laptop the on-board sound card has
the form factor set to "internal".
2017-09-18 18:49:34 +03:00
Tanu Kaskinen
f63c13f62f sink, source: fix out of date comments
update_shared_real_volume() doesn't exist. I checked that
update_real_volume() does what the comments claim
update_shared_real_volume() to do.
2017-09-18 18:49:34 +03:00
Tanu Kaskinen
95d618751c sink, source: don't try to update volumes of not-yet-linked devices
The order of the pa_sink_input_put() and pa_sink_put() calls in filter
modules was swapped in commit edc465da77 ("virtual sources and sinks:
Don't double attach a sink input or source output on filter load").
If flat volumes and volume sharing is enabled, the pa_sink_input_put()
call will update volumes of the whole tree of virtual sinks that are
connected to the root sink. The recursive updating procedure tried to
also update the volume of the new sink for which pa_sink_put() had not
yet been called, causing an assertion failure.

This patch tries to make sure that the volume of not-yet-linked sinks
is never changed. pa_sink_put() will set the sink volume correctly, so
it's fine to skip the not-yet-linked sinks during pa_sink_input_put().

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=102549
2017-09-18 18:49:34 +03:00
Pierre-Louis Bossart
15d28f21b4 sink: force suspend/resume on passthrough transitions
A race condition prevents the AES non-audio bit from being set
when enabling IEC61937 passthrough on resume with no sink-input
connected (pa_sink_is_passthrough returns false). The non-audio
bit should really be set when opening the sink.

Force the sink to suspend/resume when actually entering passthrough
mode, and likewise force a suspend-resume on leaving passthrough mode.

Tested with E-AC3 streams which do need the AES bit set for my
Onkyon receiver to detect the format instead of playing it as
PCM.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
2017-09-05 13:46:27 +03:00
Colin Leroy
f0dfddead3 cli-command: don't exit on "module already loaded" errors
Some modules may only be loaded once, and trying to load them
twice from default.pa makes PulseAudio startup fail. While that could
be considered a user error, it's nicer to not be so strict. It's not
necessarily easy to figure what went wrong, if for example the user
plays with RAOP and adds module-raop-discover to default.pa, which first
works fine, but suddenly stops working when the user at some point
enables RAOP support in paprefs. Enabling RAOP in paprefs makes
module-gconf load the module too, so the module gets loaded twice.

This patch adds a way to differentiate module load errors, and
make cli-command ignore the error when the module is already
loaded.
2017-09-05 13:46:27 +03:00
Tanu Kaskinen
95404ce3f3 cli-command: unload modules synchronously
Users may want to change the parameters of some load-once modules in
~/.config/pulse/default.pa. That should be possible by including
/etc/pulse/default.pa from the per-user configuration file, and then
unloading a module and reloading it with different parameters. However,
that doesn't work, because the unload-module command will not unload the
module immediately, so the subsequent load-module command will fail when
the module can be loaded only once.

This patch makes the module unloading synchronous. "pacmd unload-module
module-cli-protocol-unix" is something that might not like this change,
since the command will unload the code that is processing the command,
but I tested it and it works fine. When pa_module_unload() is called,
that won't yet remove the module code from memory, the lt_dlclose() call
is postponed until it's safe to remove the code from memory.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=102205
2017-09-05 13:46:27 +03:00
Tanu Kaskinen
5f27c2ec2f device-port, switch-on-port-available: fix automatic profile changing when current profile is off
module-switch-on-port-available didn't do anything when a port changes
its status if the card didn't have any sinks or sources. This was to
avoid bad things during card initialization, but the if condition also
prevented any profile switches away from the "off" profile, because the
card has no sinks or sources when the "off" profile is active.

pa_card nowadays has the "linked" flag that
module-switch-on-port-available could have checked instead, but since it
doesn't make sense to emit port status change events before the card has
been initialized, I added the check in pa_device_port_set_available()
instead.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=101794
2017-09-05 13:46:26 +03:00
Tanu Kaskinen
970b475a25 core: ignore devices that are not linked when choosing the default sink or source
Sources should probably be added to pa_core.sources in pa_source_put(),
but currently they're added in pa_source_new(). A lot of stuff can
happen between the pa_source_new() and pa_source_put() calls, and
it has happened that the default source was updated during this time.
Therefore, pa_core_update_default_source() needs to take it into account
that not every source is necessarily linked.
2017-09-02 14:14:49 +03:00
Vadim Troshchinskiy
464b949059 conf-parser: provide a replacement for scandir on Win32
PA builds fine on MinGW except for the use of the scandir function in
pulsecore/conf-parser.c, so I provided a Win32 implementation. With this
patch the latest code builds on Win32 without problems.
2017-08-05 06:49:25 +03:00
Tanu Kaskinen
e7d7b29c17 protocol-native: fix bytes-to-usec conversion of "on-the-fly" data
The on_the_fly_snapshot variable contains the amount of bytes that has
been sent from the source IO thread to the main thread, but not yet
pushed to the stream memblockq. The data is in the stream format, but
the bytes-to-usec conversion used the source format, which caused random
latency reporting errors.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=81075
2017-07-17 19:44:51 +03:00
Tanu Kaskinen
a448cc587c core: change configured_default_sink/source type to string
This allows us to restore the default device properly when a
hotpluggable device (e.g. a USB sound card) is set as the default, but
unplugged temporarily. Previously we would forget that the unplugged
device was ever set as the default, because we had to set
configured_default_sink to NULL to avoid having a stale pa_sink pointer,
and also because module-default-device-restore couldn't resolve the name
of a currently-unplugged device to a pa_sink pointer.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=89934
2017-07-17 19:41:03 +03:00
Tanu Kaskinen
a7017b831e sink-input, source-output: don't allow moving streams that are connected to moving filter devices
When a filter sink is moving, it's not connected to any master sink, and
therefore it's not connected to any IO thread either. In this situation
trying to move a stream that is connected to the filter sink is likely
to result in crashing, because starting the move involves sending a
message to the IO thread. Sometimes this works by accident (the
asyncmsgq of the filter sink still points to the old master sink's
asyncmsgq), but we really should never attempt it. This patch blocks all
moves where the moving stream is connected to a filter sink that itself
is in the middle of a move.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=100277
2017-05-18 23:32:32 +03:00
Georg Chini
e08124f6ba sink/source: Don't update default sink/source before calling PA_CORE_HOOK_{SINK,SOURCE}_PUT
In sink_put() and source_put(), pa_core_update_default_{sink,source}() was called
before the PA_CORE_HOOK_{SINK,SOURCE}_PUT hook. Therefore module-switch-on-connect
could not correctly determine the old default sink/source if no user default was
set and a sink/source with higher priority than any other sink/source turned up.

This patch corrects the problem by swapping the order of the hook call and the
pa_core_update_default_sink() call.

Additionally it corrects a problem in module-switch-on-connect. If, after the
change above, the new sink/source was the first sink/source to appear, pulseaudio
would crash because module-switch-on-connect assumed that the default sink/source
was not NULL. The patch checks if the default sink/source is NULL and only sets
the new default sink/source in that case.
2017-05-18 07:47:27 +02:00
Tanu Kaskinen
4c6843f020 sink, source: update the default sink/source on port switches
When sinks are compared during the default sink selection, the active
port's availability is inspected. Therefore, the default sink should be
updated when the active port changes, because the new port may have
different availability status than the old port.

For example, let's say that a laptop has an analog sink with a speaker
and a headphone port, and headphones are initially plugged in, so both
ports can be used[1]. The headphone port is initially the active port.
There's also a null sink in the system. When the headphones are
unplugged, the headphone port becomes unavailable, and the null sink
becomes the new default sink. Then module-switch-on-port-available
changes the analog sink port to speakers. Now the default sink should
change back to the analog sink, but that doesn't happen without this
patch.

[1] Actually we currently mark speakers as unavailable when headphones
are plugged in, but that's not strictly necessary. My example relies on
both ports being available initially, so the bug can't be reproduced
with the current mixer configuration.
2017-05-17 23:05:04 +03:00
Tanu Kaskinen
1c477fcb67 core, device-port: check availability when choosing the default device
It doesn't make sense to use a sink or source whose active port is
unavailable, so let's take this into account when choosing the default
sink and source.
2017-05-02 16:18:46 +03:00
Tanu Kaskinen
6b34896130 improve default sink/source handling
Currently the default sink policy is simple: either the user has
configured it explicitly, in which case we always use that as the
default, or we pick the sink with the highest priority. The sink
priorities are currently static, so there's no need to worry about
updating the default sink when sink priorities change.

I intend to make things a bit more complex: if the active port of a sink
is unavailable, the sink should not be the default sink, and I also want
to make sink priorities dependent on the active port, so changing the
port should cause re-evaluation of which sink to choose as the default.
Currently the default sink choice is done only when someone calls
pa_namereg_get_default_sink(), and change notifications are only sent
when a sink is created or destroyed. That makes it hard to add new rules
to the default sink selection policy.

This patch moves the default sink selection to
pa_core_update_default_sink(), which is called whenever something
happens that can affect the default sink choice. That function needs to
know the previous choice in order to send change notifications as
appropriate, but previously pa_core.default_sink was only set when the
user had configured it explicitly. Now pa_core.default_sink is always
set (unless there are no sinks at all), so pa_core_update_default_sink()
can use that to get the previous choice. The user configuration is saved
in a new variable, pa_core.configured_default_sink.

pa_namereg_get_default_sink() is now unnecessary, because
pa_core.default_sink can be used directly to get the
currently-considered-best sink. pa_namereg_set_default_sink() is
replaced by pa_core_set_configured_default_sink().

I haven't confirmed it, but I expect that this patch will fix problems
in the D-Bus protocol related to default sink handling. The D-Bus
protocol used to get confused when the current default sink gets
removed. It would incorrectly think that if there's no explicitly
configured default sink, then there's no default sink at all. Even
worse, when the D-Bus thinks that there's no default sink, it concludes
that there are no sinks at all, which made it impossible to configure
the default sink via the D-Bus interface. Now that pa_core.default_sink
is always set, except when there really aren't any sinks, the D-Bus
protocol should behave correctly.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=99425
2017-05-02 16:10:19 +03:00
Georg Chini
d985276c8b source/sink: Fix wrong calculation of thread_info.current_hw_volume
In pa_{source,sink}_new() and pa_{source,sink}_put() the current hardware
volume was miscalculated:

hw volume (dB) = real volume (dB) + soft volume (dB)
was used instead of
hw volume (dB) = real volume (dB) - soft volume (dB)

This lead to a crash in pa_alsa_path_set_volume() if high volumes were
set and the port was changed.

This patch fixes the calculation. Thanks to Tanu for pointing out
the correct solution.

Bug link: https://bugs.freedesktop.org/show_bug.cgi?id=65520
2017-04-29 10:07:01 +02:00
Christian Kellner
9418807c92 sink: Add missing 'hifi' form factor to priorities
Assign it a propriety of 600, therefore ranking higher then speaker,
but below headphone.

https://bugs.freedesktop.org/show_bug.cgi?id=100579
2017-04-19 17:04:35 +03:00
Christian Kellner
6f4d303b6a sink: Add portable form factor priority (450)
The 'portable' form factor was currently missing meaning it is not
getting any form-factor priority at all and it would therefore always
be ranked lower then internal devices (which receive 400 form factor
priority). The priority 450 is smaller then 'speaker', based on the
idea that a portable device might have less quality then a dedicated
'speaker' device (some Yamaha amplifiers announce themselves as such).

https://bugs.freedesktop.org/show_bug.cgi?id=100579
2017-04-19 17:00:02 +03:00
Georg Chini
fe70b9e11a source/sink: Allow pa_{source, sink}_get_latency_within_thread() to return negative values
The reported latency of source or sink is based on measured initial conditions.
If the conditions contain an error, the estimated latency values may become negative.
This does not indicate that the latency is indeed negative but can be considered
merely an offset error. The current get_latency_in_thread() calls and the
implementations of the PA_{SINK,SOURCE}_MESSAGE_GET_LATENCY messages truncate negative
latencies because they do not make sense from a physical point of view. In fact,
the values are truncated twice, once in the message handler and a second time in
the pa_{source,sink}_get_latency_within_thread() call itself.
This leads to two problems for the latency controller within module-loopback:

- Truncating leads to discontinuities in the latency reports which then trigger
  unwanted end to end latency corrections.
- If a large negative port latency offsets is set, the reported latency is always 0,
  making it impossible to control the end to end latency at all.

This patch is a pre-condition for solving these problems.
It adds a new flag to pa_{sink,source}_get_latency_within_thread() to allow
negative return values. Truncating is also removed in all implementations of the
PA_{SINK,SOURCE}_MESSAGE_GET_LATENCY message handlers. The allow_negative flag
is set to false for all calls of pa_{sink,source}_get_latency_within_thread()
except when used within PA_{SINK,SOURCE}_MESSAGE_GET_LATENCY. This means that the
original behavior is not altered in most cases. Only if a positive latency offset
is set and the message returns a negative value, the reported latency is smaller
because the values are not truncated twice.

Additionally let PA_SOURCE_MESSAGE_GET_LATENCY return -pa_sink_get_latency_within_thread()
for monitor sources because the source gets the data before it is played.
2017-04-17 19:50:10 +02:00
Georg Chini
a5fccd4645 source/sink: Don't let pa_{sink, source}_get_latency_within_thread() return -1 if process_msg() fails
None of the callers checks the return value anyway. Return the offset only
if message processing fails. This is in preparation for the next patch.
2017-04-17 19:48:37 +02:00
Georg Chini
96cae04ced sink-input: Allow sink_input_set_rate() to be called during a move
During a move sink_input->sink is not valid. This leads to a crash when
sink_input_set_rate() is called from the moving() callback. This patch
fixes the problem.
2017-04-11 21:48:31 +02:00
Georg Chini
5bc363d4b8 loopback: Add hooks to track port latency offsets
The previous patch assumed constant port latency offsets. The offsets can
however be changed by the user, therefore these changes need to be tracked
as well. This patch adds the necessary hooks.

Also the print_msg argument was removed from update_minimum_latency() and
update_latency_boundaries() because the message should always be logged.
2017-04-10 21:47:23 +02:00
Tanu Kaskinen
a604d9cbb3 memblock: multiple references should make blocks read-only
The old code makes no sense to me. Why would multiple references mean
that a previously read-only memblock is suddenly writable? I'm pretty
sure that the original intention was to treat multi-referenced blocks
as read-only. I don't have any examples where the old code would have
caused bad behaviour, however.
2017-04-06 23:36:07 +03:00
Tanu Kaskinen
2432270a73 protocol-native: log who changes card profiles
Some volume control applications, including gnome-control-center[1],
Budgie Volume Control[2] and possibly something in xfce4 too[3],
sometimes do unwanted card profile changes. This patch makes it possible
to see from the log which application requested a profile change, which
makes it easier to detect when an application misbehaves.

[1] https://bugzilla.gnome.org/show_bug.cgi?id=762932
[2] https://bugs.freedesktop.org/show_bug.cgi?id=93903#c41
[3] https://bugs.freedesktop.org/show_bug.cgi?id=93903#c40
2017-04-06 22:58:07 +03:00
Christian Kellner
b53dd1f0df sink: Invert priorities to prefer external devices
Currently internal > speaker > headphone and pci > usb > bluetooth.
Invert both of these sets, with the reasoning that a headphone and
speakers are something that a user has actively attached and should
therefore get a higher priority. The same reasoning is applied for
the bus type, i.e. bluetooth and usb should be higher than pci,
because they most likely have been actively attached be a user.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=99222
2017-03-31 17:11:29 +03:00
Georg Chini
3650346f70 sink-input/source-output: Don't crash when cork() is called without valid sink or source
If pa_sink_input_cork() or pa_source_output_cork() were called without a sink
or source attached, the calls would crash pulseaudio.

This patch fixes the problem, so that a source output or sink input can still
be corked or uncorked while source or sink are invalid. This is needed to
correct the corking logic in module-loopback.
2017-03-29 07:10:28 +02:00
Peter Meerwald-Stadler
eab0b9d83b core: Ignore pa_shared_remove() return value
document behaviour of pa_shared_remove() in case name does not exist

Coverity ID: #1380672

thanks to Georg Chini for suggesting to swap patch title and commit message

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-10 10:17:40 +01:00
Peter Meerwald-Stadler
976f7e9a61 core: Assert return value of pa_shared_set/_remove() in dbus-shared
it must succeed, or we are leaking memory

Coverity ID: #1380674, #1380673

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-10 10:14:37 +01:00
Peter Meerwald-Stadler
6b7b70c472 core-util: Fix description of pa_split()
Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-08 14:31:29 +01:00
Peter Meerwald-Stadler
a199b9045e build: Use #ifdef to check for #defines
for example, in case HAVE_MEMFD is #undef, checking with #if HAVE_MEMFD
gives a warning (gcc 5.4.1, Ubuntu)

pulsecore/shm.c: In function 'sharedmem_create':
pulsecore/shm.c:208:5: warning: "HAVE_MEMFD" is not defined [-Wundef]
 #if HAVE_MEMFD

use #ifdef or #if defined() to check for presence of a #define

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-08 14:31:29 +01:00
Tanu Kaskinen
18ec0fe53e iochannel: don't use variable length array in union
Clang didn't like the variable length array:

pulsecore/iochannel.c:358:17: error: fields must have a constant size:
'variable length array in structure' extension will never be supported
        uint8_t data[CMSG_SPACE(sizeof(int) * nfd)];
                ^

Commit 451d1d6762 introduced the variable length array in order to have
the correct value in msg_controllen. This patch reverts that commit and
uses a different way to achieve the same goal.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=99458
2017-03-07 15:17:27 +02:00
Peter Meerwald-Stadler
424e97a5fa build: Add Coverity scan model
the modeling file help to avoid false positives and increase scanning
accuracy by explaining code Coverity can't see (out of tree libraries);
the model file must be uploaded by an admin to:
https://scan.coverity.com/projects/pulseaudio?tab=analysis_settings

the pa_assert_se() macro needs to be rewritten for Coverity so that
the assignment is not declared a side-effect

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-06 08:22:33 +01:00
Arun Raghavan
539371b3f7 sink, source: Make rate selection more explicit
This serves to explicitly document the various cases we deal with in
pa_sink_update_rate()/pa_source_update_rate() rather than have some of
them hidden behind the initialisation of desired_rate.
2017-01-30 14:07:37 +05:30
Arun Raghavan
cc021c7330 sink, source: Add a mode to avoid resampling if possible
This adds an "avoid-resampling" option to daemon.conf that makes the
daemon try to use the stream sample rate if possible (the device needs
to support it, which currently only ALSA does), and there should not be
any other stream connected).

This should enable some of the "audiophile" use-cases where users wish
to play high sample rate audio files without resampling.

We still will do conversion if sample formats don't match, though. This
means that if you want to play 96 kHz/24 bit audio without any
modification the default format will need to be set to be 24-bit as
well. This will force all streams to be upconverted, which, other than
the wasted resources, should be relatively harmless.
2017-01-30 13:54:43 +05:30
Hajime Fujita
43bf134aa1 core-util: do in-place search in pa_str_in_list_spaces
Reviewed-by: Anton Lundin <glance@acc.umu.se>
2017-01-19 03:00:45 +02:00