Skip to content

Sound: Send Audio and Mute as switches in the device's Settings panel, the bar's button gone - #235

Merged
Saffsanity merged 7 commits into
mainfrom
sound-toggle
Oct 27, 2026
Merged

Saffsanity merged 7 commits into
mainfrom
sound-toggle

Conversation

@Saffsanity

Copy link
Copy Markdown
Owner

Noah's decision (2026-10-27)

I've decided the audio setting should not be in the main button tray but instead in settings. Sound should be a toggle in the settings menu.

He also asked why the iPad's Send Audio row was greyed out: since the beta (#94, the plan's Q8) it was read-only, the Mac's alone. Settled as two switches in the device's Settings panel:

  • Send Audio (the Mac's group, with its Beta tag): turns the Mac's Send Audio on and off, for every connected device, saved on the Mac like Quality.
  • Mute (This iPad / This iPhone): this device's own playback, remembered, never sent. It replaces the bar's Sound button, which is gone from every bar.

The Mac's own switch (the menu's "Send Audio (Beta)", Settings › Streaming) and the CLI's --audio stay as they were.

The Mac (host)

  • DeviceSettings.accepted takes a device's sendAudio, on or off, from either door, the way it takes Prioritize Speed. sendAudioRefusal is gone.
  • Sill.app's existing hook lays the change over its settings and saves it like a menu click (applying, or applyingAway for a device away from home; both put it on the one shared value).
  • Send Audio is still not in restartNeeded: a device's change starts or stops the sound's own stream and never restarts the picture, just as the Mac's own switch does.
  • The log says Settings from ‹device›: send audio off → on. Kind 16 tells every device, as it already did.
  • Settings › Streaming's footnote said "each device can mute it with its Sound button. Only this Mac turns it on." Both parts are now false, so it now reads: "… A connected iPhone or iPad can also turn this on or off from Sill’s settings there, and mute it for itself alone. Nothing is recorded." This is the only change to the Mac's previews.

The device

The Mac's group: Send Audio is a real switch again. It goes through the settings ledger like the other controls, with its pending spinner after the "Beta" tag. VoiceOver reads it as "Send Audio, beta".

  • On: "Beta. Every connected device hears what streams, and ‹Mac› keeps playing it too. To silence only this iPad, turn on Mute below." While this device is muted, the last sentence becomes "This iPad is muted (Mute, below)."
  • Off: "Beta. Turn this on to hear what streams on every connected device; ‹Mac› keeps playing it too."
  • A Mac without sound (kind 16 has no sendAudio: Sill for Mac 0.5.1 and older): the row shows off and disabled, with "Beta. Update Sill on ‹Mac› to hear its sound on this iPad." Before, there was no row at all.

This iPad: Mute.

  • It comes first in the group. On means muted (soundMuted / Sill.soundMuted, kept as before).
  • Footnote: "Silences ‹Mac›’s sound on this iPad alone; ‹Mac› keeps sending it and playing it." VoiceOver reads "Mute sound from ‹Mac›".
  • When it shows (my call): for every Mac with sound, whether Send Audio is on or off (its kind 16 carries sendAudio). It also stays through a move's hand-over.
    • Why: any device can now turn the sound on for every device, so each device should be able to keep itself silent beforehand. The row also never jumps in and out as Send Audio flips.
    • It is hidden for a Mac without sound: there is nothing to mute, and that Mac's Send Audio row already says to update it.
  • Unplugging headphones still mutes, and the switch shows it.

No Sound button in any bar: landscape, the iPad's portrait window bar, a phone's rows and the Duo's bars.

The harness:

  • -SillSound on|muted now sets Send Audio on with Mute off or on.
  • The mock's default settings case is now a Mac with sound and Send Audio off. It used to be a Mac without sound, so every mock panel photo now shows the Send Audio row and Mute. A new nosound case covers a Mac without sound.
  • -SillSettingsScroll mute scrolls to the Mute switch. -SillSoundToggle and -SillSoundSwitchAt now flip Mute.
  • -SillSettingsScript's set sendAudio=1|0 is the device's Send Audio switch.

Docs

  • docs/audio-plan.md: the header, Controls, §3.5, §4.1, §5, §6, §7.5–§7.8, H7, S2, Q5, Q8, Q10 and "The beta" are each marked where they changed. A last section, "Two switches in the device's Settings panel", has the changes, the checks and what was verified.
  • CLAUDE.md: a bullet in The Mac's sound on the device: Send Audio, kind 43, AAC-ELD (#83) #94's entry, plus its Layout, Build and run and Decisions lines.
  • README, the site inside its <!-- Sound markers, docs/app-store-metadata.md (the bullet, What's New and their counts; the review notes unchanged), BRIEF.md and DEVELOPMENT.md.
  • On the site, nothing new is collected: the device's change is already among "changes you make in Sill’s settings panel", and the mute was already kept. privacy.html's date is now October 27, 2026.

Compatibility

  • No wire change. Kind 17's sendAudio was always on the wire; only the host's acceptance changes.
  • This build against a Mac from the beta (main 2026-10-20 to 27): that Mac refuses the change (Settings from ‹device› refused: send audio (set on this Mac only)). The switch goes back to the Mac's value with the warning haptic (an iPad has none) and VoiceOver's "‹Mac› kept its setting". Checked live against main's CLI.
  • This build against a Mac without sound (Sill for Mac 0.5.1, the public release): the row is disabled and says to update. The ledger never sends the field there.
  • An older device against this Mac: a device from the beta shows the Mac's value read-only, including a change another device made. A device without sound ignores the field.

Verified

All on this Mac, which was shared with other work (load average 7 to 352). Every heavy step ran or resumed only while the 1-minute load was under 20.

Builds (only the known warnings):

  • swift build -c release: only the CaptureProbe warning.
  • The iOS app with Xcode 27.1 (27A9275): Debug for the generic simulator as CI builds it, Release for the generic simulator, and Debug for a generic device. Only the known StreamClient capture warning.
  • The second commit's state (no button, the panel as the beta had it): Debug for the simulator, the same warning only.

Checks:

  • Tests/checks/run-all.sh: all 54. message-reader, which compiles nothing this branch touches, was rerun on its own. Its first run failed its timed slow case only because the load rule paused it for 35 s.
  • away-quality: 89 checks, 26 of 26 mutants caught.
  • ledger: 100 checks, 12 of 12 mutants.
  • phone-portrait: 484 checks, 73 of 73 mutants.
  • tour: 111,189 checks, 84 of 84 mutants.

H2 (main's CLI at b4caa91 against this one, both --synthetic on loopback with the software encoder):

  • Idle 2.7 min: identical, masked and sorted.
  • With a Desktop client: identical but for one second's cursor.shape in main's run.
  • With a client whose hello plays sound (--hello=0.6 --audio): identical but for two seconds' cursor.shape in this run. Neither host sent sound (Send Audio off).

H7 (SillHost --synthetic without --audio, and sillclient.py PORT 12 desktop --audio --set=sendAudio=1@3 --set=sendAudio=0@8 --expect=sendAudio=0):

  • At 3 s, Settings from sillclient: send audio off → on. The format and first packet came 12 ms after the answer.
  • 500 packets with 0 seq gaps.
  • At 8 s, send audio on → off, then Audio stopped: Send Audio is off.
  • The picture never restarted. EXPECT ok.
  • A second client joined without a pick: its kind 16 said sendAudio 1, then 0, and it got the same 500 packets.

Previews (the bare SillMenuBar, main against this branch, from one path): 146 files each. Only pane-streaming-light.png and pane-streaming-dark.png differ (the footnote). menu.txt is unchanged.

Harness photos (private iPad Pro 13" simulator on iOS 27.0, deleted after):

  • Every bar of this build with the Mac sending sound (-SillSound on) is pixel for pixel main's with sound off:
    • landscape 1000×710
    • the iPad's portrait window bar 710×1000
    • a phone upright, 393×793 and 375×647
    • the Duo's 951×669 flat and half, 669×951 half, 466×678 and 678×466 closed
  • The panel at 1000×710 and 710×1000, default text and accessibility-extra-large. Against main's, only three things differ:
    • the bar (no Sound button)
    • the Send Audio row (an enabled switch, its footnote)
    • This iPad's first row (Mute, for "Sound from ‹Mac›")
  • Also photographed: soundoff, nosound, soundnote, Mute on, and a phone's panel.
  • The photos (mock harness only, nothing of this Mac's) are in ~/Downloads/sill-handoff/sound-toggle/ (INDEX.md).

Live (that simulator against SillHost --synthetic, engine rendering offline at volume 0):

  • Send Audio switch on: the host logs Settings from Sill sound-toggle iPad (iPad17,4 simulator): send audio off → on. The console shows audio: format aac-eld 48000 Hz 2 ch, 480 frames (priming 240), epoch 1, a test tone and engine on, manual rendering.
  • Mute on: engine off (muted). The panel shows Mute on and "This iPad is muted (Mute, below)."
  • Mute off: unmuted, then the engine on again with one join and no jump.
  • Every click was heard within 0.1 ms of its place.
  • Send Audio switch off: send audio on → off and Audio stopped: Send Audio is off. The device's idle, engine off came 10 s later, and Mute stayed shown.
  • A watching client got 1,299 packets with 0 gaps; the device's Mute changed nothing it was sent.
  • Against main's CLI (a beta host): the host logs refused: send audio (set on this Mac only) and the switch is back off.

For Noah (untested on devices)

On the iPad and iPhone with this Sill.app:

  • Send Audio from the iPad's panel: the iPhone hears it too, and Sill.app's menu and Settings show it.
  • Mute on one device while the other plays.
  • Mute set before another device turns Send Audio on.
  • VoiceOver on both switches.
  • This iPad against a Sill.app from the beta (the switch goes back) and against 0.5.1 (the row disabled, "Update Sill…").

Open points

  • When Mute shows (the default I took): for every Mac with sound, whether Send Audio is on or off, so a device can stay silent before another device turns the sound on. The alternative is only while Send Audio is on.
  • The mock's default settings case is now a Mac with sound (Send Audio off). Every mock panel photo now shows the Send Audio and Mute rows. nosound is a Mac without.
  • Sill.app's Settings › Streaming footnote changed (see above). Its old words became false; this is the one change on the Mac's previews.
  • A beta host refusing gives no visible reason: on an iPad (no haptics) the switch just goes back, and VoiceOver says "‹Mac› kept its setting". Only unreleased main builds from 2026-10-20 to 27 refuse.
  • The App Store review notes are unchanged (3,995 of 4,000 bytes). Their WHAT TO TRY line names the Sill menu, which still works.

🤖 Generated with Claude Code

Saffsanity and others added 6 commits October 27, 2026 03:20
Noah: "I've decided the audio setting should not be in the main button
tray but instead in settings. Sound should be a toggle in the settings
menu." The beta (fdf78ff) had made Send Audio the Mac's alone, so the
device's row was read-only ("why is it greyed out"). The host takes a
device's kind 17 sendAudio again, on or off, from either door:

- DeviceSettings.accepted carries it as Prioritize Speed (a switch,
  nothing to check); sendAudioRefusal goes. Sill.app's hook lays it over
  its settings and saves it as a menu click (applying, or applyingAway
  for a device away, which passes it on to the one shared value).
- Not in restartNeeded: as with the Mac's own switch, a device's change
  starts or stops the sound's stream and never restarts the picture. The
  log: "Settings from <device>: send audio off -> on"; kind 16 tells
  every device, as before.
- Settings > Streaming's footnote said "each device can mute it with its
  Sound button. Only this Mac turns it on.": now that a device can turn
  it on, and mutes itself from its Settings panel. The menu's "Send
  Audio (Beta)", its switch and the CLI's --audio are as they were.
- away-quality: the Send Audio cases turn to acceptance (applied on or
  off, at home and away, with the rest of the change and nothing
  refused; on the shared value from both routes, never a quality pair;
  the log's words both ways): 89 checks. AQ20-AQ24 become mutants of
  that, with AQ25 and AQ26 (applying and applyingAway dropping it): 26 of
  26 caught.
- ledger: its model gains a host from the beta, which refuses a device's
  Send Audio while its own menu sets it (the switch goes back; every run
  converges): 100 checks, 12 of 12 mutants.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
"I've decided the audio setting should not be in the main button tray
but instead in settings." The bars' Sound button goes from every bar:
the landscape bar (TopBar's soundFits and SoundButton), the iPad's
portrait window bar, a phone's rows (phoneRow2) and the iPhone Duo's.
Every bar is main's before the sound (c215514) again:
PortraitStreamScreen.swift, PhonePortraitLayout.swift (sound,
menusBesideSound and stripBesideBoth gone) and MacMenuButton.swift byte
for byte, StreamScreen.swift's bar but for a comment. The device's own
mute moves to its Settings panel (the next commit).

- phone-portrait and tour are c215514's again: 484 checks and 73 of 73
  mutants, 111,189 and 84 of 84.
- Harness photos on a private iPad simulator (iOS 27.0), this build with
  the Mac sending its sound (-SillSound on) against main's build with it
  off: pixel for pixel equal in the landscape bar (1000x710), the iPad's
  portrait window bar (710x1000), a phone upright (393x793, 375x647) and
  the Duo's (951x669 flat and half, 669x951 half, 466x678 and 678x466
  closed).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Noah (2026-10-27): "Sound should be a toggle in the settings menu", as
two switches: Send Audio, the Mac's, set from here for every device as
Quality is, and Mute, this device's own playback, in place of the bars'
Sound button.

- The Mac's group: Send Audio is a switch again, through the ledger
  (binding(send) { HostSettingsChange(sendAudio: $0) }), its pending
  spinner after the "Beta" tag, "Send Audio, beta" to VoiceOver. On:
  "Beta. Every connected device hears what streams, and <Mac> keeps
  playing it too. To silence only this <device>, turn on Mute below."
  (while muted: "This <device> is muted (Mute, below)."); off: "Beta.
  Turn this on to hear what streams on every connected device; <Mac>
  keeps playing it too." A Mac without sound (kind 16 without sendAudio:
  Sill for Mac 0.5.1 and older) shows the row off and disabled, with
  "Beta. Update Sill on <Mac> to hear its sound on this <device>." A Mac
  from the beta refuses the change: the switch goes back with the
  warning haptic, as any refusal does.
- This iPad (or iPhone): Mute first in the group, on mutes (soundMuted,
  kept as Sill.soundMuted, never sent), "Silences <Mac>'s sound on this
  <device> alone; <Mac> keeps sending it and playing it.", VoiceOver's
  "Mute sound from <Mac>". It shows for every Mac with sound, Send Audio
  on or off (macHasSound: kind 16 carries sendAudio; across a move's
  hand-over what the last connection said), so a device can keep itself
  silent before any device turns the sound on, and the row never comes
  and goes with that switch; none for a Mac without sound.
- soundAvailable becomes macHasSound; toggleSound goes. The harness:
  -SillSound on|muted sets Mute; the mock's default is a Mac with sound,
  Send Audio off (it was one without), nosound one without (nodirect too);
  -SillSettingsScroll mute; -SillSoundToggle and -SillSoundSwitchAt flip
  Mute; -SillSettingsScript's set sendAudio=1|0 is the Send Audio switch.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Noah's decision of 2026-10-27 ("Sound should be a toggle in the settings
menu") in the words:

- docs/audio-plan.md: the header, Controls, §4.1, §3.5, §5, §6, §7.6,
  §7.7, §7.8, H7, S2, Q5, Q8 and Q10 marked where they changed, and a
  last section, "Two switches in the device's Settings panel", with the
  changes, the checks and what was verified.
- CLAUDE.md: a bullet in #94's entry, its superseded lines marked, the
  Layout's PhonePortraitLayout and StreamClient+Audio lines, Build and
  run's --audio and harness lines, the Decisions' audio line.
- README, site/support.html and privacy.html inside their Sound markers
  (a device's settings panel turns it on; Mute silences one device;
  nothing new collected; privacy.html's date October 27, 2026),
  docs/app-store-metadata.md (the bullet, What's New and their counts;
  the review notes as they were), BRIEF.md and DEVELOPMENT.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Main brings #117 (the connect screen's tiles and groups, addhumal) and
#234 (the capture scale follow-ups). Only iOSClient/ContentView.swift
conflicted, in SettingsScript's doc comment: both sides kept (this
branch's `set ... sendAudio` and #117's `disconnect` step). CLAUDE.md,
Tests/checks/README.md (#117's connection-list row, #234's capture-scale
count and this branch's rows), docs/DEVELOPMENT.md, MockCatalog.swift
(#117's tiles connect case beside this branch's settings cases),
StreamClient.swift and site/privacy.html (#117's Tiles items beside the
Sound item; the date October 27, 2026) merged by themselves. CLAUDE.md's
Current step gains this branch's entry, first.

Verified on the merge: swift build -c release; the iOS app, Debug for
the generic simulator as CI builds it, only the known StreamClient
capture warning; run-all.sh ledger away-quality phone-portrait tour
connection-list capture-scale, all passed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Noah, 2026-10-27: "Mute setting should be right below the Send Audio setting"
and "should be set to off by default". The Mute row is the second row of
Send Audio's card, shown while the Mac has sound, and This iPad's group lost
it; one footnote under the card covers both. Mute was off by default already
(soundMuted reads Sill.soundMuted, false when unset). The docs that placed it
in This iPad say where it is now.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Saffsanity added a commit that referenced this pull request Oct 27, 2026
Noah, 2026-10-27, testing #235: "Send Audio should be on by default, and mute
should be off by default." HostConfig.app, the app's registered defaults,
sets sendAudio too; the CLI's --audio still opts in and a saved key wins.
README, the support and privacy pages, DEVELOPMENT.md and the Current step
entry say so. Mute on the device was off by default already.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
CLAUDE.md (both Current step entries, this branch's first) and
Tests/checks/README.md (both paragraphs on the changed checks) conflicted;
both sides kept.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@Saffsanity
Saffsanity merged commit f7f4884 into main Oct 27, 2026
2 checks passed
Saffsanity added a commit that referenced this pull request Oct 27, 2026
Eight files met: CLAUDE.md's Current step (both entries, this branch's first);
README, the support and privacy pages, DEVELOPMENT.md and the App Store
drafts, where #235's words (Send Audio from a device, Mute in its panel) now
carry this branch's default (on); the checks README's away-quality row and
mutants.py (#235's acceptance mutants AQ25–AQ26 and this branch's app-defaults
mutants, now AQ27–AQ30; 96 checks).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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