Commit graph

130 commits

Author SHA1 Message Date
StefanBruens
faac387ce9 raop: Send initial timing packet to prime UDP connection tracking
In case the local UDP port is blocked by a firewall by default, send
an initial timing packet so the connection tracking will accept the
response packages.

Otherwise, the connection will fail with an 'RTSP/1.0 500 Internal
Server Error' after some timeout.

Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/840
2020-04-10 18:44:13 +00:00
ckdo
4854524058 raop: Add autoreconnect feature
This patch adds the autoreconnect feature to the raop module.
This is mainly to be used in a server context, but can be used
also in a desktop usage context.

With autoreconnect feature, the raop module behaves like this:

- At initialisation or in case of the RTSP TCP connection lost, it
  tries to reconnect every 5 seconds
- In case of any fatal error, it tries to reconnect every 5 seconds
- In UDP mode, if no timing packets received anymore for a long time,
  RTSP connection is closed, then it tries to reconnect..
- After reconnection, once RTSP session has been established again,
  playing is resumed automatically.
- When the connection is not established yet (or loss), the sink
  behaves like a null sink. In the source code I called it "autonull",
  even if autonull is set to autoreconnect param value, it could be
  split into two different params.
2019-12-22 09:43:14 +00:00
ckdo
46dd3be8ce raop: Code clarification : Only free the I/O thread when everything is initialized 2019-12-22 09:43:14 +00:00
ckdo
7e6bb05390 raop: Code clarification : Detect raop_client recording state in a proper way 2019-12-22 09:43:14 +00:00
ckdo
3e66643f50 raop: Fix callback call in raop client after auth : only call once everything is freed 2019-12-22 09:43:14 +00:00
ckdo
0c6678146a raop: Fix rewinding handling : process just after request received 2019-12-22 09:43:14 +00:00
RODRIGUEZ Christophe
6f48bc9508 raop: Allow channel map module argument 2019-12-20 19:49:09 +00:00
ckdo
c922e2c5b2 raop: Fix soft volume not applied on initial volume 2019-12-20 16:17:40 +01:00
Rasmus Thomsen
bff163089c meson: link libintl if it's not provided by libc
This fixes the build on musl with external gettext
2019-09-25 04:42:03 +00:00
ckdo
0d22558b47 raop: Fix non working tcp mode 2019-09-24 02:29:59 +00:00
RODRIGUEZ Christophe
2e7c0ee8f8 raop: Fix infinite loop in raop-sink with UDP mode
There are potentially unresolved issues around the EAGAIN logic, but
this should prevent an infinite loop and log flood in the mean time.

Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/695
2019-08-17 10:43:20 +00:00
Arun Raghavan
7f44a623e0 build-sys: meson: Correctly set up RPATH
This was being done automatically by autotools, now we need to manually
specify this for each executable/library with a dependency in a
non-standard directory.
2019-08-05 09:52:32 +05:30
Arun Raghavan
f996ad0688 build-sys: meson: Add -Wl,no-delete to relevant libraries
This mirrors the autotools option for all server-side dynamic libraries.
2019-08-05 09:52:32 +05:30
Arnaud Rebillout
e0f23a41e1 meson: Fix install paths
Signed-off-by: Arnaud Rebillout <arnaud.rebillout@collabora.com>
2019-06-08 11:57:00 +02:00
Arun Raghavan
37dbeae031 build-sys: Fix up meson install paths
Brings things in line with the autotools build, and adds ALSA mixer
paths and profile-sets into the meson build system as well.

The module installation path is also now customisable.
2019-06-06 18:49:59 +02:00
Tanu Kaskinen
f2199f879a raop: fix typo: modules -> modulus 2018-11-20 10:26:11 +02:00
Tanu Kaskinen
2ee5dffffb raop: add error handling to rsa_encrypt()
When reviewing another change in rsa_encrypt(), Felipe Sateler pointed
out some deficiencies in error handling. This patch adds error handling
for all openssl calls in rsa_encrypt().

This patch doesn't propagate the error all the way up to the
pa_rtsp_client owner, because there's no mechanism for doing that. I
could implement such mechanism myself, but I think it's better I don't
make such complex changes to the RAOP code, because I don't have any
RAOP hardware to test the changes. The result is that module-raop-sink
will just sit around without doing anything. I think this is still
better than having no error handling at all.
2018-11-20 10:17:17 +02:00
Arnaud Rebillout
4e6c3c0d79 meson: modules/raop: Fix rtsp_client.h include path
Signed-off-by: Arnaud Rebillout <arnaud.rebillout@collabora.com>
2018-10-04 08:44:18 +05:30
Arnaud Rebillout
4c9b6370d1 meson: Enable raop-sink module, add raop lib, add openssl dependency
Signed-off-by: Arnaud Rebillout <arnaud.rebillout@collabora.com>
2018-10-04 08:44:18 +05:30
Joseph Herlant
61d35fd22f
Fix typo: transmited -> transmitted 2018-09-17 10:02:56 -07:00
Joseph Herlant
93c07da3eb
Fix typo: definately -> definitely 2018-09-17 10:01:46 -07:00
Joseph Herlant
c1acdfee33
Fix typo: prefered -> preferred 2018-09-17 10:00:57 -07:00
Joseph Herlant
87a41d7bbb
Fix typo: comming -> coming 2018-09-17 10:00:14 -07:00
Joseph Herlant
7aa2d9e54b
Fix typo: recieved -> received 2018-09-17 09:59:38 -07:00
Raman Shyshniou
556cdfa190 optimize set_state_in_io_thread() callbacks
Source and sink are passed in arguments to set_state_in_io_thread()
callbacks. There is optimal to access them directly.
2018-06-21 06:05:36 +05:30
Tanu Kaskinen
ad0616d4c9 pass pa_suspend_cause_t to set_state_in_io_thread() callbacks
The suspend cause isn't yet used by any of the callbacks. The alsa sink
and source will use it to sync the mixer when the SESSION suspend cause
is removed. Currently the syncing is done in pa_sink/source_suspend(),
and I want to change that, because pa_sink/source_suspend() shouldn't
have any alsa specific code.
2018-03-20 13:00:44 +02:00
Tanu Kaskinen
b2537a8f38 replace sink/source SET_STATE handlers with callbacks
There are no behaviour changes, the code from almost all the SET_STATE
handlers is moved with minimal changes to the newly introduced
set_state_in_io_thread() callback. The only exception is module-tunnel,
which has to call pa_sink_render() after pa_sink.thread_info.state has
been updated. The set_state_in_io_thread() callback is called before
updating that variable, so moving the SET_STATE handler code to the
callback isn't possible.

The purpose of this change is to make it easier to get state change
handling right in modules. Hooking to the SET_STATE messages in modules
required care in calling pa_sink/source_process_msg() at the right time
(or not calling it at all, as was the case on resume failures), and
there were a few bugs (fixed before this patch). Now the core takes care
of ordering things correctly.

Another motivation for this change is that there was some talk about
adding a suspend_cause variable to pa_sink/source.thread_info. The
variable would be updated in the core SET_STATE handler, but that would
not work with the old design, because in case of resume failures modules
didn't call the core message handler.
2018-03-16 20:05:38 +02:00
Arun Raghavan
d9624e0382 build-sys: Stop using symdef headers for modules
This removes the symdef header generation m4 magic in favour of a
simpler macro method, allowing us to skip one unnecessary build step
while moving to meson, and removing an 11 year old todo!
2017-12-12 12:58:52 +05:30
Colin Leroy
937b3769b3 raop: Init dummy port and card for latency change
This adds a port, card and profile to RAOP sinks to make it
possible to change the latency at runtime (and have it persist)
using pavucontrol or pactl set-port-latency-offset.

Also move the IP:port part of the sink name to the port name.
2017-10-11 18:34:30 +03:00
Colin Leroy
77c1226181 raop: Show device codename in sink properties
This will make it easier for testers to report latency offset for their
specific hardware.
2017-10-11 18:15:05 +03:00
Peter Meerwald-Stadler
0f94657cd0 raop: Fix typo
Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-10-09 10:39:54 +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
Colin Leroy
ff49f0a5c1 raop: add latency value for Shairport RAOP server
After testing, Shairport server's latency is the same as Pioneer N30.
2017-10-08 21:14:26 +03:00
Colin Leroy
d8a2cef360 RAOP: Announce real latency
Use predefined values depending on the server, and make it configurable.
AirPlay is supposed to have 2s of latency. With my hardware, this is
more 2.352 seconds after numerous tests.
Switch from pausing/resuming the smoother to resetting it because the
smoother got stuck returning the same value after an idle/running cycle,
making latency calculation wrong.
2017-09-21 16:47:43 +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
295d4db8cf raop: silence a Coverity complaint
CID: 1398155
2017-09-05 13:46:26 +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
Peter Meerwald-Stadler
2898a5188c raop: Error out on parsing server port component
don't ignore server port parsing errors as suggested by Hajime Fujita

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
Cc: Hajime Fujita <crisp.fujita@nifty.com>
2017-03-09 13:51:51 +01:00
Peter Meerwald-Stadler
add5a175b6 raop: Log if pa_atoi() fails, latency is not used anyway
Coverity ID: #1398152

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-09 13:51:51 +01:00
Peter Meerwald-Stadler
4cfd544f21 raop: Fix potential NULL dereference
wath may be NULL, as suggested by Hajime Fujita
Coverity ID: #1398156

setting val = NULL is not needed

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
Cc: Hajime Fujita <crisp.fujita@nifty.com>
2017-03-09 13:51:51 +01:00
Peter Meerwald-Stadler
a8ce3ef844 raop: Fix potential dereference after NULL check
Coverity ID: #1398157

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-09 13:51:51 +01:00
Peter Meerwald-Stadler
74abce331b raop: Fix check for invalid file descriptor
file descriptor 0 is valid

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-08 14:31:29 +01:00
Peter Meerwald-Stadler
0cb72beace raop: Fix potential NULL dereference
'realm' is mandatory

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-07 09:47:46 +01:00
Peter Meerwald-Stadler
233cb4516a raop: Fix potential resource leaks
Coverity ID: #1410204, #1410203, #1410202, #1410201, #1410200, #1410199

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-07 09:47:46 +01:00
Peter Meerwald-Stadler
6c35ac7c8f raop: Silence unchecked return value warnings
Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-07 09:47:46 +01:00
Peter Meerwald-Stadler
20960e7cc6 raop: Fix indentation
Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-07 09:47:46 +01:00
Peter Meerwald-Stadler
94fc8c9ee2 raop: Fix potential memory leak
Coverity ID: #1410204

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-07 09:47:46 +01:00
Peter Meerwald-Stadler
4d7922d091 raop: Fix resource leaks
Coverity ID: #1398158, #1398159

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-07 09:47:46 +01:00
Peter Meerwald-Stadler
4bb25292f8 raop: Fix memleak
use local scope for trs variable simplifying cleanup
Coverity ID: #1398160

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-07 09:47:46 +01:00
Peter Meerwald-Stadler
95d850a5ad raop: Fail after search for port number
should also fail if port is 0 after the loop, as suggested by Georg Chini

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
2017-03-07 09:47:46 +01:00