Блог о Gentoo и около-линуксовым штукам

22 января 2014 г.

Pssshhhh ALSA!

5:22 Опубликовал Дмитрий Исаенко , Нет комментариев
Привет!

Настало время настраивать ALSA!

Цель:
1. Настроить звук на конкретном примере.
2. Настроить вывод звука через две звуковые карты одновременно.
3. Настроить программное усиление HDMI выхода
4. Добавить ещё один ползунок громкости для HDMI
5. Сделать всё хорошо

Сдердства:
alsa (kernel level)
phonon

Оборудование:
Материнская: Sabertooth Z87 с Intel HD audio ALC1150
Процессор: Core i7 4770K

1. Ядро
Device Drivers -> 
     Sound Card Support ->
           <M> Advanced Linux Sound Architecture ->
                <M>   Sequencer support
                <M>   OSS Mixer API
                <M>   OSS PCM (digital audio) API
                <M>   Intel HD Audio  --->
                      (2048) Pre-allocated buffer size for HD-audio driver //почему нет?
                      [*]   Build hwdep interface for HD-audio driver         //пусть будет:)
                      [*]   Build Realtek HD-audio codec support                //нужно
                      [*]   Build Analog Device HD-audio codec support     //не нужно?
                      [*]   Build HDMI/DisplayPort HD-audio codec support //нужно

# make && make modules install && cp arch/x86/boot/bzImage /boot && rc-update add alsasound boot
# useradd -a -G audio пользователь

2. Выясним, а что у нас наопределялось
# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: MID [HDA Intel MID], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: MID [HDA Intel MID], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: MID [HDA Intel MID], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC1150 Analog [ALC1150 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 1: ALC1150 Digital [ALC1150 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0 
# cat /proc/asound/cards 
 0 [MID            ]: HDA-Intel - HDA Intel MID
                      HDA Intel MID at 0xf7e34000 irq 16
 1 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xf7e30000 irq 22

Итого:
  •  2 звуковые карты, 0 и 1 (или MID и PCH).
  • Первая, вообще говоря, MIDI устройство (привет странным названиям alsa!) но на самом деле HDMI, вторая - PCH, (т.е. ALC1150).
  • На первой звуковой карте доступно три устройства вывода звука
  • На второй - два.
 Заметьте, в случае, когда в настройках ALSA не указано какое устройтво следует использовать, автоматически используется нулевое.
 Также в конфигурационном файле указывайте устройство по номеру, на случай если вдруг в новых драйверах опомнятся, и переименуют MID в какой-то HDMI.

Перейдём к вкусному.
Настройки для alsa могут хранится глобально(в /etc/asound.conf) и локально($HOME/.asoundrc), что позволяет с лёгкостью определить настройки вывода только через hdmi для конкретного пользователя и наглядно продемонстрировать кто в доме хозяин.

Но будем реалистами, настроим всё для всех!
# cat /etc/asound.conf
################## Микшер ALC1150 #######################
pcm.dmix_1      {
        type dmix               # тип - микшер. Возможно не нужен, но наличие аппаратного микширования под вопросом
        ipc_key 56754164        # Случайный набор цифр (для инициализации ключа стркутуры)
        ipc_perm 0660           # права доступа к структуре IPC
        ipc_gid audio           # группа пользователей.. вообще следует покопаться в документации и проверить
        ipc_key_add_uid true    # присвоить UID. Какая-то магия, всё по заветам офф-документации

        slave {                 # определим параметры устройства сразу, без выноса в отдельную сущность(разницы, ну никакой)
                channels 2      # количество каналов. Сделайте 6 или 5.1 если нужно
                pcm {
                        format S32_LE     # формат сэмплирования. Если вам не плевать, поищите документацию на кодек и вишите что-то адекватное.
                        rate 48000        # частота сэмплирования.. Может стоит остановиться на 44100, но опять же смотрите технические спецификации.
                        type hw           # тип сущности - устройство. Говорит что мы собираемся сделать алиас для устройства.
                        card 1            # номер карты
                        device 0          # номер устройства
                        subdevice 0       # под-устройтво? Если вы видели когда-то что эта опция не 0, дайте знать.
                     }
                period_size 1024          # размер для периода. Если звук заикается, поиграйтесь с этими двумя параметрами.
                periods 8                 # количество периодов. Более подробнее смотрите документацию. В итоге получился размер буфера 1024*8=8192 байт.
        }
       bindings {               # биндинги! Чёрт пойми зачем они тут описаны, в целом и без этого-то работает. 
                 0 0
                 1 1
# настройки для многоканального звука
#                2 2
#                3 3
#                4 4
#                5 5
                }

}
##################  Микшер HDMI #######################
# HDMI 0
pcm.hdmi_generic {                       # параметры устройства вынесенные в отдельную сущность
        format S32_LE
        rate 48000 
        type hw
        card 0 
        device 7 
        channels 2
}
################ Добавим софтварный контроль уровнем громкости в HDMI ####
pcm.control_hdmi
{
        type softvol                     # Вот так декларируется новый ползунок в вашем микшере
        slave {
                pcm "dmix_2"             # используем созданное устройтво dmix_2 (ниже)
        }

        control {                        # Cобственно сами параметры этого ползунка
                name "evil"              # имя для него
                card 0                   # и номер карты. Можно указать ещё номер устройства, если у вас несколько выходов HDMI и вы хотите раздельно ими управлять
        }
        min_dB  -20.0                    # Софтварное усиление. Минимальный порог
        max_dB 20.0                      # ну и максимальный. Будьте бдительны, не перестарайтесь
        resolution 10                    # шаг, с которым будет осуществлятся увеличение/уменьшение громкости
}

# HDMI 0 dmix
pcm.dmix_2                               # микшер для HDMI, ничего интересного..
{
        type dmix
        ipc_key 88896452
        ipc_perm 0660
        ipc_gid audio
        ipc_key_add_uid true
        slave {
                pcm "hdmi_generic"      # см.выше
                period_size 1024
                periods 8
        }
        bindings {
                0 0
                1 1
        }
}
################## Остальное #########
pcm.!default {                         # Устройтво вывода по-умолчанию. Именно его будут использовать всякие flash player и mplayer без параметров
        type plug                      # тип - plug! Да!
        slave.pcm "both"               # что мы будем использовать из всего того, что тут написанно - both, см. ниже
}

################# Настройка вывода на две карты одновременно
pcm.both {
    type route;
    slave.pcm {
        type multi;
        slaves.a.pcm "dmix_1";       # Декларируем что и с чем будем соединять - сущность первая - микшер ALC1150
        slaves.b.pcm "control_hdmi"; # сущность вторая - контрол для HDMI с предусилением.

        slaves.a.channels 2;         # 2 канала в первом устройстве 
        slaves.b.channels 2;         # 2 канала во втором устройстве 

        bindings.0.slave a;          # тут много букв. Всё должно быть ясно по контексту, или.. Верьте в магию!
        bindings.0.channel 0;
        bindings.1.slave a;
        bindings.1.channel 1;
        
        bindings.2.slave b;
        bindings.2.channel 0;
        bindings.3.slave b;
        bindings.3.channel 1;

    }
        ttable.0.0 1;
        ttable.1.1 1;
        ttable.0.2 1;
        ttable.1.3 1;

        hint {                     # вариативно. Если хотите что бы Phonon отображал устройство в своём списке выбора - включите.
             show on
             description "Duplicate"
        }
}

 Всё что вам осталось - выбрать в настройках Phonon устройство default и использовать его по своему усмотрению.
 Таже не забудьте "Выбрать главный канал" в настройках kmix для HDA Intel MID

 Всё готово! Вперёд на встречу приключениям!

p.s. если вдруг с первого раза не получилось и у вас почему-то не удаляеся добавленый контрол, воспользуйтесь следующей хитростью:

 rm /var/lib/alsa/asound.state*
 chmod -x /usr/sbin/alsactl 
 init 6
 chmod +x /usr/sbin/alsactl 

0 коммент.:

Отправить комментарий