Skip to content

fix(menubar): make the recording icon react to sound again - #37

Merged
tenequm merged 2 commits into
mainfrom
fix/menubar-level-meter
Oct 7, 2026
Merged

tenequm merged 2 commits into
mainfrom
fix/menubar-level-meter

Conversation

@tenequm

@tenequm tenequm commented Oct 7, 2026

Copy link
Copy Markdown
Owner

The recording icon in the menu bar stopped showing sound on 2026-08-27 (d280e5f). That change removed the waveform.low / waveform.mid / waveform swap on audit finding C1 and replaced it with a constant .variableColor effect plus an opacity curve. The effect animates whether or not anyone speaks, and the opacity moves only from about 0.60 to 0.75 between silence and speech. The dBFS bucketing from 4775b70, and its tests, went with it.

This restores the glyph swap with the dBFS buckets, kept inside the fixed 16pt frame. It also finishes the other half of C1's suggested fix: AudioMonitor now publishes the bucketed symbol and assigns it only on a transition, so the label is invalidated on a bucket change rather than every 250 ms.

C1's crash claim rests on one unsourced line in a skill reference, with no trace or reproduction, and the swap shipped from March to August. An independent review recommended restoring it over an untested variableValue glyph. Reasoning and non-goals are in docs/plans/2610-07-menubar-level-meter.md.

Not verifiable locally: this machine's toolchain (Swift 6.4, SDK 27) fails make bundle and the test build for reasons unrelated to this diff. CI on macos-26 runs the full suite. The release build of the app compiles cleanly.

Manual check before merging: during a recording, silence shows low, normal speech mid, and loud speech or system audio the full glyph.

Release notes

The menu bar icon reacts to sound again while recording, so you can see that a call's audio is being captured.

The 2026-08-27 rewrite replaced the level-driven glyph swap with a constant
variableColor effect plus a square-root opacity curve that moves from about
0.60 to 0.75 between silence and speech, so the icon stopped showing sound.
It also discarded the dBFS bucketing from 4775b70 and its tests.

Restore waveform.low/mid/full with the dBFS buckets inside the fixed 16pt
frame. AudioMonitor now publishes the bucketed symbol, assigned only on a
transition, so the label is invalidated on bucket changes rather than on
every 250 ms level tick. The error glyph is no longer dimmed.
Move recordingWaveformIcon next to the other free monitor helpers in AudioMonitorSupport.swift, pass onAudioLevel through the test recorder, and add an integration test: levels map to the right glyph, a level inside the same bucket keeps it, and stopping resets it to waveform.low.
@tenequm
tenequm merged commit decae78 into main Oct 7, 2026
4 checks passed
@tenequm
tenequm deleted the fix/menubar-level-meter branch October 7, 2026 17:15
@tenequm tenequm mentioned this pull request Oct 7, 2026
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