Skip to content

Plan app-only AirPlay from Speakers on macOS 27 - #202

Draft
ralph wants to merge 24 commits into
mainfrom
plan/spotifly-only-airplay
Draft

ralph wants to merge 24 commits into
mainfrom
plan/spotifly-only-airplay

Conversation

@ralph

@ralph ralph commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

Starting AirPlay from Speakers should send Spotifly’s Spotify music alone while other app audio and alerts stay local. The current macOS 27 renderer has no tested bridge to the native picker. This draft specifies a second output within the existing playback owner and records disposable prototype evidence. The PR changes plans and the changelog only.

The design keeps the existing renderer for Mac output and uses AVPlayer with a complete PCM CAF for native AirPlay. Use AirPlay prepares the asset and carries the song’s media position, stream gain and play/pause intent; its bound native picker selects the destination. Return to Mac explicitly restores the existing renderer. Picker callbacks describe presentation and do not identify the receiver. The disposable one-song prototype rejects new-track commands before queue mutation and holds at native end; decoded storage is capped at 512 MiB.

The user confirms that the revised Speakers picker opens and switches to HomePod, ordinary pause/play works, and seeking works after preserving the picker/player through seek transitions. Picker volume works, but the now-playing bar’s volume has no audible effect. A separate SwiftUI defect leaves a focus ring at the slider’s former thumb position; an AppKit slider corrects the reproduced focus-mask failure in the disposable candidate. The new command trace confirms that bar volume reaches AVPlayer while playing. A separate candidate applies stream gain through the prepared CAF item’s audio mix, preserving the player/item and avoiding double gain. Offline PCM attenuation, mute, stale commands and backward-seek checks pass. The user explicitly tested this build: HomePod volume still has no audible effect, while the blue ring is gone. The PCM reader does not observe transmitted AVPlayer audio. Custom bar gain remains unresolved; a native receiver-volume menu directly in the bar is the next UX option, pending the user’s preference.

Latest verification, 2026-10-09:

  • Strict Swift 6 Release build with Swift/C warnings as errors and strict Developer ID signature verification pass.
  • All 50 signed silent handoff checks and 630 copied app unit tests pass, with no unit failures or skips and empty smoke stderr.
  • Paused PCM regression fails before the gain change, then verifies quarter/half amplitude and zero samples for mute. It uses the prepared item’s real mix and never plays audio.
  • Activated UI probe reproduces the old focus failure and verifies the new mask, real keyboard writes to the binding, accessible slider cell and disabled state. Source/generated formatting passes; production renderer/decoder fingerprints match.
  • The unchanged backend’s prior 17 controller checks and 11 converter checks remain recorded in the plan. Automated checks start no audible playback and select no receiver.

Carried audible position, explicit return and gaps/overlap still need supervised evidence. Both attempted custom-gain mechanisms failed the HomePod retry; the native receiver slider remains the working control. Supported receiver-loss protection, crash cleanup, production resource/queue/gapless behavior and negotiated AirPlay transport remain release gates. Earlier real-song playback/isolation and bounded receiver-loss observations are qualified separately in the feasibility record.

ralph added 24 commits October 3, 2026 19:14

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant