Merge branch 'fix/cant-hear' into main
Calls can say when sound is not getting through: microphone and receive meters on every tile, receiver-to-sender reports (spec §15.20), web autoplay recovery, an audio test on every platform, and a per-device input choice for multi-channel microphones on Mac.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 files changed,
+6455
−125
Makefile+2 −1callscore/media_test.go+39 −0callscore/room.go+39 −2docs/superpowers/specs/2026-09-07-meet-design.md+69 −1internal/calls/hub/media.go+9 −2internal/calls/hub/media_test.go+58 −0internal/calls/signal.go+93 −11internal/calls/static/calls.css+133 −0internal/calls/static/devices.js+422 −1internal/calls/static/room.js+641 −12internal/calls/templates/join.html+29 −0internal/callstest/browser_test.go+3 −0internal/callstest/media_test.go+71 −1internal/callstest/native_selftest_test.go+62 −0native/README.md+42 −0native/apple/Sources/CallsInterop/AudioSelfTestHarness.swift+148 −0native/apple/Sources/CallsInterop/Interop.swift+3 −0native/apple/Sources/CallsKit/Audio.swift+60 −2native/apple/Sources/CallsKit/AudioLevelRules.swift+253 −0native/apple/Sources/CallsKit/AudioMeter.swift+362 −0native/apple/Sources/CallsKit/AudioSelfTest.swift+303 −0native/apple/Sources/CallsKit/AudioSelfTestLoopback.swift+94 −0native/apple/Sources/CallsKit/AudioSelfTestModel.swift+691 −0native/apple/Sources/CallsKit/AudioSelfTestView.swift+275 −0native/apple/Sources/CallsKit/Call.swift+134 −0native/apple/Sources/CallsKit/CallAudio.swift+34 −7native/apple/Sources/CallsKit/CallsLobby.swift+3 −0native/apple/Sources/CallsKit/DevicePanel.swift+5 −0native/apple/Sources/CallsKit/DevicePanelAudio.swift+74 −0native/apple/Sources/CallsKit/InputChannel.swift+241 −0native/apple/Sources/CallsKit/MacCallView.swift+8 −5native/apple/Sources/CallsKit/MacFullWindowCall.swift+7 −5native/apple/Sources/CallsKit/MacVideoTile.swift+24 −7native/apple/Sources/CallsKit/Media.swift+48 −0native/apple/Sources/CallsKit/MiniWindow.swift+7 −5native/apple/Sources/CallsKit/NoiseSuppression.swift+91 −2native/apple/Sources/CallsKit/RemoteAudioTap.swift+61 −0native/apple/Sources/CallsKit/Wire.swift+16 −1native/apple/Tests/CallsKitTests/AudioLevelTests.swift+235 −0native/apple/Tests/CallsKitTests/AudioSelfTestTests.swift+377 −0native/apple/Tests/CallsKitTests/InputChannelTests.swift+125 −0native/apple/Tests/CallsKitTests/NoiseSuppressionTests.swift+130 −0native/apple/Tests/CallsKitTests/PeerMediaHearingTests.swift+43 −0native/bridge/bridge.go+16 −0native/ios/Sources/CallsPhone.swift+29 −11native/ios/Sources/PhoneFullScreenCall.swift+5 −4protocol/messages.go+35 −0test/browser/call.mjs+395 −32test/browser/devices.test.mjs+63 −0test/browser/native.mjs+33 −0test/browser/negotiation.test.mjs+3 −1test/browser/room-hearing.test.mjs+195 −0test/browser/room-mute.test.mjs+117 −12
CI passed — run details
MakefileLoading diff…
callscore/media_test.goLoading diff…
callscore/room.goLoading diff…
docs/superpowers/specs/2026-09-07-meet-design.mdLoading diff…
internal/calls/hub/media.goLoading diff…
internal/calls/hub/media_test.goLoading diff…
internal/calls/signal.goLoading diff…
internal/calls/static/calls.cssLoading diff…
internal/calls/static/devices.jsLoading diff…
internal/calls/static/room.jsLoading diff…
internal/calls/templates/join.htmlLoading diff…
internal/callstest/browser_test.goLoading diff…
internal/callstest/media_test.goLoading diff…
internal/callstest/native_selftest_test.goLoading diff…
native/README.mdLoading diff…
native/apple/Sources/CallsInterop/AudioSelfTestHarness.swiftLoading diff…
native/apple/Sources/CallsInterop/Interop.swiftLoading diff…
native/apple/Sources/CallsKit/Audio.swiftLoading diff…
native/apple/Sources/CallsKit/AudioLevelRules.swiftLoading diff…
native/apple/Sources/CallsKit/AudioMeter.swiftLoading diff…
native/apple/Sources/CallsKit/AudioSelfTest.swiftLoading diff…
native/apple/Sources/CallsKit/AudioSelfTestLoopback.swiftLoading diff…
native/apple/Sources/CallsKit/AudioSelfTestModel.swiftLoading diff…
native/apple/Sources/CallsKit/AudioSelfTestView.swiftLoading diff…
native/apple/Sources/CallsKit/Call.swiftLoading diff…
native/apple/Sources/CallsKit/CallAudio.swiftLoading diff…
native/apple/Sources/CallsKit/CallsLobby.swiftLoading diff…
native/apple/Sources/CallsKit/DevicePanel.swiftLoading diff…
native/apple/Sources/CallsKit/DevicePanelAudio.swiftLoading diff…
native/apple/Sources/CallsKit/InputChannel.swiftLoading diff…
native/apple/Sources/CallsKit/MacCallView.swiftLoading diff…
native/apple/Sources/CallsKit/MacFullWindowCall.swiftLoading diff…
native/apple/Sources/CallsKit/MacVideoTile.swiftLoading diff…
native/apple/Sources/CallsKit/Media.swiftLoading diff…
native/apple/Sources/CallsKit/MiniWindow.swiftLoading diff…
native/apple/Sources/CallsKit/NoiseSuppression.swiftLoading diff…
native/apple/Sources/CallsKit/RemoteAudioTap.swiftLoading diff…
native/apple/Sources/CallsKit/Wire.swiftLoading diff…
native/apple/Tests/CallsKitTests/AudioLevelTests.swiftLoading diff…
native/apple/Tests/CallsKitTests/AudioSelfTestTests.swiftLoading diff…
native/apple/Tests/CallsKitTests/InputChannelTests.swiftLoading diff…
native/apple/Tests/CallsKitTests/NoiseSuppressionTests.swiftLoading diff…
native/apple/Tests/CallsKitTests/PeerMediaHearingTests.swiftLoading diff…
native/bridge/bridge.goLoading diff…
native/ios/Sources/CallsPhone.swiftLoading diff…
native/ios/Sources/PhoneFullScreenCall.swiftLoading diff…
protocol/messages.goLoading diff…
test/browser/call.mjsLoading diff…
test/browser/devices.test.mjsLoading diff…
test/browser/native.mjsLoading diff…
test/browser/negotiation.test.mjsLoading diff…
test/browser/room-hearing.test.mjsLoading diff…
test/browser/room-mute.test.mjsLoading diff…