Phone-Server: Real-Time Full-Duplex Voice Router & Jitter Buffer
Tokio ve Tungstenite üzerinde çalışan, sunucu taraflı yankı iptali ve istemci taraflı Jitter Buffer mimarisine sahip düşük gecikmeli raw PCM ses yayın motoru.
Teknoloji yığını
- Diller
- Çatılar & kütüphaneler
Performans & metrikler
- Kritik ses thread'lerinde kilitlenmeyi (lock contention) ve paket kaybını önlemek için Unbounded MPSC kanalları kullanıldı
- Jitter Buffer sayesinde ağ gecikmelerindeki anlık kopmaların ve ses yırtılmalarının önüne geçildi
- Çok aşamalı Docker build sürecinde
--no-default-featureskullanılarak, sunucunun Debian runtime'ı ağır C/C++ ses kütüphanelerinden (libasound2) arındırıldı ve binary boyutu minimuma indirildi
Neden geliştirdim?
WebRTC gibi standart protokoller basit ses iletimi için çoğu zaman gereksiz hantal kalıyor. Amacım TCP/WebSocket üzerinden sadece ham PCM ses verisi (f32 LE bytes) taşıyacak hafif ve bellek güvenli bir Rust altyapısı kurmaktı. Yankı (echo) problemini routing katmanında kaynak adreslerini filtreleyerek çözdüm, donanımsal sample-rate uyuşmazlıklarını ise doğrudan istemcide manuel olarak eşitledim.Mimari & kararlar
Mimari temelde CPAL'in senkron donanım thread'leri ile Tokio'nun asenkron I/O'sunu birbirine bağlıyor. İstemci, bant genişliğinden tasarruf etmek için mikrofon girişini Stereo'dan Mono'ya düşürüp, unbounded MPSC kanallarıyla asenkron WebSocket yazıcısına aktarıyor. Oynatım tarafında ağdaki dalgalanmaları sönümlemek için Mutex ile sarmalanmış VecDeque tabanlı bir Jitter Buffer (1000 sample eşikli) çalışıyor. Sunucu ise (SocketAddr, Message) tuple'ları taşıyan bir tokio::sync::broadcast kanalı kullanıp, yankıyı önlemek adına paketleri sadece gönderen adres dışındaki herkese iletiyor.
Temel özellikler
- 01CPAL kullanarak donanım seviyesinde düşük gecikmeli ses yakalama ve oynatma
- 02Ağ dalgalanmalarına karşı
VecDequetabanlı eşzamanlı Jitter Buffer - 03
SocketAddreşleştirmesiyle sunucu tarafında yankı/feedback engelleme - 04Cargo feature flag'leri sayesinde donanımsal ses bağımlılıklarını (ALSA/PulseAudio) sunucu derlemesinden izole etme
- 05Bant genişliği verimliliği için anlık Mono/Stereo downmix ve upmix işlemleri
Teknik değerlendirme
Bu proje, senkron donanım kesmeleri ile asenkron event loop'lar arasındaki sınırın nasıl düzgün yönetileceğine dair iyi bir örnek. İstemcideki in_config.sample_rate = out_config.sample_rate; ataması, donanımsal saat (clock) uyuşmazlıklarını çözen doğrudan, low-level bir müdahale. Ayrıca cpal kütüphanesini Cargo feature flag'inin arkasına saklamak, sunucu binary'sini inanılmaz hafif tutuyor ve production ortamındaki Docker imaj boyutunu ciddi şekilde küçültüyor.