Bagaimana cara mengkonfigurasi PulseAudio untuk 7.1 Surround Sound melalui HDMI?

10

Saya memiliki mesin saya terhubung melalui HDMI ke penerima. Tetapi ketika saya mencoba menggunakan lebih dari dua saluran dengan PulseAudio, saya hanya mendapatkan dua. pacmd list cardsmenunjukkan kartu, tetapi tidak menunjukkan profil HDMI dengan lebih dari dua saluran.

Saya telah mengkonfirmasi bahwa suara 7.1 berfungsi melalui ALSA:

pasuspender -- speaker-test -D hdmi -c 8 -m FL,FC,FR,RR,RRC,RLC,RL,LFE

Menghasilkan listrik statis yang mengelilingi ruangan.

derobert
sumber

Jawaban:

20

Dalam PulseAudio, setiap kartu suara memiliki set profil yang dikaitkan dengannya. Kumpulan profil berisi beberapa profil, dan itu adalah profil yang Anda lihat saat mendaftar kartu (atau ketika melihat berbagai GUI PulseAudio).

Ada defaultprofil, yang terutama berisi hal-hal yang berguna untuk keluaran suara analog. Ada juga extra-hdmiprofil yang secara otomatis diterapkan ke beberapa output HDMI, dan akan memberikan opsi hingga 5.1. Sayangnya kedua profil ini ada di /usr/share/pulseaudio/alsa-mixer/profile-setsdalamnya, dan karenanya Anda tidak dapat benar-benar mengeditnya (saya telah mengajukan bug Debug 736708 tentang ini.) Menurut dokumentasi, Anda dapat menonaktifkan autodiscovery berbasis udev, dan secara manual mengkonfigurasi semuanya — yang memungkinkan Anda menentukan path lengkap ke profil. Tapi ternyata, meski tidak didokumentasikan, udev juga bisa menentukan path lengkap.

Tetapkan aturan udev untuk menetapkan satu set profil

Anda menetapkan profil yang diatur dalam aturan udev dengan mengatur PULSE_PROFILE_SETvariabel lingkungan udev. Ini didokumentasikan untuk hanya mengambil file di /usrsubdirektori yang disebutkan di atas , tetapi path lengkap juga berfungsi. Dalam kasus saya, saya membuat aturan ini:

# cat /etc/udev/rules.d/95-local-pulseaudio.rules 
ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1c20", ENV{PULSE_PROFILE_SET}="/etc/pulse/my-hdmi.conf"

Anda harus menggunakan vendor PCI dan nomor perangkat yang sesuai, yang dapat Anda peroleh dengan mudah lspci -nn.

Setelah membuat aturan udev, Anda dapat langsung menerapkannya udevadm trigger -ssound. Anda mungkin ingin membangun kembali initramf Anda juga ( update-initramfs -u)

Konfirmasikan bahwa aturan udev mulai berlaku udevadm info --query=all --path /sys/class/sound/card0(tentu saja, gunakan nomor kartu yang sesuai). Anda akan melihat E: PULSE_PROFILE_SET=/etc/pulse/my-hdmi.confdi output. Jika tidak, jangan lanjutkan. Itu tidak akan berhasil. Ada yang salah dengan aturan udev Anda (atau mungkin Anda tidak memicunya — Anda selalu bisa mencoba me-reboot).

Buat file /etc/pulse/my-hdmi.conf

Catatan: Peta saluran tampaknya khusus untuk sistem. Anda perlu bereksperimen untuk melakukannya dengan benar untuk sistem Anda. Saya beruntung, tata letak 7.1 saya hanya melibatkan menjatuhkan item terakhir untuk membangun 5.1, 4.0, dll. Instruksi di bawah ini.

Ini banyak salin & tempel, kebanyakan. Setiap bagian berbeda dalam (a) nama, (b) deskripsi, (c) peta saluran, (d) prioritas [opsional].

[General]
auto-profiles = yes

[Mapping hdmi-stereo]
device-strings = hdmi:%f
channel-map = front-left,front-right
description = Digital Stereo (HDMI)
priority = 4
direction = output
paths-output = hdmi-output-0

[Mapping hdmi-surround-40]
device-strings = hdmi:%f
channel-map = front-left,front-right,rear-left,rear-right
description = Digital Quadrophonic (HDMI)
priority = 1
direction = output
paths-output = hdmi-output-0

[Mapping hdmi-surround-51]
device-strings = hdmi:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
description = Digital Surround 5.1 (HDMI)
priority = 2
direction = output
paths-output = hdmi-output-0

[Mapping hdmi-surround-71]
description = Digital Surround 7.1 (HDMI)
device-strings = hdmi:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
priority = 3
direction = output
paths-output = hdmi-output-0

Sekarang, untuk menguji ini:

  1. Mulai ulang PulseAudio:, pulseaudio -ksebagai pengguna normal Anda, dengan asumsi Anda menggunakan daemon per pengguna (default). Mulai lagi, bahkan yang sederhana aplay -lakan berhasil.
  2. Beralih ke profil 7.1. Secara pribadi, saya dulu pactl set-card-profile 0 "output:hdmi-surround-71"melakukan ini, tetapi GUI juga akan bekerja dengan sangat baik.
  3. Lari speaker-test -c 8 -t w. Seharusnya mulai mengumumkan nama pembicara, semoga nama yang benar dari masing-masing pembicara. Jika namanya tidak berasal dari pengeras suara yang benar, Anda harus mengubah peta saluran untuk memperbaikinya. Setelah setiap perubahan peta saluran, Anda harus memulai kembali PulseAudio lagi.

Bonus! Pengaturan lebih bermanfaat

Di /etc/pulse/daemon.conf, ada beberapa pengaturan yang mungkin ingin Anda ubah:

enable-remixing- Jika ini aktif, sinyal stereo akan memainkan saluran kiri dari ketiga speaker kiri Anda, dan saluran kanannya keluar dari speaker kanan Anda. Jika mati, itu hanya akan keluar dua depan. Perhatikan bahwa Anda juga dapat mengubah profil menjadi stereo (hanya mengirim suara stereo keluar dari port HDMI, dan membiarkan penerima Anda memutuskan bagaimana memetakannya ke speaker).

enable-lfe-remixing - Mirip, tetapi untuk remixing ke saluran LFE (subwoofer).

default-sample-format- Jika pengaturan HDMI Anda mendukung lebih dari 16-bit audio, Anda mungkin ingin meningkatkan ini ke s32le(dari default s16le).

default-sample-rate, alternate-sample-rate- Anda mungkin ingin menukar ini (dan mungkin bahkan menonaktifkan sepenuhnya 44.1KHz) jika Anda sebagian besar menggunakan materi sumber DVD yang biasanya 48KHz. Atau, jika penerima HDMI Anda mendukungnya, Anda dapat mencapai 192 KHz. Perhatikan bahwa 176KHz memiliki properti bagus menjadi kelipatan genap 44.1 dan 48KHz. Lihat di bawah untuk mengetahui cara yang didukung oleh penerima Anda

default-sample-channels- Sepertinya tidak terlalu penting. Profil mungkin menimpanya ...

Secara alami, Anda harus memulai ulang PulseAudio setelah mengubah file ini.

Bonus Lagi! Melihat Apa yang Didukung Penerima Anda

Ada beberapa eld.*file /proc/asoundyang memberi tahu Anda apa tujuan dukungan HDMI link. Sebagai contoh:

# cat /proc/asound/card0/eld#3.0 
monitor_present         1
eld_valid               1
monitor_name            TX-SR606
connection_type         HDMI
eld_version             [0x2] CEA-861D or below
edid_version            [0x3] CEA-861-B, C or D
manufacture_id          0xcb3d
product_id              0x863
port_id                 0x0
support_hdcp            0
support_ai              1
audio_sync_delay        0
speakers                [0x4f] FL/FR LFE FC RL/RR RLC/RRC
sad_count               8
sad0_coding_type        [0x1] LPCM
sad0_channels           2
sad0_rates              [0x1ee0] 32000 44100 48000 88200 96000 176400 192000
sad0_bits               [0xe0000] 16 20 24
sad1_coding_type        [0x1] LPCM
sad1_channels           8
sad1_rates              [0x1ee0] 32000 44100 48000 88200 96000 176400 192000
sad1_bits               [0xe0000] 16 20 24
sad2_coding_type        [0x2] AC-3
sad2_channels           8
sad2_rates              [0xe0] 32000 44100 48000
sad2_max_bitrate        640000
sad3_coding_type        [0x7] DTS
sad3_channels           8
sad3_rates              [0xc0] 44100 48000
sad3_max_bitrate        1536000
sad4_coding_type        [0x9] DSD (One Bit Audio)
sad4_channels           6
sad4_rates              [0x40] 44100
sad5_coding_type        [0xa] E-AC-3/DD+ (Dolby Digital Plus)
sad5_channels           8
sad5_rates              [0xc0] 44100 48000
sad6_coding_type        [0xb] DTS-HD
sad6_channels           8
sad6_rates              [0x1ec0] 44100 48000 88200 96000 176400 192000
sad7_coding_type        [0xc] MLP (Dolby TrueHD)
sad7_channels           8
sad7_rates              [0x1480] 48000 96000 192000

Jadi Anda dapat melihat receiver saya mendukung LPCM (Linear PCM, yaitu, audio yang tidak terkompresi) hingga 8 saluran, 192KHz, suara 24-bit. Ini juga mendukung AC3, DTS, DSD, DD +, DTS-HD, dan Dolby TrueHD. Jadi jika saya memiliki file yang disandikan, saya dapat melewati format-format tersebut (jika media player saya mendukungnya, tentu saja. mpvMungkin saja).

derobert
sumber
Terima kasih banyak untuk ini, telah berjuang untuk sementara waktu dengan pengaturan. Bagi saya aturan udev tidak berlaku terlebih dahulu, saya harus me-restart PC untuk itu. Satu masalah sekalipun .. @derobert Sepertinya saya tidak bisa meneruskan X265, aliran audio 7.1. Saya hanya perlu mendekode menggunakan PC dan mentransfer aliran audio. (Receiver saya adalah 5.1). Apakah Anda punya saran? Terima kasih!
dimuthu
@dimuthu H.265 (x265) adalah codec video, bukan codec audio. Perhatikan bahwa PulseAudio hanya memiliki dukungan terbatas untuk melewati, perlu diaktifkan (paling mudah dengan GUI), dan mungkin perlu diatur ke stereo (hanya detail implementasi tentang bagaimana melewati bekerja, bukan batas nyata pada jumlah saluran ). Saya sepertinya mengingat sebuah halaman di wiki Kodi dengan detail.
derobert
1
@dimuthu (Maaf untuk komentar ke-2, aplikasi SE mogok mencoba mengedit ...) Saya kira penerima 5.1 hanya mendukung AC3 dan DTS. Tidak, misalnya, AAC. Kecuali itu memungkinkan Anda menggunakan beberapa fitur pada receiver yang tidak dapat Anda gunakan dengan PCM multichannel, tidak banyak gunanya untuk dilewati. Setidaknya tidak melalui HDMI.
derobert
ya Anda benar, saya benar-benar melewati audio dengan mengatur PulseAudio ke Stereo HDMI. Ini adalah satu-satunya cara saya bisa mendapatkan audio bitstream ke penerima. Juga melakukan penggalian tentang AAC dan meskipun Yahama tidak menyebutkan apa-apa tentang spesifikasi mereka, saya menemukan beberapa bukti online untuk mencari itu hanya tersedia dalam model akhir yang lebih tinggi. Apakah saya kehilangan begitu banyak detail dengan mendekode menggunakan HTPC? Saya telah mengaturnya hingga 7.1Ch / 192KHz, 24-bit. Terima kasih!
dimuthu
@dimuthu Anda tidak boleh kehilangan apa pun dengan mendekode pada PC selama Anda memiliki konverter tingkat kualitas yang masuk akal di PulseAudio. Yah, tidak ada apa-apa selain waktu CPU (terutama pada laju sampel itu, yang tidak diragukan lagi jauh melebihi bahan sumber)
derobert