Оборудование
Имеется 4 звуковых карты:
  1. Встроенная в чипсет via 686a
  2. USB стерео колонки Juster Multimedia
  3. PCI card Yamaha YMF724-F стереокарточка
  4. PCI card Аудио интерфейс TV-тюнера

Постановка задачи

Задача: обеспечить корректную работу всех четырех карт(больше нет) или по отдельности или в любой комбинации друг с другом. Корректная работа подразумевает, что любая карта доступна любому приложению использующему звук.
Плюс, разные приложения хотят разные карты, и разные сервисы этих карт.
Например, встроенная в чипсет звуковая карта с гарнитурой используется в skype для телефонных разговоров через Интернет. Ее линейный вход задействован для просмотра TV, через аналоговый звуковой выход тюнера. Просмотр, мягко сказано, последний раз телевизор я тестировал, а не смотрел. Смотреть там нечего, про тружеников ударного капиталистического труда.

Для чего все это нужно. Оборудование куплено, на него потрачены трудовые рубли, иногда и нетрудовые баксы. Должно работать. Тем более под Linux.

Итак, операционная система linux Mandrake 10. Ядро 2.6.3-7mdk. Или 2.6.7 собственной сборки по инструкции с Alhimia (см. ссылки.) Поддержка только ALSA драйверов. OSS драйверы мною не используется (deprecated). Люблю все новое.

Так уж случилось, что мое звуковое оборудование подключенное при установке, корректно не определяется, но все-таки определяется, звуковые колонки наровят стать default звуковым устройством. А ведь у них нет и микрофона и других специфических частей. Другие карты запутываются, все настройки съезжают, миксеры бесятся.
В результате я никогда не слышу звукового приветствия в KDE,сразу после установки. Иногда слышу, опять же через USB колонки, но не вижу в мишере свои другие устройства.

Фактически отсутствует plug & play. Все надо доводить кувалдой как на заводе выпускающем машинки. Погрешность плюс минус пара звуковых карт.

Ситуация не очень, будем исправлять.

Конфигурирование оборудования

Вынимаем все карты из компьютера. Загружаемся. Линукс удачно определяет встроенную звуковую карточку. Остается в микшере KDE включить звуковые каналы (по умолчанию они (mute) выключены). Все, даже стало слышно телевизор в наушниках.
Выключаем компьютер. Вставляем в usb порт USB колонки.(Почему не плаг анд плай, так плаг анд плай работает, появляется новое устройство, все правильно, проблемы возникают после перезагрузки) Загружаемся. В процессе запуска видим, что имеются какие-то проблемы с ALSA. В результате в KDE в микшере только USB колонки, а звука через них нет, почему-то.

Вставлять другие карточки, смысла не имеет. Проблема моделируется на двух карточках. Решим здесь, решим и с четырьмя или с пятью, или пока хватит PCI слотов или USB портов и USB контроллеров. Мы скорее упремся в ограничение кол-ва звуковых карт в подсистеме ALSA (если не изменяет память что-то около 8).

Итак ситуация, одна вроде карта работает (вроде, это потому что я не все тестировал, только запись и воспроизведение), а две не работают.

Что делать?

Возможно кто-то уже решил проблему, поэтому формулируем поисковый запрос на естественном языке - "Две звуковые карты в Linux" и передаем его интеллектуальному поисковику www.rambler.ru или www.google.ru или www.yandex.ru, а также "Two sound card Linux"
Также переходим на сленг "Две звуковухи в Linux" Ищем.
Смотрим. Различные HOWTO по звуку в Linux

Несколько форумов с вопросом про две звуковухи, несколько пожеланий читать документацию по alsa, пара советов пошаманить с/etc/modules.conf. Все устал, потратил полчаса. Для первого захода хватит, попробуем сами разобраться.

Наткнулся на интересную экспериментальную технологию AuDSL (Audio Digital Subscriber Line), которая позволяет использовать звуковую карту для организации выделенной цифровой линии. Надо посмотреть может уже есть готовое ПО. Это же только представить, две звуковые карты и витая пара и все - цифровая линия с приличной скоростью. Позже.

Начнем читать документацию.
Исходная посылка и вопрос к документации - Если каждая карта в отдельности более менее работоспособна под Linux (а Windows - они все работают), то проблема скорее всего кроется в конфигурационной информации. Т.к. дистрибутивы считают один компьютер-одна звуковуха, как раньше один компьютер-один процессор, ну ладно, пусть считают. Т.е. надо шаманить с/etc/modules.conf. А чтобы с ним шаманить надо стать шаманом, а ВУЗы России такой факультет не предлагают. Поедем на Ассембли оторвемся. Заодно подумаем как прожить на 1000 руб. в месяц.

Читаю (см. ссылки)
И сразу попробуем найти русскоязычную более-менее свежую документацию по ALSA. Почему более-менее, видимо это особенности торговли в странах бывшего советского союза.
1999 год, это как свежее или не свежее? Консервы столько не живут.

Говорила мама учи английский, но не говорила как. А я вот теперь читаю Драгункина и более менее начал понимать сложность русского языка. Берем первоисточник в руки (см. ALSA сайт ссылки). Ощущаем благоговение.

Читаем раздел "Supported soundcards", через строчки, нет через абзацы. Вообще не читаем, пользуемся поиском на странице. Если читать все в Интернетке, здоровья не хватит.
В этом разделе мы определяемся, что не имеется особой несовместимости нашего оборудования с Linux.
У меня не имеется, потому что когда я покупаю оборудование я всегда предварительно узнаю имеется ли поддержка в Linux.

Просматриваем раздел "Linux Audio Users Guide". Оо. От обилия информации, не знаю что выбрать. Заинтересовывает "The ALSA Soundcard Matrix". Можно выбрать производителя своей карты и посмотреть описания модуля. Я выбираю via, в другой вкладе выбираю Yamaha. Для usb audio устройств есть заметка и ссылка на usb-audio страничку.

Читаю о своем драйвере via.
Вах-вах, там есть забавный пункт "A short explanation of what happens in the /etc/modules.conf file"
Там есть примерчик с двумя картами. То, что малооплачиваемый доктор прописал.
Правильная опция id это то, что надо. Проверяем. Быстро набиваю в командной строке:
#kwrite /etc/modules.conf
Редактирую файл /etc/modules.conf
alias sound-slot-0 snd-via82xx
alias sound-slot-1 snd-usb-audio
options snd_via82xx id="first"
options snd_usb_audio id="second"

Пока более ничего. Ждем пока я перезагружусь.
Там еще написано что надо загрузить какие-то OSS модули эмуляции. Пока не будем.
Перезагрузили. Не работает.
Диагностика
# cd /proc/asound
# cat devices
0 [second ]: USB-Audio - Philips USB Digital Speaker Sys
Philips Electronics Philips USB Digital Speaker Sys at usb-
Вижу что загружена только одна карта, а именно USB колонки.
Во время загрузки было замечено, что подсистема USB загружается до ALSA. А ALSA пишет что уже модуль уже загружен. Плюс колонки очень рано щелкают (звуковой сигнал подключения драйвера, в винде также)
Выполняю команду показывающую сообщения при загрузке ядра:
#dmesg
Вижу, что после загрузки подсистемы USB, происходит поиск и подключение USB устройств и среди них мои USB колонки.

Итак. Грузиться подсистема USB, грузятся модули USB, грузится ALSA. В силу каких-то причин, ALSA конфигурирует мое USB устройство, но не конфигурирует мою встроенную звуковую карту.

Проблема видимо в порядке загрузки и конфигурирования модулей. Где это порядок задается?

Конечно вышеприведенную проблему можно решить сделав самостоятельный скрипт, который после стандартной загрузки Mandrake 10 выгружает все, что она нагрузила и делает все по своему. Это работает, но как-то неправильно. Это как кодировка KOI8-R, в свое время это был хак, для использования существующего импортированного ПО, но сейчас другие времена, надо соответствовать правильным стандартам, сейчас ведь другое импортированное ПО, локализованное под местный рынок.

Разбираемся с загрузкой подсистемы ALSA в Mandrake 10.
Я уже знаю, что загружаемые сервисы Mandrake 10 находятся в папке /etc/init.d/
Вижу модуль alsa. Смотрю в редакторе. Логика простая раздел start stop и еще там несколько.
Изучаю раздел start. Вроде какой-то цикл, а в нем modprobe. Синтаксис awk не очень понятен, bash через слово.
Вообщем modprobe в цикле, надо думать для каждой моей карты попытка загрузки модуля.

Вспоминаю что можно отключить автоматическую загрузку модуля поместив его имя в черный список.
Редактирую /etc/hotplug/blacklist, вношу строку snd-usb-audio и комментарий, чтобы потом не забыть.

В процессе изучения man страниц modules.conf,перехожу на modprobe, натыкаюсь на файл /etc/modprobe.conf, изучаю что делает (man:/modprobe.conf). В нем указана моя встроенная карта, зачем?
#cat /etc/modprobe.conf
alias sound-slot-0 snd-via82xx
install scsi_hostadapter /sbin/modprobe usb-storage; /bin/true
install snd-via82xx /sbin/modprobe --first-time --ignore-install snd-via82xx && { /sbin/modprobe snd-pcm-oss; /bin/true; }
install usb-interface /sbin/modprobe usb-uhci; /sbin/modprobe ehci-hcd; /bin/true
remove snd-via82xx { /sbin/modprobe -r snd-pcm-oss; } ; /sbin/modprobe -r --first-time --ignore-remove snd-via82xx
Комментирую все относящееся к моей карте.

Перезагружаюсь. Не работает, даже USB колонки не работают. Ничего из звуковых карт нет.
#lsmod
Никаких модулей нет, загружено только soundcore, которое привязано к тюнеру через tvaudio

Интересно, колонки в blacklist сидят, автоматически они не грузяться, тогда почему не выполняется сервис ALSA или хотя бы...?
Возникает мысль, может сервис ALSA зависит от /etc/modprobe.conf?
Изучаю лучше справку. Итак, /etc/modprobe.conf - конфигурирует выполнение команды modprobe, которая загружает модули. Тогда зачем нужен файл /etc/modules.conf? Он тоже конфигурирует, у него более развитый синтаксис и он optional. Что же это значит, что его можно удалить?
А кто тогда выполняет команду modprobe? Предположение, наверное hotplug и в каком месте?

Делаю хитрую замену, комментирую /etc/modules.conf и переношу информацию в /etc/modprobe.conf
Вот новый /etc/modprobe.conf
...
alias sound-slot-0 snd-via82xx
alias sound-slot-1 snd-usb-audio
options snd-via82xx index=0 id="first"
options snd-usb-audio index=1 id="second"
...

Попутно с помощью команды modinfo snd-via82xx выясняю про опцию index – это опция и задает порядок в звуковых картах, без нее как на душу положит.

Итак, перезагружаюсь.
И наконец-то, сервис ALSA определил и загрузил 2 моих звуковухи.
#cat /proc/asound/cards
0 [first ]: VIA686A - VIA 82C686A/B rev20
VIA 82C686A/B rev20 at 0xdc00, irq 10
1 [second ]: USB-Audio - Philips USB Digital Speaker Sys
Philips Electronics Philips USB Digital Speaker System at usb-0000:00:07.2-2.2, fu
Выходит /etc/modules.conf не сильно влияет на звуковые карты.

Теперь окончательно сделаем 4 карты. Вносим изменения в /etc/modprobe.conf
#cat /etc/modprobe.conf
...
alias snd-card-0 snd-via82xx
alias snd-card-1 snd-usb-audio
alias snd-card-2 snd-ymfpci
alias snd-card-3 snd-bt87x
options snd-via82xx index=0 id="via"
options snd-usb-audio index=1 id="usb"
options snd-ymfpci index=2 id="yamaha"
options snd-bt87x index=3 id="tuner"
...

Еще я подредактировал файл /etc/init.d/alsa
была функция
function startoss() {
[ "$startosslayer" = true ] &&
for i in mixer pcm seq ; do /sbin/modprobe snd-${i}-oss >/dev/null 2>&1 ; done
}
стала функция
function startoss() {
[ "$startosslayer" = true ] &&
for i in mixer pcm ; do /sbin/modprobe snd-${i}-oss >/dev/null 2>&1 ; done
}
Как видно, раньше загружался еще и seq (секвенсер) для каждой карты, я его убрал. Тут есть фича ALSA, что seq должен грузиться для одной карты, для остальных нет. Наверное это баг скрипта.

Выключаюсь, в слоты вставляются карты.
После перезагрузки, сервис ALSA при старте показывает какие модули загрузил.
Вот что появляется в подсистеме ALSA:
#cat /proc/asound/cards
0 [via ]: VIA686A - VIA 82C686A/B rev20
VIA 82C686A/B rev20 at 0xdc00, irq 10
1 [usb ]: USB-Audio - Philips USB Digital Speaker Sys
Philips Electronics Philips USB Digital Speaker Sys at usb-0000:00:07.2-2.2, fu
2 [yamaha ]: YMF724F - Yamaha DS-XG (YMF724F)
Yamaha DS-XG (YMF724F) at 0xdfff0000, irq 9
3 [tuner ]: Bt87x - Brooktree Bt878
Brooktree Bt878 at 0xdfdff000, irq 5

Я просто решил сменить идентификаторы (first... на via и т.д) как более понятные. Итак, четыре карты в наличии.

Тестирование воспроизведения и записи

Займемся теперь проверкой воспроизведения звука через устройства поддерживающие playback и записи с устройств поддерживающих capture. Дело в том, что понятие устройство и понятие звуковая карта в ALSA различаются. Связаны отношением одна звуковуха-много устройств.

Для начала использования необходимо включить в микшере (alsamixer) все нужные каналы (сделать unmute)
и поставить приемлемую громкость.
#alsamixer -c 0
#alsamixer -c 1
#alsamixer -c 2
#alsamixer -c 3
Надо помнить, что имеется программа alsactl которая при загрузке восстанавливает значения установок микшеров для каждого устройства. Она запускается в сервисе ALSA. Так что перед использованием проверьте установки микшеров, может у вас сервис не стартует и все миксеры отключены.

Смотрим что имеется:
# cat /proc/asound/devices
или чтобы увидеть только устройства воспроизведения:
cat /proc/asound/devices | grep playback
16: [0- 0]: digital audio playback
48: [1- 0]: digital audio playback
82: [2- 2]: digital audio playback
81: [2- 1]: digital audio playback
80: [2- 0]: digital audio playback
Не пугаемся, на счет сложных карт типа моей второй ямахи, устройств воспроизведения может быть очень много, как и устройств записи
Начнем, используем команду aplay из пакета утилит ALSA.
Первое устройство. Одеваем гарнитуру и ждем.
#aplay -D hw:0,0 test.wav
Я работают под рутом и у меня там имеется тестовый звуковой файл test.wav, чего и вам советую.
Слышу звук в гарнитуре.
Далее.
#aplay -D hw:1,0 test.wav
Слышу звук через USB колонки.
Далее.
#aplay -D hw:2,0 test.wav
Вижу, что у моей третьей карты отсутствует возможность воспроизведения, только возможность захвата (записи).

Синтаксис устройств:
hw: X,Y – означает карта X, устройство Y, точная ссылка на PCM устройство.

Вот что про запись:
# cat devices | grep capture
24: [0- 0]: digital audio capture
91: [2- 3]: digital audio capture
88: [2- 0]: digital audio capture
121: [3- 1]: digital audio capture
120: [3- 0]: digital audio capture
А здесь у второй карты (USB колонки, index=1) отсутствует возможность записи.

Тестируем запись звука.
#arecord -D hw:0,0 -f cd record.wav
Здесь опция -f cd задает формат записи, без нее исп. иной формат, который не всегда удается воспроизвести.
Некоторые форматы не поддерживаются оборудованием, надо пробовать.
Ctrl-c прерывает запись звука.

Теперь воспроизводим на USB колонки:
#aplay -D hw:1,0 record.wav
Слышу собственный бред в колонках.

Проверяю свою третью карту, здесь мне придется переставить микрофон, чтобы суметь записать.
#arecord -D hw:2,0 -f cd record.wav
#aplay -D hw:1,0 record.wav

И тут вроде работает, кроме hw:2,3, надо потом разобраться

Посмотрим, что можно сделать с моей четвертой картой (index=3).
Здесь начинаются проблемы. В общем, я на данном этапе не смог добиться с этой картой никакого результата. Проблема, видимо в том, что разводка PCI аудио не выполнена на моей TV-карте. Так что звук по PCI шине мне не придет. Обидно, так бы освободился линейный выход.

Можно еще проверить работоспособность ALSA-OSS слоя. Для этого пакет sox должен быть установлен.
# play -d /dev/dsp1 test.wav
Выводит звук на USB колонки. Работает.
Или artsplay – проигрывается звук через kde сервер (aRts) у меня пока на встроенную звуковую карту.

Ну и программка record из пакета sox.

Также можно использовать Krec и Audacity.

На данном этапе, специфицировав в конкретных приложениях конкретное устройство, можно наслаждаться множеством звуковых карт. Исключения со звуковым сервером KDE (aRts) и др. программами завязанными на default (/dev/dsp) устройство.
Осталось только сделать чтобы звук о системных уведомлениях KDE, шел не через default устройство, а на USB колонки. Также хочу смотреть DVD и чтобы звук шел на USB колонки.
Хочу указать для разных приложений разные звуковые карты. Есть такие приложения, которые работают только с default устройством (skype, krec например), а есть где используемое устройство можно указать (audacity например). Тогда можно будет записать тестовые примеры с микрофона с любой карты, а вывести на колонки.

На данном этапе возник новый глюк. Звуковой сервер KDE (aRts) отказывается использовать другое устройство, даже при загруженном OSS слое. Разберусь чуть позже.

Заключение

Все. Остались тонкости настройки конкретных приложений.
Увы, многие приложения работающие со звуком являются приложениями разного поколения, использующие ту или иную технику работы со звуком и различные Sound API. Издержки открытой системы.
Имеет смысл подобрать себе набор приложений заточенных под использование ALSA, (или иного API), но не всегда получается, тот же skype, ждем в нем поддержки ALSA

Неисправности

Здесь как и при любых неисправностях помогает четкая организация процесса отладки. По шагам, исключая каждый уровень.
Помните также, что имеются проблемы с распределением прерываний (irq) для pci карт.
Заставьте работать оборудование по отдельности, потом усложняйте конфигурацию. Можно попытаться отключить другое оборудование.

Команды: lspci, lsusb покажут что у вас определилось.. Используйте Windows чтобы лучше узнать свое оборудование.

Заметки

cat /etc/asound.state - файл с сохраненным состоянием утилиты alsactl

В ALSA есть драйвер (snd-dummy) эмулирующий звуковую карту. Ни одна программа не вывалится из за отсутствия звуковой карты.

What sound system does Skype for Linux beta use?
Skype for Linux beta uses OSS (Open Sound System), using /dev/dsp as its audio input and output device. It works fine also with ALSA and its OSS emulation layer. Native support for other sound systems will be added in the future.

Ссылки

  1. Сайт Linux Alhimia http://linux.alhimia.ru/ . Правильная инструкция по сборке ядра 2.6.7.
  2. ALSA сайт http://www.alsa-project.org/ . Advanced Linux Sound Architecture - расширенная архитектура звука в Linux
  3. file:/usr/src/linux/Documentation/sound/alsa/ALSA-Configuration.txt
  4. Skype http://www.skype.com/ - программа для телефонных переговоров через Интернет, имеет шлюз в PSTN (skypeout)
  5. AuDSL http://www.araneus.fi/audsl/ - технология цифровой линии с использованием программного модема

Важная информация
Господа, если Вы не хотите возиться с настройкой оборудования в Linux, то я рекомендую приобрести Mac OS X или Windows Vista.
Be happy.

История изменений

  • 25.03.2012 Перенос на сайт gimmor.blogspot.com
  • 22.12.2006 Добавлены ссылки на другие статьи
  • 16.12.2006 Изменен дизайн сайта
  • 11.12.2006 Добавлена реклама Google AdSense и кнопка Яндекс.Деньги. Теперь можно поддержать автора материально
  • 06.08.2004 Первая редакция – первый подход к снаряду
Дмитрий