openairplay / airplay2-receiver

AirPlay 2 Receiver - Python implementation
2.12k stars 131 forks source link

Distorted Audio iPhone to macOS #61

Closed tiziano149 closed 1 year ago

tiziano149 commented 2 years ago

The problem

Hello openairplay community,

I'm trying to run airplay2-receiver on macOS 12.2.1. Installed it like this:

brew install python3 brew install portaudio virtualenv -p /usr/local/bin/python3 proto source proto/bin/activate pip install -r requirements.txt pip install --global-option=build_ext --global-option="-I/usr/local/Cellar/portaudio/19.6.0/include" --global-option="-L/usr/local/Cellar/portaudio/19.6.0/lib" pyaudio

python ap2-receiver.py -m myap2 --netiface=en0

Managed to get it running, name shows up as "none" on my iPhone which seems weird but works. Audio playback is distorted and jagged and breaks down after around 30s.

Any Ideas?

Thank you very much

Tiziano

Receiver: Name: None Receiver: Enabled features: 0001c300405f4200

Receiver: Interface: en0 Receiver: Mac: 24:4f:27:5c:8b:b2 Receiver: IPv4: 192.168.178.20 Receiver: IPv6: fe70::1c23:b1e4:3b9f:611d Receiver: [asyncio]: Using selector: KqueueSelector Receiver: mDNS: service registered Receiver: Starting RTSP server, press Ctrl-C to exit... Receiver: serving on 192.168.178.20:7000 [AP2Server: 192.168.178.20:7000]: Opened connection from 192.168.178.21:50315 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: {'qualifier': ['txtAirPlay']} AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: Sending our device info [AP2Server: 192.168.178.20:7000]: Thread-2: Opened HAPSocket from 192.168.178.21:50315 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SETUP: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: GET_PARAMETER: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: GET_PARAMETER: b'volume' AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: RECORD: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SETPEERS: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: '192.168.178.20', '192.168.178.21', 'fe80::85f:6486:795a:c12b': SETUP: rtsp://192.168.178.20/6306729490375921051 [utils] removing StreamHandler from Audio.debug file logger [Audio.debug] file logging level: DEBUG AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: [asyncio]: Using selector: KqueueSelector AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: b'progress' => b' 633735024/650449316/647859945' AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: FLUSH: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: rtsp://192.168.178.20/6306729490375921051

dmap.persistentid: 0x49922e063b9651f0 daap.songalbum: Lonerism daap.songartist: Tame Impala dmap.itemname: Sun's Coming Up

AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: rtsp://192.168.178.20/6306729490375921051

dmap.persistentid: 0x49922e063b9651f0 daap.songalbum: Lonerism daap.songartist: Tame Impala dmap.itemname: Sun's Coming Up dacp.playerstate: Playing

AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: b'progress' => b' 637874142/650455300/651999063' [AudioRealtime]: audioDevicelatency (sec): 0.00108 [AudioRealtime]: pyAudioDelay (sec): 0.00447 [AudioRealtime]: Total sample_delay (sec): 0.00755 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: b'volume' => b' -15.075000' AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: b'volume' => b' -16.950001' AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: rtsp://192.168.178.20/6306729490375921051 AP2Handler: 192.168.178.20:7000<=>192.168.178.21:50315; Thread-2: SET_PARAMETER: b'volume' => b' -18.825001' [AudioRealtime]: requesting resend of sequence_no 47621; amt 7 [AudioRealtime]: requesting resend of sequence_no 47635; amt 7

[AudioRealtime]: requesting resend of sequence_no 49789; amt 2 Exception in thread Thread-2: (relative to self)
Traceback (most recent call last): File "/usr/local/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 973, in _bootstrap_inner self.run() File "/usr/local/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 910, in run self._target(*self._args, **self._kwargs) File "/Users/tiziano/Downloads/airplay2-receiver-master/ap2/connections/audio.py", line 738, in play pkt = RTP_REALTIME(data) File "/Users/tiziano/Downloads/airplay2-receiver-master/ap2/connections/audio.py", line 123, in init fbit = extra_hdr[0] & 0b10000000 IndexError: index out of range [AudioRealtime]: requesting resend of sequence_no 49798; amt 1 [AudioRealtime]: requesting resend of sequence_no 49807; amt 7

What commit exhibits the issue?

master

Was there a last known working commit?

No response

What type of installation are you running?

virtualenv

With which python3 version do you run Receiver?

python3

OS the receiver runs on

macOS 12.2.1

OS the sender runs

iPhone iOS 13

Which sender client was used

Spotify

Command invocation

python ap2-receiver.py -m myap2 --netiface=en0

Please include --debug output which helps to illustrate the problem

No response

Additional information

No response

systemcrash commented 2 years ago

At last - a coherent bug report :)

I would hazard a guess that your WiFi channel is very noisy. real-time playback is most sensitive and susceptible to packet loss, which the log messages requesting resend indicate. If it's possible to have your receiver device on a wired connection, many problems should disappear. People with noisy WiFi areas (built up residential blocks) might suffer, here.

What's weird is the trace-back indicates that you are in a code-path unreachable if you are not using a flag for audio redundancy, which is off by default. This suggests a corrupted packet arrived...? I will put packet handling within a try..except clause to improve things there.

You might also look in audio around line 520 for


        audioDevicelatency = \
            self.pa.get_default_output_device_info()['defaultLowOutputLatency']

and change to defaultHighOutputLatency if any problems persist.

systemcrash commented 2 years ago

What is your router - and does it have WMM extensions on? Curious also ios subversion.

Neustradamus commented 1 year ago

@tiziano149: Have you seen the last comment of @systemcrash?