The session moves from the connection screen's ViewModel into an
app-wide SessionController, and a foreground service keeps the process
running while connected:
- Its notification shows the server and status and offers Mute, Deafen
and Disconnect.
- It declares microphone use only once the microphone is handed to the
connection, as Android requires that permission to be granted then.
- It holds a low-latency Wi-Fi lock and a CPU wake lock, since voice
goes out every 20 ms.
- When the system moves to another network, the session reconnects to
where it was, as its socket stays bound to the old one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
android/ builds core and ts3j from the same sources as the desktop's
Maven build, so the app shares all of the client's logic:
- audio: Oboe streams behind AudioCapture/AudioPlayback, with a lock-free
ring between the real-time callback and the blocking Java side, and
libopus 1.5.2 built with the NDK behind OpusCodec. Speakers are mixed
onto one stream. Capture uses the VoiceRecognition preset, leaving
noise suppression and gain to the client's own processing.
- app: a plain connection screen to try the port out - connect,
microphone, mute, deafen, channel chat and a log - until the real UI.
Targets Android 13 and up (minSdk 33) on arm64 and x86_64.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>