mirror of
https://github.com/lox-audioserver/lox-audioserver.git
synced 2026-04-26 06:45:47 +03:00
[GH-ISSUE #104] No AirPlay playback #50
Labels
No labels
bug
enhancement
pull-request
released
released on @beta
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
starred/lox-audioserver#50
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @kob04 on GitHub (Jan 2, 2026).
Original GitHub issue: https://github.com/lox-audioserver/lox-audioserver/issues/104
AirPlay playback doesn’t works. All setup works perfect, but no music on device.
@rudyberends commented on GitHub (Jan 2, 2026):
Do you mean AirPlay output to a zone (streaming from the audio server to an AirPlay speaker), or AirPlay input (an iPhone/Mac streaming into lox-audioserver)?
If you mean AirPlay output: were you able to set it up successfully (speaker discovery shows up, you can select it, pairing/connection works, etc.)?
To pinpoint what’s failing, I’ll need a debug log captured while you press play / start the stream, covering the few seconds before and after the attempt.
@christophpichlmaier commented on GitHub (Jan 2, 2026):
Processor] [command=audio/cfg/getservicefolder/custom/custom/start/0/20] command received
[2026-01-02T22:19:17.115Z][DEBUG][Content|Manager] [folderId=start limit=20 offset=0 service=custom user=custom] content cache miss
[2026-01-02T22:19:25.837Z][DEBUG][LoxoneHttp|Processor] [command=audio/31/serviceplay/radio/nouser/https://live-nors.sharp-stream.com/nors19.mp3/?q&ZW5mb3JjZVVzZXI9dHJ1ZQ] command received
[2026-01-02T22:19:25.838Z][INFO][Zones|Manager] [hasParentContext=false normalizedTarget=https://live-nors.sharp-stream.com/nors19.mp3 resolvedTarget=https://live-nors.sharp-stream.com/nors19.mp3 station="" type=serviceplay uri=https://live-nors.sharp-stream.com/nors19.mp3 zoneId=31] playContent
[2026-01-02T22:19:25.839Z][DEBUG][Zones|Manager] [expandedCount=0 isAppleMusic=false isMusicAssistant=false queueSourcePath=https://live-nors.sharp-stream.com/nors19.mp3 resolvedTarget=https://live-nors.sharp-stream.com/nors19.mp3 zoneId=31] queue build resolved
[2026-01-02T22:19:25.840Z][DEBUG][Zones|Manager] [authority=local items=1 startIndex=0 target=https://live-nors.sharp-stream.com/nors19.mp3 zoneId=31] queue rebuilt
[2026-01-02T22:19:25.841Z][DEBUG][Audio|UrlProxy] [proxyUrl=http://127.0.0.1:7090/streams/proxy?u=https%3A%2F%2Flive-nors.sharp-stream.com%2Fnors19.mp3 targetUrl=https://live-nors.sharp-stream.com/nors19.mp3] proxying audio url for ffmpeg
[2026-01-02T22:19:25.842Z][INFO][Audio|Manager] [hasStream=false label=https://live-nors.sharp-stream.com/nors19.mp3 sourceKind=url zoneId=31] startWithResolvedSource
[2026-01-02T22:19:25.842Z][INFO][Audio|Manager] [handoff=false kind=url profiles=["mp3"] zoneId=31] starting audio engine
[2026-01-02T22:19:25.843Z][INFO][Audio|Session] [maxBufferBytes=8192 outputBitDepth=16 outputChannels=2 outputSampleRate=44100 profile=mp3 targetLeadMs=1000 zoneId=31] audio session buffer config
[2026-01-02T22:19:25.843Z][DEBUG][Audio|Session] [args=["-hide_banner","-loglevel","error","-fflags","nobuffer","-probesize","32k","-analyzeduration","0","-reconnect","1","-reconnect_streamed","1","-reconnect_delay_max","5","-i","http://127.0.0.1:7090/streams/proxy?u=https%3A%2F%2Flive-nors.sharp-stream.com%2Fnors19.mp3","-vn","-acodec","libmp3lame","-ar","44100","-ac","2","-b:a","256k","-af","aresample=resampler=soxr:precision=28:cutoff=0.97:async=1","-f","mp3","pipe:1"] outputBitDepth=16 outputChannels=2 outputSampleRate=44100 profile=mp3 zoneId=31] spawning ffmpeg
[2026-01-02T22:19:25.847Z][INFO][Audio|Engine] [profile=mp3 source=url zoneId=31] audio session started
[2026-01-02T22:19:25.848Z][INFO][Audio|Manager] [source=https://live-nors.sharp-stream.com/nors19.mp3 stream=31-1d10c39a-c847-49d5-a5e3-e9fe9fab113c title="The Beat (Oslo)" zoneId=31] playback started
[2026-01-02T22:19:25.849Z][DEBUG][Zones|Manager] [action=play transportCount=0 transportTypes=[] zoneId=31] dispatchTransports
[2026-01-02T22:19:25.899Z][DEBUG][LoxoneHttp|Processor] [command=audio/31/recent] command received
[2026-01-02T22:19:27.415Z][INFO][Audio|Session] [bytes=116 profile=mp3 zoneId=31] ffmpeg first chunk
[2026-01-02T22:19:38.532Z][DEBUG][LoxoneHttp|Processor] [command=audio/31/pause] command received
[2026-01-02T22:19:38.533Z][INFO][Audio|Engine] [zoneId=31] audio session stopped
[2026-01-02T22:19:38.534Z][DEBUG][Audio|Manager] [source=https://live-nors.sharp-stream.com/nors19.mp3 zoneId=31] playback paused
[2026-01-02T22:19:38.534Z][DEBUG][Zones|Manager] [action=pause transportCount=0 transportTypes=[] zoneId=31] dispatchTransports
[2026-01-02T22:19:38.535Z][DEBUG][Zones|Manager] [action=pause transportCount=0 transportTypes=[] zoneId=31] dispatchTransports
[2026-01-02T22:19:38.958Z][DEBUG][Audio|Session] [zoneId=31] ffmpeg stdout closed
[2026-01-02T22:19:38.958Z][INFO][Audio|Session] [bufferedBytes=7523 code=255 earlyExit=false runMs=13114 signal=null stderr=undefined stderrAt=undefined subscribers=0 totalBytes=636249 zoneId=31] ffmpeg exited
[2026-01-02T22:19:42.450Z][DEBUG][LoxoneHttp|WS] [total=3] ws disconnected
[2026-01-02T22:24:27.936Z][DEBUG][LoxoneHttp|Processor] [command=audio/cfg/miniservertime
@kob04 commented on GitHub (Jan 3, 2026):
Hi,
I’ve conducted several tests with the following results:
1/ AirPlay (output)
2/ Sonos (S2)
3/ Other observations
⸻
Everything is running on: Proxmox, VM, DietPi.
LogFile attached.
lox-audioserver-logs-2026-01-03T09-51-59-044Z.txt
Thanks a lot for your work – and if there’s a way to support the project, I’d be happy to contribute ($)!
@rudyberends commented on GitHub (Jan 3, 2026):
I will come back on the airplay issues. I do not have any issues, but I will test it on a HomePod to see if I can reproduce it.
With the latest testing release the 120 second tunein should be resolved.
Apple Music directly as a provider works (I use this myself a lot), but there is a caveat.
On the first playback attempt, a widevine_cdm directory is created inside the data directory. This directory contains two files, but these are dummy placeholder files only. They exist so the application can resolve the expected paths, but they are not functional and do not allow actual playback.
To make Apple Music work, these dummy files must be replaced with real Widevine CDM files for playback to succeed.
I’m intentionally not including these binaries in the repository, as it is unclear to me whether redistributing Widevine CDM files is legally permitted. They are on the filesystem of a MA installation however, so you could get them from there. You only need to obtain the files ones. They never change.
@kob04 commented on GitHub (Jan 3, 2026):
Can you please tell me where I can find those two files in MA?
@rudyberends commented on GitHub (Jan 3, 2026):
not sure. Just use find
find / -name *_cdm@simon2207 commented on GitHub (Jan 3, 2026):
Couldn´t find those files... either...
"On the first playback attempt, a widevine_cdm directory is created inside the data directory."
Widevine CDM files are not visible in my MusicAssistant Data Folder ( Docker / Synology )
@rudyberends commented on GitHub (Jan 3, 2026):
They are there. Using that exact find command will show you the path.
You might need to restart the code once after adding the Apple Music provider. Then play a track and the widevine files will be created.
@simon2207 commented on GitHub (Jan 3, 2026):
@rudyberends you were right with the restart of lox-audio server services - so I was able to find the widevine_cdm directory.
But those dummy files:
private_key.pem
client_id.bin
are not within any Music Assistant Folder...
Simon@Synology:
$ sudo find / -name private_key.pem$ sudo find / -name client_id.bin/volume1/@appdata/ContainerManager/all_shares/docker/lox-audioserver/data/widevine_cdm/private_key.pem
/volume1/docker/lox-audioserver/data/widevine_cdm/private_key.pem
/volume1/@docker/btrfs/subvolumes/e7f5fac30250c0914b19cce4e25444d69a7f4148d813c237dc4dd4a1f4044386/usr/local/bin/widevine_cdm/private_key.pem
/volume1/@docker/btrfs/subvolumes/2fb7f7bebf8218989b8cd923a9d56ea05587c00e68f793aca1b0e2f4b80e07d8/usr/local/bin/widevine_cdm/private_key.pem
/volume1/@docker/btrfs/subvolumes/5ec730e774b35ddaa29e3c1f82d3570ed4cb0266fd5676088d23e8a9d0dd746b/usr/local/bin/widevine_cdm/private_key.pem
/volume1/@docker/btrfs/subvolumes/1bcfe281812772b495fed0dd41af900cc5079772b5f22754902cfe430d4a9979/usr/local/bin/widevine_cdm/private_key.pem
/volume1/@docker/btrfs/subvolumes/8d7e8c706fdf3541d23951fd2020c9664b96b733535024e47c1e664d18b34f54/usr/local/bin/widevine_cdm/private_key.pem
/volume1/@docker/btrfs/subvolumes/28f24dc3e1353c40f9b8d374ed191ec7104c61c5a16ab92ddd68af0c0d7f5e52/usr/local/bin/widevine_cdm/private_key.pem
/volume1/@docker/btrfs/subvolumes/20a1e72b8e8021ca38c601f846c6d9941978b2b34a7b2d3eb457b755430360b4-init/usr/local/bin/widevine_cdm/private_key.pem
/volume1/@docker/btrfs/subvolumes/20a1e72b8e8021ca38c601f846c6d9941978b2b34a7b2d3eb457b755430360b4/usr/local/bin/widevine_cdm/private_key.pem
^C
Simon@Synology:
/volume1/@appdata/ContainerManager/all_shares/docker/lox-audioserver/data/widevine_cdm/client_id.bin
/volume1/docker/lox-audioserver/data/widevine_cdm/client_id.bin
/volume1/@docker/btrfs/subvolumes/e7f5fac30250c0914b19cce4e25444d69a7f4148d813c237dc4dd4a1f4044386/usr/local/bin/widevine_cdm/client_id.bin
/volume1/@docker/btrfs/subvolumes/2fb7f7bebf8218989b8cd923a9d56ea05587c00e68f793aca1b0e2f4b80e07d8/usr/local/bin/widevine_cdm/client_id.bin
/volume1/@docker/btrfs/subvolumes/5ec730e774b35ddaa29e3c1f82d3570ed4cb0266fd5676088d23e8a9d0dd746b/usr/local/bin/widevine_cdm/client_id.bin
/volume1/@docker/btrfs/subvolumes/1bcfe281812772b495fed0dd41af900cc5079772b5f22754902cfe430d4a9979/usr/local/bin/widevine_cdm/client_id.bin
/volume1/@docker/btrfs/subvolumes/8d7e8c706fdf3541d23951fd2020c9664b96b733535024e47c1e664d18b34f54/usr/local/bin/widevine_cdm/client_id.bin
/volume1/@docker/btrfs/subvolumes/28f24dc3e1353c40f9b8d374ed191ec7104c61c5a16ab92ddd68af0c0d7f5e52/usr/local/bin/widevine_cdm/client_id.bin
/volume1/@docker/btrfs/subvolumes/20a1e72b8e8021ca38c601f846c6d9941978b2b34a7b2d3eb457b755430360b4-init/usr/local/bin/widevine_cdm/client_id.bin
/volume1/@docker/btrfs/subvolumes/20a1e72b8e8021ca38c601f846c6d9941978b2b34a7b2d3eb457b755430360b4/usr/local/bin/widevine_cdm/client_id.bin
Simon@Synology:~$
@rudyberends commented on GitHub (Jan 3, 2026):
@simon2207 commented on GitHub (Jan 3, 2026):
Got them with a little help of ChatGPT:
Schritt 1: Dateien aus dem Container heraus kopieren
NICHT direkt aus dem @docker/btrfs-Pfad arbeiten.
Container ermitteln
docker ps
Angenommen der Container heißt:
music_assistant
Dateien aus dem Container nach DSM kopieren
Wir kopieren sie in ein sauberes, dauerhaftes Verzeichnis:
mkdir -p /volume1/docker/music_assistant/widevine
docker cp music_assistant:/usr/local/bin/widevine_cdm/client_id.bin
/volume1/docker/music_assistant/widevine/
docker cp music_assistant:/usr/local/bin/widevine_cdm/private_key.pem
/volume1/docker/music_assistant/widevine/
Prüfen:
ls -l /volume1/docker/music_assistant/widevine
NOW - Apple Music is working!!!
Without MA dependence... Excellent but not easy... ;-)
@kob04 commented on GitHub (Jan 5, 2026):
Why is playback via still choppy? I also have MA on the same VM and everything is fine, so it's not the VM environment.
The transmission is jerky even when using MA zones as output. TuneIn playback is seamless.
In my opinion, the problem lies in the time delay, but I don't know why.
20:40:14: AirPlay requests to start streaming.
20:40:18: FFmpeg sends the first data only after 4 seconds.
[2026-01-05T20:40:12.466Z][INFO][Zones|Manager] [hasParentContext=false normalizedTarget=spotify@bridge-applemusic-761lwx:playlist:b64_cGwucG0tMjBlOWYzNzM5MTlkYTA4MDY1ZjEwZjFkM2NkY2JkY2Q= resolvedTarget=spotify@bridge-applemusic-761lwx:playlist:b64_cGwucG0tMjBlOWYzNzM5MTlkYTA4MDY1ZjEwZjFkM2NkY2JkY2Q= station="" type=serviceplay uri=spotify@bridge-applemusic-761lwx:playlist:b64_cGwucG0tMjBlOWYzNzM5MTlkYTA4MDY1ZjEwZjFkM2NkY2JkY2Q= zoneId=2] playContent
[2026-01-05T20:40:13.940Z][INFO][Content|AppleMusicStream] [isLibrary=false keyUri=data:;base64,AAAAAG6942UAHXPN99s9uQ== trackId=1857938277] Apple Music DRM: starting key extraction (new format)
[2026-01-05T20:40:14.362Z][INFO][Content|AppleMusicStream] [keyPreview=c9918f66bf6b018e...] DRM key extracted successfully
[2026-01-05T20:40:14.362Z][INFO][Content|AppleMusicStream] [keyPreview=c9918f66bf6b018e...] DRM key ready, streaming with decryption
[2026-01-05T20:40:14.437Z][INFO][Audio|Manager] [hasStream=false label=applemusic sourceKind=url zoneId=2] startWithResolvedSource
[2026-01-05T20:40:14.437Z][INFO][Audio|Manager] [handoff=true kind=url profiles=["pcm"] zoneId=2] starting audio engine
[2026-01-05T20:40:14.438Z][INFO][Audio|Session] [maxBufferBytes=98304 outputBitDepth=16 outputChannels=2 outputSampleRate=44100 profile=pcm targetLeadMs=1000 zoneId=2] audio session buffer config
[2026-01-05T20:40:14.439Z][INFO][Audio|Engine] [profile=pcm source=url zoneId=2] audio session started (handoff)
[2026-01-05T20:40:14.440Z][INFO][Audio|Manager] [source=applemusic stream=2-6c5f31cb-43c2-4c3c-9142-07d71635c3d5 title="Jsou tu Vánoce (feat. Unique Quartet)" zoneId=2] playback started
[2026-01-05T20:40:14.440Z][INFO][Transport|AirPlay] [channels=2 pcmBitDepth=16 sampleRate=44100 zoneId=2] AirPlay output format
[2026-01-05T20:40:14.440Z][INFO][Transport|AirPlay] [clientId=192.168.1.168:7000 zoneId=2 zoneName="Stereo výstup 1 - Levá"] AirPlay play requested
[2026-01-05T20:40:14.440Z][INFO][Audio|Session] [maxBufferBytes=98304 outputBitDepth=16 outputChannels=2 outputSampleRate=44100 profile=pcm targetLeadMs=1000 zoneId=2] audio session buffer config
[2026-01-05T20:40:14.454Z][INFO][Transport|AirPlay] [inputUrl=null source=applemusic zoneId=2 zoneName="Stereo výstup 1 - Levá"] AirPlay starting stream
[2026-01-05T20:40:18.069Z][INFO][Audio|Session] [bytes=32768 profile=pcm zoneId=2] ffmpeg first chunk
[2026-01-05T20:40:18.070Z][INFO][Transport|AirPlaySender] [host=192.168.1.168] airplay sender started
[2026-01-05T20:40:18.070Z][INFO][Transport|AirPlayFlow] [clientId=192.168.1.168:7000 hasSharedSource=true targetUrl=undefined zoneId=2] airplay client started
[2026-01-05T20:40:18.071Z][INFO][Audio|Session] [bytes=65536 profile=pcm zoneId=2] ffmpeg first chunk
[2026-01-05T20:40:18.071Z][INFO][Audio|Engine] [zoneId=2] audio handoff complete
@rudyberends commented on GitHub (Jan 5, 2026):
It’s a bit more complicated than that. The root cause is in the code itself. There are protocol extensions in place that enable time-synchronized audio, and especially the HomePods are extremely sensitive to this. Everything is implemented entirely on the server, mostly written from scratch, without the use of external binaries, so it’s not a matter of simply flipping a switch, or change a parameter to make it work.
I will fix it, but there are multiple issues and it will take some time.
@rudyberends commented on GitHub (Jan 11, 2026):
The latest version includes significantly improved AirPlay output support. It is not perfect yet, but it should be much better than before.
Please make sure you are running the latest version (v4.0.0-20260111152632) if you want to test it.