Summary
Mirroring session connects and negotiates successfully (control connection stays open, /feedback heartbeats keep flowing, server logs "Mirroring initialized successfully" / opens the data port and confirms Accepted IPv6 client on socket...), but the client never opens the actual video/audio data connection. No mirroring window ever appears, since no frame data ever arrives.
Reproduced consistently across four different configurations:
-p (fixed legacy ports 7000/7001/7100 TCP, 6000/6001/7011 UDP)
-p -avdec (forced software h264 decode, ruling out a GPU/VAAPI sink issue)
- Default (no
-p, random ports)
- Default, second clean run after restarting avahi to rule out stale mDNS state
In every case: the control RTSP connection (whatever port it's on) shows ESTABLISHED and stays alive with periodic /feedback POSTs, a data port is opened and logged as ready, but ss -tnp never shows a second ESTABLISHED connection to that data port — the client simply never dials it.
Environment
- UxPlay 1.73.6 (latest release, built from AUR)
- Linux (Arch-based), Hyprland (wlroots/Wayland compositor)
-vs waylandsink and also tried default autovideosink
- Client: iPhone16,2, iOS/iPhone OS 27.0 (
osBuildVersion in the 24A53xx range), AirPlay client sourceVersion 980.67.2
Relevant detail
The client's SETUP request plist includes:
<key>combinedGetInfoWithControlSetup</key>
<true/>
This key isn't referenced anywhere in the UxPlay source as far as I can tell from the debug log's request handling — suspect the client is negotiating a different data-connection mode than the traditional separate dataPort/SETUP-per-stream flow, and since the server doesn't acknowledge/handle that request, the client never follows through with the classic dataPort connection UxPlay is waiting on.
Debug log excerpt (-d), redacted
Control connection + first SETUP (audio/timing):
SETUP <rtsp-url> RTSP/1.0
X-Apple-ProtocolVersion: 1
Content-Type: application/x-apple-binary-plist
<dict>
<key>osVersion</key><string>27.0</string>
<key>combinedGetInfoWithControlSetup</key><true/>
<key>name</key><string>iPhone</string>
<key>timingProtocol</key><string>NTP</string>
<key>sourceVersion</key><string>980.67.2</string>
<key>isScreenMirroringSession</key><true/>
<key>model</key><string>iPhone16,2</string>
<key>osName</key><string>iPhone OS</string>
</dict>
fairplay_decrypt ret = 0
Client identified as User-Agent: AirPlay/980.67.2
RTSP/1.0 200 OK
Second SETUP (video stream negotiation) — server responds with a dataPort and considers mirroring initialized:
SETUP <rtsp-url> RTSP/1.0
<dict>
<key>streams</key>
<array>
<dict>
<key>latencyMs</key><integer>100</integer>
<key>type</key><integer>110</integer>
<key>streamConnectionID</key><integer>...</integer>
</dict>
</array>
</dict>
type = 110
raop_rtp_mirror starting mirroring
raop_rtp_mirror local data port socket 28 port TCP 7100
Mirroring initialized successfully
RTSP/1.0 200 OK
<dict>
<key>streams</key>
<array>
<dict>
<key>dataPort</key><integer>7100</integer>
<key>type</key><integer>110</integer>
</dict>
</array>
</dict>
After this point, only /feedback heartbeat POSTs continue on the original control connection every ~3s. ss -tnp at any point after this never shows a connection to port 7100 (or whatever data port was negotiated in other test runs). No video pipeline ever receives a buffer, so waylandsink/autovideosink never creates a window (pipeline stays at PAUSED, never reaches PLAYING).
Question
Is combinedGetInfoWithControlSetup a known negotiation mode from newer iOS AirPlay clients that UxPlay doesn't currently implement? Happy to test any patch/branch or provide further packet captures if useful.
Summary
Mirroring session connects and negotiates successfully (control connection stays open,
/feedbackheartbeats keep flowing, server logs "Mirroring initialized successfully" / opens the data port and confirmsAccepted IPv6 client on socket...), but the client never opens the actual video/audio data connection. No mirroring window ever appears, since no frame data ever arrives.Reproduced consistently across four different configurations:
-p(fixed legacy ports 7000/7001/7100 TCP, 6000/6001/7011 UDP)-p -avdec(forced software h264 decode, ruling out a GPU/VAAPI sink issue)-p, random ports)In every case: the control RTSP connection (whatever port it's on) shows
ESTABLISHEDand stays alive with periodic/feedbackPOSTs, a data port is opened and logged as ready, butss -tnpnever shows a secondESTABLISHEDconnection to that data port — the client simply never dials it.Environment
-vs waylandsinkand also tried defaultautovideosinkosBuildVersionin the 24A53xx range), AirPlay clientsourceVersion 980.67.2Relevant detail
The client's SETUP request plist includes:
This key isn't referenced anywhere in the UxPlay source as far as I can tell from the debug log's request handling — suspect the client is negotiating a different data-connection mode than the traditional separate
dataPort/SETUP-per-stream flow, and since the server doesn't acknowledge/handle that request, the client never follows through with the classic dataPort connection UxPlay is waiting on.Debug log excerpt (
-d), redactedControl connection + first SETUP (audio/timing):
Second SETUP (video stream negotiation) — server responds with a dataPort and considers mirroring initialized:
After this point, only
/feedbackheartbeat POSTs continue on the original control connection every ~3s.ss -tnpat any point after this never shows a connection to port 7100 (or whatever data port was negotiated in other test runs). No video pipeline ever receives a buffer, sowaylandsink/autovideosinknever creates a window (pipeline stays atPAUSED, never reachesPLAYING).Question
Is
combinedGetInfoWithControlSetupa known negotiation mode from newer iOS AirPlay clients that UxPlay doesn't currently implement? Happy to test any patch/branch or provide further packet captures if useful.