Автор Тема: usb-audio карта и alsa  (Прочитано 9987 раз)

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
usb-audio карта и alsa
« : 24.06.2014 07:21:44 »
Как сделать внешнюю usb-аудиокарту дефолтной в системе с alsa

Вариант I: Жёсткая индексация аудиокарт
Сложный

Смотрим свои аудиоустройства и их индексацию:
$ cat /proc/asound/cards
 0 [ICH6           ]: ICH4 - Intel ICH6
                      Intel ICH6 with AD1981B at irq 21
 1 [Headset        ]: USB-Audio - Logitech USB Headset
                      Logitech Logitech USB Headset at usb-0000:03:00.1-1, full speed
Их два:
Дефолтная карта ICH6 с индексом 0.
Задача:
Поменять индексы так, чтобы usb аудиокарта Headset была с индексом 0.

Какой ядерный модуль использует аудиокарта ICH6?
$ lspci -knn | grep -A2 -i audio
00:1e.2 Multimedia audio controller [0401]: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller [8086:266e] (rev 03)
Subsystem: Hewlett-Packard Company NX6110/NC6120 [103c:099c]
Kernel driver in use: snd_intel8x0
Используется ядерный модуль snd_intel8x0

В основном usb аудиоустройства используют ядерный модуль snd_usb_audio
# find /lib/modules/3.12.22-std-def-alt1/ -name snd*|grep usb|grep audio
/lib/modules/3.12.22-std-def-alt1/kernel/sound/usb/snd-usb-audio.ko
За редким исключением.

Какой модуль к какой карте относится разобрались.

Теперь нас интересует файл:
$ cat /etc/modprobe.d/alsa-modindex.conf
## spare index=0 for a hotplug soundcard (if any)
#options snd-usb-audio index=0

## offset HDMI output compared to onboard audio (#28648)
#options snd_hda_intel index=2,3

#options snd_intel8x0 index=2
#options snd_via82xx index=2
#options snd-bt87x index=3
#options snd_intel8x0m index=4
#options snd-atiixp-modem index=4
#options snd-via82xx-modem index=4

## get PC speaker out of the way
options snd_pcsp index=10

Теперь меняем индексы у карт так, чтобы Headset стала индексом 0, а ICH6 - индексом 1:
$ cat /etc/modprobe.d/alsa-modindex.conf
## spare index=0 for a hotplug soundcard (if any)
#options snd-usb-audio index=0

## offset HDMI output compared to onboard audio (#28648)
#options snd_hda_intel index=2,3

#options snd_intel8x0 index=2
#options snd_via82xx index=2
#options snd-bt87x index=3
#options snd_intel8x0m index=4
#options snd-atiixp-modem index=4
#options snd-via82xx-modem index=4

## get PC speaker out of the way
#options snd_pcsp index=10

options snd-usb-audio index=0
options snd_intel8x0 index=1

Модули и текущую индексацию можно увидеть здесь:
# cat /proc/asound/modules
 0 snd_usb_audio
 1 snd_intel8x0
Если непонятно какой модуль к какой карте относится, ищем поиском в lspci через less - клавиша /
После которой вводится модель поиска. Например имя ядерного модуля или тип устройства.
Или та же модель для поиска в команде ниже.
В примере для поиска, регистр типа устройства, audio, игнорируется:
# lspci -knn | less -p audio -I
Вместо типа audio, моделью для поиска может быть название ядерного модуля snd из вывода выше.

Если карт на самом деле больше, их можно все переиндексировать.
Перегружаемся и получаем звук usb-audio дефолтным.

В конфликтных ситуациях, когда две карты используют один и тот же ядерный модуль, их можно жёстко задать через id ( /etc/modprobe.d/alsa-modindex.conf):
http://forum.altlinux.org/index.php/topic,28619.msg199386.html#msg199386
options snd-usb-audio index=0
options snd-hda-intel index=1
options snd-hda-intel index=2  id="NVidia"

Или:
Дописал в файл /etc/modprobe.d/alsa-modindex строчку
options snd-hda-intel index=1,0
И после перезагрузки порядок поменялся.

 options - позволяет задать модулю параметр.
 snd-hda-intel  -  название модуля драйвера алса, одинаковое для обоих карт (видимо одинаковая микросхема).
 index - параметр, задающий приоритет модуля.
В данном случае есть два модуля с одинаковым названием. Поэтому первому (с индексом 0) задается более низкий приоритет (index= 1), а второму (с индексом 1) задается более высокий приоритет (index=0).
Получается, что индексы меняются местами с помощью одной строки.


Вариант II: Горячее подключение usb-audio

Исходно-дефолтное:
# cat /etc/modprobe.d/alsa-modindex.conf
## spare index=0 for a hotplug soundcard (if any)
#options snd-usb-audio index=0

## offset HDMI output compared to onboard audio (#28648)
#options snd_hda_intel index=2,3

#options snd_intel8x0 index=2
#options snd_via82xx index=2
#options snd-bt87x index=3
#options snd_intel8x0m index=4
#options snd-atiixp-modem index=4
#options snd-via82xx-modem index=4

## get PC speaker out of the way
options snd_pcsp index=10

В системе с:
# rpm -qa --last *alsa*|sort
alsa-oss-1.0.25-alt2                          Пн 28 апр 2014 22:10:53
alsa-tools-1.0.27-alt2                        Чт 01 май 2014 23:16:56
alsa-utils-1.0.27-alt3                        Пт 18 окт 2013 09:26:53
libalsa-1.0.27-alt3                           Пт 18 окт 2013 09:26:23
...
udev-alsa-0.3-alt1.2                          Пт 18 окт 2013 09:27:29

До подключения usb-audio:
# cat /proc/asound/cards
 0 [ICH6           ]: ICH4 - Intel ICH6
                      Intel ICH6 with AD1981B at irq 21
# cat /proc/asound/modules
 0 snd_intel8x0

После подключения usb-audio:
# cat /proc/asound/cards
 0 [ICH6           ]: ICH4 - Intel ICH6
                      Intel ICH6 with AD1981B at irq 21
 1 [Headset        ]: USB-Audio - Logitech USB Headset
                      Logitech Logitech USB Headset at usb-0000:03:00.1-1, full speed
# cat /proc/asound/modules
 0 snd_intel8x0
 1 snd_usb_audio

Собственно сама таблетка usb-audio hotplug (горячее подключение):
# ll /etc/udev/rules.d/00-usb-audio-hotplug.rules
-rw-r--r-- 1 root root 344 июн 24 06:30 /etc/udev/rules.d/00-usb-audio-hotplug.rules
# cat /etc/udev/rules.d/00-usb-audio-hotplug.rules
KERNEL=="pcmC[D0-9cp]*", ACTION=="add", PROGRAM="/bin/sh -c 'K=%k; K=$${K#pcmC}; K=$${K%%D*}; echo defaults.ctl.card $$K > /etc/asound.conf; echo defaults.pcm.card $$K >>/etc/asound.conf'"
KERNEL=="pcmC[D0-9cp]*", ACTION=="remove", PROGRAM="/bin/sh -c 'echo defaults.ctl.card 0 > /etc/asound.conf; echo defaults.pcm.card 0 >>/etc/asound.conf'"

Перегрузить рулезы:
# udevadm control --reload
Или перезагрузить компьютер.

Как это работает?

usb-audio не подключено к порту:
# cat /etc/asound.conf
defaults.ctl.card 0
defaults.pcm.card 0
defaults.pcm.card 0

usb-audio подключено к порту:
# cat /etc/asound.conf
defaults.ctl.card 1
defaults.pcm.card 1
defaults.pcm.card 1

usb-audio отключено от порта:
# cat /etc/asound.conf
defaults.ctl.card 0
defaults.pcm.card 0
defaults.pcm.card 0

После горячего подключения usb-audio требуется перезапуск аудио-приложения.

Таблетку:
Hot-plugging a USB sound card
рекомендовали тут:
https://bugzilla.altlinux.org/show_bug.cgi?id=28648#c1


Вариант III: "Ручной" триггер переключения аудиокарт

Этот же (Вариант II) вариант для аудиокарт
# cat /proc/asound/cards
 0 [ICH6           ]: ICH4 - Intel ICH6
                      Intel ICH6 with AD1981B at irq 21
 1 [Headset        ]: USB-Audio - Logitech USB Headset
                      Logitech Logitech USB Headset at usb-0000:03:00.1-1, full speed

у которых текущие индексы,
# cat /proc/asound/modules
 0 snd_intel8x0
 1 snd_usb_audio

выполняется скрипт-триггером, не требующим udev-alsa:
# VAL=$(cat /etc/asound.conf |tail -c 2) && \
if (( $VAL == 1 )); then sed -i 's/1/0/g' /etc/asound.conf; \
else sed -i 's/0/1/g' /etc/asound.conf; fi
где:

/etc/asound.conf:
# cat /etc/asound.conf
defaults.ctl.card 1
defaults.pcm.card 1

Показать последний символ в последней строке
VAL=$(cat /etc/asound.conf |tail -c 2)

Проверка - если дефолтная карта в /etc/asound.conf с индексом 1, - истина
if (( $VAL == 1 ));

Тогда в файле /etc/asound.conf заменить в строках 1 на 0 сделав дефолтной карту 0
then sed -i 's/1/0/g' /etc/asound.conf

Иначе (если в /etc/asound.conf - 0) в /etc/asound.conf  заменить 0 на 1, сделав дефолтной карту с индексом 1, - см. cat /proc/asound/cards
else sed -i 's/0/1/g' /etc/asound.conf
В else можно сделать более жёсткую проверку, добавив условие:
if (( $VAL == 0 ));
с соответствующим:
then sed -i 's/0/1/g' /etc/asound.conf; fi

Работает это так:
# cat /etc/asound.conf
defaults.ctl.card 0
defaults.pcm.card 0
# VAL=$(cat /etc/asound.conf |tail -c 2) && \
if (( $VAL == 1 )); then sed -i 's/1/0/g' /etc/asound.conf; \
else sed -i 's/0/1/g' /etc/asound.conf; fi
# cat /etc/asound.conf
defaults.ctl.card 1
defaults.pcm.card 1
# VAL=$(cat /etc/asound.conf |tail -c 2) && \
if (( $VAL == 1 )); then sed -i 's/1/0/g' /etc/asound.conf; \
else sed -i 's/0/1/g' /etc/asound.conf; fi
# cat /etc/asound.conf
defaults.ctl.card 0
defaults.pcm.card 0

Если сменить индексы правкой скрипта, скрипт сможет переключать например карты с индексами 1 и 2, устанавливая их по очереди дефолтной аудиокартой.
Минимальные требования скрипта, это наличие sed и libalsa в системе.

Этот вариант можно повесить опционально на панель через sudo для общесистемного переключения на дефолтную аудиокарту. Или файл asound.conf положить в домашний каталог как $HOME/.asound.conf и поправить скрипт.


Вариант IV: переключение аудиокарт через asoundconf-gtk(GUI) / asoundconf(терминал)

Изначально ваш выбор карт может быть например таким
0 - индекс аудиокарты (0 - дефолтная)
В квадратных скобках id (идентификатор) звуковой карты
$ cat /proc/asound/cards
 0 [ICH6           ]: ICH4 - Intel ICH6
                      Intel ICH6 with AD1981B at irq 21

Используемый картой(ами) модуль
$ cat /proc/asound/modules
 0 snd_intel8x0

После подключения usb-гарнитуры список индексов и модулей будет таким
$ cat /proc/asound/cards
 0 [ICH6           ]: ICH4 - Intel ICH6
                      Intel ICH6 with AD1981B at irq 21
 1 [Headset        ]: USB-Audio - Logitech USB Headset
                      Logitech Logitech USB Headset at usb-0000:03:00.0-1, full speed
$ cat /proc/asound/modules
 0 snd_intel8x0
 1 snd_usb_audio

Наша задача сменить приоритет usb-гарнитуры сделав её дефолтной.
Для этого устанавливаем пакеты:
# apt-get install asoundconf asoundconf-gtk

После установки пакетов никакие конфигурационные файлы в домашнем каталоге не содержатся:
$ cat ~/.asoundrc
cat: /home/user/.asoundrc: Нет такого файла или каталога

Вызываем графический конфигуратор выбора аудиокарты:
Меню Xfce -> Настройки -> Default Sound Card

В появившемся окне выбираем нашу подключенную к usb-порту аудио-гарнитуру.
После чего файлы создадутся,
$ cat ~/.asoundrc
# ALSA library configuration file

# Include settings that are under the control of asoundconf(1).
# (To disable these settings, comment out this line.)
</home/user/.asoundrc.asoundconf>


а usb-гарнитура станет дефолтной
$ cat ~/.asoundrc.asoundconf
# ALSA library configuration file managed by asoundconf(1).
#
# MANUAL CHANGES TO THIS FILE WILL BE OVERWRITTEN!
#
# Manual changes to the ALSA library configuration should be implemented
# by editing the ~/.asoundrc file, not by editing this file.
!defaults.pcm.card Headset
defaults.ctl.card Headset
defaults.pcm.device 0
defaults.pcm.subdevice -1
defaults.pcm.nonblock 1
defaults.pcm.compat 0
defaults.pcm.minperiodtime 5000
defaults.pcm.ipc_key 5678293
defaults.pcm.ipc_gid audio
defaults.pcm.ipc_perm 0660
defaults.pcm.dmix.max_periods 0
defaults.pcm.dmix.rate 48000
defaults.pcm.dmix.format "unchanged"
defaults.pcm.dmix.card defaults.pcm.card
defaults.pcm.dmix.device defaults.pcm.device
defaults.pcm.dsnoop.card defaults.pcm.card
defaults.pcm.dsnoop.device defaults.pcm.device
defaults.pcm.front.card defaults.pcm.card
defaults.pcm.front.device defaults.pcm.device
defaults.pcm.rear.card defaults.pcm.card
defaults.pcm.rear.device defaults.pcm.device
defaults.pcm.center_lfe.card defaults.pcm.card
defaults.pcm.center_lfe.device defaults.pcm.device
defaults.pcm.side.card defaults.pcm.card
defaults.pcm.side.device defaults.pcm.device
defaults.pcm.surround21.card defaults.pcm.card
defaults.pcm.surround21.device defaults.pcm.device
defaults.pcm.surround40.card defaults.pcm.card
defaults.pcm.surround40.device defaults.pcm.device
defaults.pcm.surround41.card defaults.pcm.card
defaults.pcm.surround41.device defaults.pcm.device
defaults.pcm.surround50.card defaults.pcm.card
defaults.pcm.surround50.device defaults.pcm.device
defaults.pcm.surround51.card defaults.pcm.card
defaults.pcm.surround51.device defaults.pcm.device
defaults.pcm.surround71.card defaults.pcm.card
defaults.pcm.surround71.device defaults.pcm.device
defaults.pcm.iec958.card defaults.pcm.card
defaults.pcm.iec958.device defaults.pcm.device
defaults.pcm.modem.card defaults.pcm.card
defaults.pcm.modem.device defaults.pcm.device
defaults.pcm.file_format "raw"
defaults.pcm.file_truncate true
defaults.rawmidi.card 0
defaults.rawmidi.device 0
defaults.rawmidi.subdevice -1
defaults.hwdep.card 0
defaults.hwdep.device 0
defaults.timer.class 2
defaults.timer.sclass 0
defaults.timer.card 0
defaults.timer.device 0
defaults.timer.subdevice 0
defaults.namehint.showall off
defaults.namehint.basic on
defaults.namehint.extended off

После смены аудиокарты требуется перезапуск аудиоприложения.


Выбор регулировки звука аудиокарты в Xfce

Правой кнопкой мыши щёлкнуть по аплету микшера в панели задач, выбрать опцию Свойства.
В поле Звуковая карта выбирается звуковая карта звук через которую будет регулировать аплет.
Но после подключения usb-гарнитуры вы не увидите её в списке.
Чтобы гарнитура отобразилась в выпадающем списке, нужно удалить аплет микшера с Панели задач, затем добавить его, после чего карта отобразится в выпадающем списке.

Но есть более короткий путь.
Выполните команду в терминале (эту команду можно сделать исполняемым скриптом и повесить на кнопку в одну из панелей):
$ kill -3 $(ps -eo pid,args|grep xfce4|grep mixer|head -n1|cut -f1 -d '/')

После выполнения этой команды xfce4-mixer автоматически перезапустится, а карта в выпадающем списке отобразится.
Если вы повторите выполнение этой команды менее чем через минуту, всплывёт окно с сообщением:
Цитировать
Модуль «Регулятор громкости»
неожиданно пропал с панели. Хотите его
перезапустить?


Модуль в течение 60 секунд был перезапущен
несколько раз. Если вы нажмёте «Выполнить», панель
попробует запустить его снова, в противном случае он
будет окончательно удалён с панели.

[Выполнить]     [Удалить]

Повторите вызов окна Свойства, окно называется Плагин регулировки звука, и выберите вашу появившуюся в списке usb-audio гарнитуру.

Отключение usb-гарнитуры происходит в обратном порядке:
В окне Свойства микшера сначала выбираете вашу набортную аудиокарту.
Затем в Меню Xfce -> Настройки -> Default Sound Card переключаетесь на набортную аудиокарту,
и затем отключаете usb-гарнитуру от usb-порта.


Переключение аудиокарт из консоли

Смотрим индексы и идентификаторы карт.
Набортная карта:
0 - индекс (0 - дефолтная)
ICH6 - ID (идентификатор) карты
USB гарнитура:
1 - индекс, не дефолтная, низкий приоритет
Headset - ID (идентификатор) карты
$ cat /proc/asound/cards
 0 [ICH6           ]: ICH4 - Intel ICH6
                      Intel ICH6 with AD1981B at irq 21
 1 [Headset        ]: USB-Audio - Logitech USB Headset
                      Logitech Logitech USB Headset at usb-0000:03:00.0-1, full speed
$ cat /proc/asound/modules
 0 snd_intel8x0
 1 snd_usb_audio

Выводим помощь
$ asoundconf --help
Usage:
asoundconf is-active
asoundconf get|delete PARAMETER
asoundconf set PARAMETER VALUE
asoundconf list

Convenience macro functions:
asoundconf set-default-card PARAMETER
asoundconf reset-default-card
asoundconf set-pulseaudio
asoundconf unset-pulseaudio
asoundconf set-oss PARAMETER
asoundconf unset-oss

Изначально конфигов нет
$ ls -a ~/.asoundrc*
ls: невозможно получить доступ к /home/user/.asoundrc*: Нет такого файла или каталога

Посмотреть доступные аудиокарты
$ asoundconf list
Names of available sound cards:
ICH6
Headset

Во время установки умолчальной аудиокарты
$ asoundconf set-default-card Headset

конфиги будут созданы
$ ls -a ~/.asoundrc*
/home/user/.asoundrc  /home/user/.asoundrc.asoundconf

В созданных конфигах:
Переключение аудиокарт активно и не заблокировано
$ grep -v '#' ~/.asoundrc

</home/user/.asoundrc.asoundconf>

USB-гарнитура выбрана умолчальной
$ grep -v '#' ~/.asoundrc.asoundconf|head -n2
!defaults.pcm.card Headset
defaults.ctl.card Headset

Выбор другой карты как умолчальной выполняется по формату
asoundconf set-default-card ID_аудиокарты
где ID_аудиокарты берётся из вывода списка доступных аудиокарт.



Регулировка звука из консоли

Запуском псевдографического конфигуратора
alsamixer

или прямыми командами через amixer.

Посмотреть название контролов карты 0
$ amixer -c0 scontrols|head -n4
Simple mixer control 'Master',0
Simple mixer control 'Master Mono',0
Simple mixer control 'Headphone Jack Sense',0
Simple mixer control 'PCM',0

Посмотреть название контролов карты 1
$ amixer -c1 scontrols|head -n4
Simple mixer control 'Headphone',0
Simple mixer control 'Mic',0

Посмотреть состояние регуляторов аудиокарт
$ amixer -c0 sget Master
Simple mixer control 'Master',0
  Capabilities: pvolume pswitch
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 31
  Mono:
  Front Left: Playback 13 [42%] [-27.00dB] [on]
  Front Right: Playback 13 [42%] [-27.00dB] [on]
$ amixer -c1 sget Headphone
Simple mixer control 'Headphone',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 44
  Mono:
  Front Left: Playback 32 [73%] [-9.00dB] [on]
  Front Right: Playback 32 [73%] [-9.00dB] [on]

Установить регулятор уровня звука на USB-гарнитуре на 63%
$ amixer -c1 sset Headphone 63%
Simple mixer control 'Headphone',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 44
  Mono:
  Front Left: Playback 28 [64%] [-13.00dB] [on]
  Front Right: Playback 28 [64%] [-13.00dB] [on]

Воспроизвести потоковое аудио в подсистеме alsa через аудиокарту 1
$ mplayer -quiet -nocache -softvol -prefer-ipv4 -ao alsa:device=hw=1 http://fr1.1mix.co.uk:8016

В подсистеме pulseaudio через аудиокарту 1
$ mplayer -quiet -nocache -softvol -prefer-ipv4 -ao pulse::1 http://fr3.ah.fm:9000



Продолжение следует...?
« Последнее редактирование: 18.04.2016 04:08:34 от Speccyfighter »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: usb-audio карта и alsa
« Ответ #1 : 21.01.2015 09:52:29 »
Дополнено Вариантом III:
"Ручной" скрипт-триггер переключения аудиокарт usb-audio - набортный аудио-чип.
(Недостаток (?): привязка к индексу долнительной аудиокарты, индекс которой не 0)

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: usb-audio карта и alsa
« Ответ #2 : 16.04.2016 21:48:14 »
Набраться храбрости и свести сообщения в вариант 4 для asoundconf asoundconf-gtk:
https://forum.altlinux.org/index.php?topic=9024.msg226945#msg226945
https://forum.altlinux.org/index.php?topic=9024.msg226952#msg226952
https://forum.altlinux.org/index.php?topic=27016.msg251973#msg251973
https://forum.altlinux.org/index.php?topic=9024.msg222866#msg222866
https://forum.altlinux.org/index.php?topic=32844.msg231679#msg231679

Дополнить вариант 1 вариантом жёсткой индексации индивидуально для пользователя конфигом в его домашнем каталоге (в конце сообщения):
https://forum.altlinux.org/index.php?topic=30330.msg214935#msg214935
« Последнее редактирование: 16.04.2016 22:12:19 от Speccyfighter »