Talon 7033053184
Build and test / test (macos-latest) (push) Canceled after 0s
Build and test / test (ubuntu-24.04) (push) Canceled after 0s
Build and test / test (windows-latest) (push) Canceled after 0s
Build and test / apple-client (push) Canceled after 0s
fix(ios): keep the audio preset when speaker output is toggled
Speaker output decides where audio goes, not how it is captured, which is why
it sits beside the preset row rather than inside Advanced audio. It was
nonetheless moving the preset to Advanced, and the voice-chat preset was
clearing it back, so the two controls overwrote each other and a user who
wanted the speaker lost the preset that describes their capture setup.

SetForceSpeaker no longer touches the preset, and Load and SelectPreset no
longer clear the flag. A speakerIsExplicit default records that the user
actually chose, so the automatic value older installs inherited from the
voice-chat preset is dropped once rather than pinning a headset user to the
speaker, and the toggle is honoured from then on.

Apply issues the speaker port override again when the flag is set. Without it
the toggle barely did anything with a headset attached, because
DefaultToSpeaker only decides the route when nothing else is connected. With
the toggle off it passes None, so a route left alone still follows an HFP
headset.

The changed logic sits on AVAudioSession, which the net10.0 test project
cannot reference, so this carries no tests; the toggle needs device
verification under the voice-chat preset with a Bluetooth headset connected.
2026-09-25 18:48:08 +02:00
2026-09-21 04:05:40 +02:00
2026-09-22 16:54:49 +02:00
2026-09-21 02:12:03 +02:00

VoiceCat

VoiceCat is a self-hosted, channel-based voice and text chat system built on .NET 10. It uses TLS 1.3 for protobuf control traffic and authenticated encrypted UDP for Opus media. There is no WebRTC, central directory, or plaintext mode.

The repository contains a managed server, CLI, shared client/audio core, and native Windows, macOS, and iOS user interfaces. A small C library supplies Opus/RNNoise, and a small Swift iOS extension captures ReplayKit application audio.

Build

./scripts/build-native.ps1
dotnet restore VoiceCat.slnx --locked-mode
dotnet build VoiceCat.slnx -c Release --no-restore
dotnet test VoiceCat.slnx -c Release --no-build

See CLAUDE.md for the developer map, docs/README.md for current contracts, and PROGRESS.md for the short release handoff.

Layout

proto/                    protobuf wire schema
src/                      managed protocol, crypto, server, client, audio, and CLI
tests/                    managed behavior and integration tests
clients/windows/          WinForms client
clients/apple/            AppKit and UIKit clients
native/media/             narrow Opus/RNNoise C shim
native/rnnoise/           vendored RNNoise source and model
native/apple/broadcast/   ReplayKit broadcast extension
docs/                     current contracts and operating documentation

Non-negotiable constraints

  • Encryption is mandatory.
  • No GPL or LGPL dependencies.
  • Real-time audio callbacks never allocate, lock, block, or perform I/O.
  • Accessibility is a release requirement on every client platform.
S
Description
Native voice chat server and client
Readme
8.2 MiB
Languages
C++ 43.9%
Swift 30.6%
C# 17.5%
Shell 3.6%
CMake 2.1%
Other 2.3%