User report after the 8x boost commit (e85a6d3): playback STILL broken, but now the diagnostic clearly shows the actual problem. Render-callback peak_out_i16 SATURATES at 32767 on speech peaks (cb=600, 1100, 1200, 2400) because the 8x boost amplifies an already-loud signal into hard clipping. Quiet content reaches audible level but loud peaks are catastrophically distorted. The 8x boost was treating the wrong cause. Real root cause (researched online after user prompted: 'this is iOS a popular platform, there must be solutions'): iOS has TWO independent audio channels: In-call channel (.voiceChat / .videoChat modes) * Routes through the phone-call audio path. * Aggressively ducks non-voice content to the earpiece. * Volume controlled by a separate in-call hardware register, not the side buttons when not actively on a phone call. Media channel (.default mode) * Routes through the standard media playback path. * No automatic ducking. * Volume controlled by the side volume buttons normally. With AVAudioSession mode .voiceChat, iOS sends our output through the in-call channel which plays at 'earpiece-level' loudness on the speaker too. Signal is technically present but buried under the speaker's noise floor. With mode .default + .defaultToSpeaker option, output routes via media channel and plays at normal loudness. Both Twilio (video-quickstart-ios) and Daily.co (patched WebRTC module) document the same workaround and use VPIO for AEC while keeping the session mode at .default for loud playback: github.com/twilio/video-quickstart-ios/issues/522 stackoverflow.com/questions/79834998 (Daily.co) The user also noticed 'tx/rx almost no changes even receiving packages' \u2014 likely a misinterpretation of the frames counter not advancing as fast as expected during quiet voice; AudioHandler returns silence when its jitter buffer is in buffering_samples state which doesn't fire 'decode failed' but also doesn't increment frames_received. The real issue is still the playback ducking; the counter behaviour is a downstream symptom. Changes: 1. AppDelegate.swift: AVAudioSession mode .voiceChat -> .default with options [.defaultToSpeaker, .allowBluetoothHFP, .allowBluetoothA2DP]. VPIO continues to do its job (AEC, NS, AGC on the mic side); only the playback routing changes. The earlier 'speaker selector silent under .default' bug does NOT apply because we no longer use cpal RemoteIO \u2014 VPIO honours overrideOutputAudioPort under any mode. 2. ios_voice_unit.rs: revert the 8x output boost frome85a6d3. With media-channel routing, signal levels are correct and no software amplification is needed. Render callback restored to plain (l+r)*0.5*gain downmix. 3. ios_voice_unit.rs: revert the BypassVoiceProcessing toggle fromc16318c. The VPIO chain stays enabled so we keep capture-side AEC/AGC/NS for free \u2014 the playback breakage it was trying to fix was the wrong layer all along. 4. ios_voice_unit.rs: drop the diagnostic render-callback log line. Production-clean code; can be re-enabled by reverting the diff in the closure if future debugging needs it. Build counter 69 -> 70.
chanora_flutter
Chanora — cross-platform voice client for TeamSpeak-compatible servers.
Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
For help getting started with Flutter development, view the online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.