Ağ Analizi & Protokoller
Açık Kaynak

Phone-Server: Real-Time Full-Duplex Voice Router & Jitter Buffer

RustDockerfileTokioTungsteniteCPALWebSocketsMPSC ChannelsJitter 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ı

RustDockerfileTokioTungsteniteCPALWebSocketsMPSC ChannelsJitter Buffer

Sistem Metrikleri

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-features` kullanılarak, sunucunun Debian runtime'ı ağır C/C++ ses kütüphanelerinden (`libasound2`) arındırıldı ve binary boyutu minimuma indirildi

Bunu Neden İnşa Ettim?

"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

  • 01.CPAL kullanarak donanım seviyesinde düşük gecikmeli ses yakalama ve oynatma
  • 02.Ağ dalgalanmalarına karşı `VecDeque` tabanlı eşzamanlı Jitter Buffer
  • 03.`SocketAddr` eşleştirmesiyle sunucu tarafında yankı/feedback engelleme
  • 04.Cargo feature flag'leri sayesinde donanımsal ses bağımlılıklarını (ALSA/PulseAudio) sunucu derlemesinden izole etme
  • 05.Bant genişliği verimliliği için anlık Mono/Stereo downmix ve upmix işlemleri
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.