Bagaimana cara mengatur wastafel PulseAudio?

16

Saya mencoba mengatur wastafel PulseAudio pada Raspberry Pi saya, untuk mengalirkan semua suara sistem dari PC saya di sana. Apa cara terbaik untuk melakukannya?

Misalnya, apakah mungkin untuk menonton film atau apakah latensinya terlalu tinggi? Saya mencoba ini beberapa waktu lalu menggunakan gstreamer, tetapi dengan latensi sekitar 2 detik, yang tidak berguna untuk kebutuhan saya.

segera
sumber
1
Saya mendapatkan satu atau dua latensi.
goldilocks

Jawaban:

19

The instruksi resmi untuk menciptakan sebuah "hubungan langsung" pada jaringan mudah-mudahan hanya bekerja untuk kebanyakan orang, tetapi tampaknya pulseaudio dan saya tidak bergaul dengan baik: aku butuh jam . [Selain "koneksi langsung", Anda juga dapat menggunakan metode "terowongan" yang dijelaskan lebih jauh ke bawah, tapi saya sarankan membaca ini dulu.]

Saya sekarang memiliki suara streaming desktop (fedora 17) ke pi. Saya telah meminimalkan /etc/pulsefile konfigurasi di kedua sisi. Di sisi desktop:

/etc/pulse/client.conf

# See man pulse-client.conf
default-server = tcp:192.168.2.13:4713

Alamat LAN pi saya dengan port pulseaudio default. Tapi ada sesuatu yang membuat saya bingung untuk sementara waktu - dengan server yang ditentukan, pulseaudio bahkan tidak akan memulai:

> pulseaudio --start
N: [pulseaudio] main.c: User-configured server at tcp:192.168.2.13:4713, refusing to start/autospawn.

Ini akan berjalan di latar depan (mungkin karena itu kemudian tidak membaca pulse-client.conf?). Namun , ternyata, Anda tidak harus menjalankannya sama sekali pada sisi desktop (pengiriman) , sesuatu yang tidak dijabarkan dalam pulseaudio docs. Menggunakannya lsof -i -Ptampak bahwa plugin tingkat bawah untuk berbagai pemutar media melakukan pekerjaan.

Jadi, satu baris "client.conf" itu sebenarnya yang Anda butuhkan di sisi desktop / klien, jika semua yang akan Anda lakukan adalah menggunakan jaringan (tapi lihat "Namun Lebih Banyak Komplikasi", di bawah).

Meskipun pulseaudio daemon (di sisi penerima / server) dapat dijalankan sebagai layanan sistem, para pengembang pulsa merekomendasikan untuk tidak melakukannya , dan bahkan pada pi skrip init hanya menyebabkan peringatan dikeluarkan: Anda masih harus memulai itu sendiri. Fedora bahkan tidak memasukkan entri layanan boot systemd untuk itu.

Oleh karena itu, di sisi pi, Anda harus secara eksplisit memulai dan menghentikan proses server pulseaudio, yang dikonfigurasi dengan demikian:

/etc/pulse/daemon.conf

# See man pulse-daemon.conf
log-level = info
exit-idle-time = 10800 # 3 hours

Anda dapat menggunakan -1 untuk exit-idle-timemenjaga agar daemon tetap berjalan tanpa batas. Waspadalah ini adalah detik dan standarnya adalah 20 (artinya ia akan tetap mati secara "misterius" jika Anda tidak menyetel ini).

/etc/pulse/default.pa

# See man default.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.2.0/24
load-module module-alsa-sink device=hw:0,0

Karena ini adalah aplikasi jaringan, bukan ide yang baik untuk menjalankannya sebagai root. Namun, seperti disebutkan dalam man pulseaudio, itu juga merupakan ide yang baik untuk "mengubah" proses untuk memberikan prioritas yang lebih tinggi. Anda dapat melakukan ini secara manual dengan nice, tetapi pulseaudio akan melakukannya secara otomatis untuk root, atau anggota pulse-rtgrup, jika yang dapat dieksekusi adalah "setuid", yang berarti dapat menggunakan beberapa privilleges root dan kemudian beralih ke uid yang tidak terbongkar dengan benar ( pingdan passwdjuga perlu melakukan ini). Jadi (sebagai root, atau sudo):

chmod u+s /usr/bin/pulseaudio

Tidak ada pulse-rtgrup yang dibuat saat pulseaudio diinstal pada raspbian, jadi:

groupadd pulse-rt

Ini akan memberi Anda gid seperti 1003. Tambahkan (misalnya) pi pengguna ke grup itu:

usermod -aG pulse-rt pi

Tetapi pada raspbian, Anda masih tidak akan dapat mengganti sebagai pi. Untuk itu, tambahkan ke /etc/security/limits.conf:

@pulse-rt       hard nice -20
@pulse-rt       soft nice -20

Anda harus benar-benar menjalankan login sebelum perubahan ini terjadi; jika Anda menggunakan ssh dengan pi, gunakan saja login. Sekarang Anda dapat memulai pulseaudio dan itu akan mengubah sendiri -11, yang mungkin merupakan prioritas lebih tinggi daripada sebagian besar proses lainnya (lihat nilai NICE di top).

Saat memutar suara yang dialirkan dari jaringan, pulseaudio pada pi menggunakan sekitar 10% dari CPU dan jumlah memori yang sepele. :) Ini dan desktop saya ada di LAN kabel; pulsa mengalirkan data pcm mentah (saya percaya), jadi penggunaan bandwidth sesuai dengan laju sampel sumber, 1 kB / dtk dan lebih tinggi. Sayangnya, ada kelambatan yang mencolok dalam suara jika Anda menonton video.

Namun Lebih Banyak Komplikasi ...

Sayangnya, tidak satu pun dari berbagai aplikasi suara dari PC saya langsung berfungsi; mpg123tidak akan lari sama sekali. Untuk itu, pada fedora, Anda memerlukan mpg123-plugins-pulseaudiopaket. Untuk hal-hal flash di browser (misalnya, Anda), Anda perlu alsa-plugins-pulseaudio(ini adalah apa yang sebenarnya terhubung ke server jauh). Distro lain harus memiliki paket serupa. Jika Anda pernah menggunakan pulseaudio sebelumnya (saya tidak), Anda mungkin sudah menginstalnya.

Lonceng dan peluit desktop KDE juga tidak berfungsi. Ini adalah masalah yang lebih sulit untuk diselesaikan, karena mencari server pulseaudio lokal, dan seperti yang dijelaskan, menggunakan koneksi langsung berarti tidak ada server yang dapat dijalankan secara lokal. Cara mengatasinya adalah dengan menggunakan metode "terowongan".

module-tunnel-sink

Ini adalah cara lain yang disebutkan dalam pulseaudio docs. Dalam hal ini, Anda memiliki server yang berjalan di kedua sisi dan satu tangan ke tangan yang lain. Untuk melakukan ini, beri komentar "default-server" /etc/client.confdan tambahkan lokal yang /etc/default.pamengandung:

load-module module-tunnel-sink sink_name=rpi_tunnel server=tcp:192.168.2.13:4713 sink=bcm1

Jika Anda tidak memasukkan sink_name, pulseaudio tidak akan memulai. Yang sinkmengacu pada nama wastafel di sisi pi, yang kemudian juga membutuhkan nama; tambahkan yang sesuai sink_nameke module-alsa-sinkbaris di default.pasana:

load-module module-alsa-sink device=hw:0,0 sink_name=bcm1 

Mulai server di kedua sisi dan presto ... semacam. Sementara semua hal termasuk KDE bleep sekarang dilakukan, pemutaran browser flash tergagap. Namun, di bawah lingkungan desktop lain (sebenarnya, hanya manajer jendela, fvwm) itu baik-baik saja.

Saya suka KDE tetapi bisa hidup tanpa bleep, jadi untuk sekarang saya akan tetap menggunakan koneksi langsung.

Penyelesaian masalah

Jika Anda memiliki masalah, menggunakan pulseaudio -vvvv --log-level=debugpada pi menyediakan banyak pesan debug. Awalnya ketika saya tidak bisa mendapatkan suara pada pi ini melaporkan masalah "terkait dengan bug pada driver bcm2835 ALSA" yang tampak aneh bagi saya karena suara itu baik-baik saja dengan hanya alsa, dan saya yakin ada perangkat lunak pi di sekitar yang tergantung pada pulseaudio - apt-get remove pulseaudiodan instal ulang apt-get install pulseaudiosepertinya memperbaiki ini ... Bukan solusi yang saya suka lihat, tapi hei, setidaknya sekarang saya bisa mendengarkan tish tanpa harus mencolokkan speaker ke setiap kotak. Kebanyakan.

goldilocks
sumber
Terima kasih atas jawaban yang luas. Namun satu pertanyaan: apa yang terjadi dengan audio yang datang langsung dari Pi?
Vincent
Tak tahu apakah saya pernah mencobanya (saya tidak melakukan ini lagi) tetapi pulseaudio seharusnya menjadi multiplexor, jadi itu harus bekerja.
goldilocks