mpv ve Bubbletea ile TUI Müzik Oynatıcısında Tuş Girişi Sorunu Çözümü
mpv, Bubbletea ve Lipgloss kullanarak terminal tabanlı bir müzik oynatıcı geliştirirken karşılaşılan en kritik sorun: tuş girdilerinin iki kez basılması gerekiyor. Bunun nedeni, mpv'nin arka planda çalışırken terminal girdisini kendi amaçları için tüketmesi. Örneğin, müzik duraklatmak için boşluk tuşuna bir kez bassan bile, mpv aynı tuşu yakalayıp Bubbletea'ya ulaştırmıyor.
Sorunun kökü, I/O yönlendirmesinde yatıyor. mpv'nin stdin, stdout ve stderr'ini TUI'nin akışlarına yönlendirdiğinde, mpv ve Bubbletea aynı terminal girdisi kanalını kullanmaya başlıyor. Bu da yarış koşuluna (race condition) sebep oluyor, iki sistem aynı tuş olayı için rekabet ediyor, ve çoğu zaman mpv kazanıyor.
İlk çözüm, I/O yönlendirmesini kaldırmak görünüyor. Böylece Bubbletea tüm tuş girişlerini kontrol eder ve çift basma sorunu ortadan kalkıyor. Ancak bu, yeni bir problem yaratıyor: mpv artık uygulamadan komut alamıyor. Duraklat, devam et, ses seviyesi değiştir gibi kontrol komutları mpv'ye ulaşamıyor çünkü stdin bağlantısı yok.
Temel zorluk şu: bir terminal uygulaması stdin'i sadece bir program kullanabilir. Hem mpv'ye komut göndermek hem de Bubbletea'nın tuş girişini kontrol etmek aynı anda mümkün değil. Çözüm, mpv'yi adlandırılmış kanallar (named pipes) veya socket iletişimi aracılığıyla kontrol etmek. mpv, `--input-ipc-server` parametresiyle bir IPC sunucusu başlatabilir; sen de TUI'den JSON komutlarını bu sunucuya göndererek oynatıcıyı yönetebilirsin. Bu yolla mpv'nin terminal girdisine erişmesine gerek kalmıyor, Bubbletea ise tüm tuş olaylarını sorunsuz işliyor.
Terminal uygulamaları birden fazla programı koordine etmek zorunda kaldığında, doğrudan I/O paylaşımı yerine IPC mekanizmaları (pipe, socket, HTTP) kullanmak daha güvenilir. mpv'nin IPC desteği tam da bunun için var, I/O çatışmasından kurtulmak için bunu tercih et.
0 yorum