Debian 64+jackd+alsa+surround 5.1

Aug 05, 2011 01:32

Уффф! Копошилась с настройкой звука в своём лине. Я это сделала! :)

Настраивала звук из jackd на 6 каналов (surround 5.1) с аналоговыми выходами (3 джека) на встроенной звуковой карте матери Gygabyte GA-945P-S3, чипсет ICH7, чип Realtek ALC883 под линём Debian Wheezy 64 bit.

Напишу последовательность, чтобы самой не забыть и может быть, кому-нибудь пригодится:

1. Ставим алсу с приблудами и нужными плагинами. В конфиге алсы (/etc/modprobe/alsa-base.conf) добавляем строку:
options snd-hda-intel model=alc883-3stack-dig index=<номер карты, если их несколько>

Примечание: Если на машине есть видяха с HDMI, то драйвер зажрёт следующий за указанным индексом номер под обслуживание HDMI. Очевидно, победить это никак нельзя, поэтому если есть две карты и, например, у HDA Intel индекс 0, то при наличии HDMI следующей карте нужно назначать индекс 2, иначе эту карту просто не будет видно.

2. Копируем настройки каналов для данной карты (самое шаманское действо, которое не очевидно ни разу, а без него нихрена каналы правильно не распределяются):

sudo wget http://pastebin.com/download.php?i=f2e38265 -O /usr/share/alsa/cards/HDA-Intel.conf
sudo wget http://pastebin.com/download.php?i=f5f9654bb -O /etc/asound.conf

Это файлы, которые правильно разбрасывают каналы для этого конкретного чипа.

Я их тут приведу на всякий пожарный, чтобы не потерялись (вставляются они тут крайне криво, но хоть что-то).

asound.conf :
---------------------------------------------------------------
pcm.!hdmi-remap {
type asym
playback.pcm {
type plug
slave.pcm "remap-surround71"
}
}

pcm.!remap-surround71 {
type route
slave.pcm "hw:0,3"
ttable {
0.1= 1
1.0= 1
2.4= 1
3.5= 1
4.2= 1
5.3= 1
6.6= 1
7.7= 1
}
}
---------------------------------------------------------------

HDA-Intel.conf :
---------------------------------------------------------------
#
# Configuration for the Intel HD audio (ICH6/ICH7)
#

HDA-Intel.pcm.front.0 {
@args [ CARD ]
@args.CARD {
type string
}
type softvol
slave.pcm "remap-surround71"

control {
name "PCM Playback Volume"
card $CARD
}
}

# default with dmix+softvol & dsnoop
HDA-Intel.pcm.default {
@args [ CARD ]
@args.CARD {
type string
}

type asym
playback.pcm {
type plug
slave.pcm {
type softvol
slave.pcm "remap-surround71"
control {
name "PCM Playback Volume"
card $CARD
}
}
}

capture.pcm {
type plug
slave.pcm {
type softvol
slave.pcm {
@func concat
strings [ "dsnoop:" $CARD ]
}
control {
name "Digital Capture Volume"
card $CARD
}
min_dB -30.0
max_dB 30.0
resolution 121
}
# to avoid possible phase inversions with digital mics
route_policy copy
}
hint.device 0
}

HDA-Intel.pcm.surround40.0 cards.HDA-Intel.pcm.front.0
HDA-Intel.pcm.surround51.0 cards.HDA-Intel.pcm.front.0
HDA-Intel.pcm.surround71.0 cards.HDA-Intel.pcm.front.0

HDA-Intel.pcm.iec958.0 {
@args [ CARD AES0 AES1 AES2 AES3 ]
@args.CARD {
type string
}
@args.AES0 {
type integer
}
@args.AES1 {
type integer
}
@args.AES2 {
type integer
}
@args.AES3 {
type integer
}
type asym
playback.pcm {
type hooks
slave.pcm {
type hw
card $CARD
device 1
}
hooks.0 {
type ctl_elems
hook_args [
{
name "IEC958 Playback Default"
lock true
preserve true
value [ $AES0 $AES1 $AES2 $AES3 ]
}
{
name "IEC958 Playback Switch"
lock true
preserve true
value true
}
]
}
}

capture.pcm {
type hooks
slave.pcm {
type hw
card $CARD
device 1
}

hooks.0 {
type ctl_elems
hook_args [
{
name "IEC958 Capture Switch"
lock true
preserve true
value true
}
]
}
}

hint.device 1
}

HDA-Intel.pcm.hdmi.0 {
@args [ CARD AES0 AES1 AES2 AES3 ]
@args.CARD {
type string
}
@args.AES0 {
type integer
}
@args.AES1 {
type integer
}
@args.AES2 {
type integer
}
@args.AES3 {
type integer
}
type hooks
slave.pcm {
type plug
slave.pcm "remap-surround71"
}
hooks.0 {
type ctl_elems
hook_args [
{
name "IEC958 Playback Default"
lock true
preserve true
value [ $AES0 $AES1 $AES2 $AES3 ]
}
{
name "IEC958 Playback Switch"
lock true
preserve true
value true
}
]
}
hint.device 3
}

HDA-Intel.pcm.modem.0 {
@args [ CARD ]
@args.CARD {
type string
}
type hw
card $CARD
device 6
hint.show off
}
---------------------------------------------------------------

3. Создаём в своём юзерском каталоге файл .asoundrc с таким содержимым:

(Примечание: В данном случае для отделения канала сабвуфера, были заюзаны ladspa плагины из пакетов cmt и blop, которые, соответственно, тоже нужно поставить).
---------------------------------------------------------------

pcm.!default {
type plug
slave.pcm jack
}

# for libflashplugin

ctl.mixer0 {
type hw
card 0
}

pcm.hda_card {
type hw
card 0
device 0
}

ctl.hda20to51 {
type hw
card 0
}

# Jack needs both pcm and ctl for work, and it must be a route
pcm.jackinput {
type route;
slave.pcm "upmix_20to51";
slave.channels 2;
ttable.0.0 1;
ttable.1.1 1;
}
ctl.jackinput {
type hw;
card 0;
}

pcm.upmix_21to51 {
type plug
slave.pcm dmix51
slave.channels 6
ttable {
0.0 1 # front left
1.1 1 # front right
0.2 1 # rear left
1.3 1 # rear right

# Front left/right to center.
0.4 0.5
1.4 0.5

# Subwoofer, more powerful to compensate for bass-removal from other speakers.
# Would normally be 1.
2.5 2.5
}
}

ctl.lowpass_21to21 {
type hw;
card 0;
}

pcm.lowpass_21to21 {
type ladspa
slave.pcm upmix_21to51
path "/usr/lib/ladspa"
channels 3
plugins {
0 {
id 1098 # Identity (Audio) (1098/identity_audio)
policy duplicate
input.bindings.0 "Input";
output.bindings.0 "Output";
}

1 {
id 1052 # High-pass filter
policy none
input.bindings.0 "Input";
output.bindings.0 "Output";
input {
controls [ 100 ]
}
}

2 {
id 1052 # High-pass filter
policy none
input.bindings.1 "Input";
output.bindings.1 "Output";
input {
controls [ 100 ]
}
}

3 {
id 1051 # Low-pass filter
policy none
input.bindings.2 "Input";
output.bindings.2 "Output";
input {
controls [ 100 ]
}
}

}
}

pcm.upmix_20to51 {
type plug;
slave.pcm "lowpass_21to21";
slave.channels 3;
ttable {
0.0 1 # left channel
1.1 1 # right channel
0.2 0.5 # mix left and right ...
1.2 0.5 # ... channel for subwoofer
}
}

pcm.dmix51 {
type dmix;
ipc_key 1024;
ipc_key_add_uid false;
ipc_perm 0660;
slave {
pcm "hda_card"
rate 44100
channels 6
period_time 0
period_size 1024
buffer_time 0
buffer_size 5120
}

# Some cards, like the "nforce" variants require the following to be uncommented. It routes the audio to t he correct speakers.
bindings {
0 0
1 1
2 3
3 2
4 5
5 4
}
}

#/ This is nesessary for alsa jack plugin
pcm.jackplug {
type plug
slave { pcm "jack" }
}

pcm.jack {
type jack
playback_ports {
0 system:playback_1
1 system:playback_2
}
capture_ports {
0 system:capture_1
1 system:capture_2
}
}
---------------------------------------------------------------
Возможно, я тут не всё написала. Это минимум, который нужен для джека и распределения по каналам, без всяких прочих плюшек. Ещё прикручена настройка для libflashplugin, чтобы не падал.

4. Подцепляем jackd к входу jackinput.

Ура! Звук 5.1, с фильтрацией частот, теперь работает из джека.

Есть некоторые заморочки с втыканием каналов в нужные гнёзда, это выясняется экспериментально, с помощью прослушивания файла на 6 каналов, который можно качнуть тут, например:
http://www.halfgaar.net/media/chan-id.zip (кстати, на том сайте довольно много про настройки этих самых каналов написано).

У меня раскладка на задней панели получилась такая:
розовый - SW/center, зелёный - front, синий - rear.

Вроде ничего не забыла. Всякие настройки джека, алиасов для алсы и т.п. вроде и так понятны, про них писать более подробно не буду.

P.S. да, осталась мелкая бага: в алсамикшере названия каналов для саба и центра перепутаны. я так понимаю, чтобы это пофиксить, надо ковырять настройки конфигов, но мне уже было лень курить маны на них. может, потом поковыряю, на досуге. остальные каналы соответствуют названиям, как и положено.

debian, settings, surround 5.1, linux, hda intel, лытдыбр, alc883, sound, 64 bit

Previous post Next post
Up