Как я могу использовать внешнюю USB-звуковую карту и установить ее по умолчанию?

16

На моем RPi3 установлена ​​внешняя звуковая карта USB от C-Media . Я могу воспроизвести некоторые записи, используя aplay / arecord , указав индекс карты и плагин ALSA. Однако многие другие звуковые файлы не воспроизводятся вообще или не ожидаются. Некоторое другое программное обеспечение плеера также не работает.

Q: Как я могу настроить ALSA для использования по умолчанию?

not2qubit
источник

Ответы:

32

Фон

Удивительно видеть, сколько усилий было вложено в решение различных проблем со звуком для Raspberry Pi. Очевидно, это должно быть самым слабым местом для новых пользователей, чтобы успешно развиваться и использовать ALSA под Raspbian. Потратив немало времени и усилий на то, чтобы заставить мой собственный звук RPi3 работать в разных версиях ОС, а также в других дистрибутивах Linux, я решил написать убедительную страницу с готовыми решениями. По крайней мере, для темы использования внешней звуковой карты на последней Raspbian Stretch .

Звуковая система ALSA

ALSA предназначена для поддержки любых устройств на базе * nix, независимо от конфигурации оборудования и возраста оборудования. Нет нужды пытаться вникнуть в детали 20-летнего развития. Мы просто применяем суть к текущей ситуации.

Однако ни разу в истории человечество не создавало такого количества бесполезных и дисфункциональных диаграмм, как для попытки объяснить ALSA. Единственно отдаленно информативными являются эти два:

введите описание изображения здесь введите описание изображения здесь

Получение системной информации

Первый шаг - выяснить, какой звук, если таковой имеется, работает и какое оборудование у вас уже есть. Существуют всевозможные способы выяснения деталей, но для обычного человека большинство этих деталей не имеют смысла. Мы показываем самое главное.

Что мы хотим знать о нашей (звуковой) системе?

Мы хотим знать:

  • название и версии встроенного звукового оборудования
  • название и версии внешнего звукового оборудования
  • какие драйверы ядра (модули) он использует
  • какие другие драйверы / модули ядра связаны со звуком
  • какие звуковые карты доступны
  • в каком порядке используются звуковые карты и выбираются ОС и программами
  • если есть какие-либо конфликтующие аппаратные или звуковые системные программы

Откуда вы хотите играть и записывать звук в вашей системе?

Ваши варианты воспроизведения звуков могут быть:

  1. От внутреннего 3,5 мм аудио разъем для наушников (аналоговый аудио)
  2. От HDMI подключенного экрана / монитора
  3. С внешней звуковой карты USB
  4. Из порта GPIO

Ваши варианты записи звуков могут быть:

  • а. С внешней звуковой карты USB (как минимум с одним типом входа)
  • б. Из файла или потока
  • с. Из GPIO

В этом посте мы расскажем вам, как играть и записывать, используя внешнюю звуковую карту USB .

План успеха на будущее?

С обновлениями RPi постоянно происходят новые изменения и улучшения, часто ломающие старые решения. Идея здесь состоит в том, чтобы сделать как можно меньше изменений в системе или сделать их очевидными при необходимости. Это означает, что мы предпочитаем использовать пользовательскую конфигурацию, а не общесистемную. Т.е. попробуйте использовать файлы конфигурации в вашем домашнем каталоге, а не в системных файлах, принадлежащих root.


TL; DR (Пойдем уже!)

Перезагрузите и подключите вашу внешнюю USB-звуковую карту, чтобы мы начали на той же странице ...

А. Соберите немного информации

# Check ALSA modules
cat /proc/asound/modules

 0 snd_bcm2835
 1 snd_usb_audio

# Check sound hardware
cat /proc/asound/cards

 0 [ALSA           ]: bcm2835 - bcm2835 ALSA
                      bcm2835 ALSA
 1 [Set            ]: USB-Audio - C-Media USB Headphone Set
                      C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed

# Check info on card-1
amixer -c 1

Simple mixer control 'Headphone',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 151
  Mono:
  Front Left: Playback 104 [69%] [-8.88dB] [on]
  Front Right: Playback 104 [69%] [-8.88dB] [on]
Simple mixer control 'Mic',0
  Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined
  Playback channels: Mono
  Capture channels: Mono
  Limits: Playback 0 - 32 Capture 0 - 16
  Mono: Playback 23 [72%] [34.36dB] [off] Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [on]

Здесь мы видим, что система default ( card 0) использует модуль bcm2835 ALSA. Хотя обычно мы можем указать, какую карту использовать, некоторые программы, такие как omxplayer , не имеют этой опции и не могут воспроизводить звук различными способами.

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

Б. Удалить аудио раздутый

Если у вас нет веских причин сохранить PulseAudio (PA) или дополнительное программное обеспечение JACK- сервера, вы должны удалить их , если они есть. Они имеют тенденцию мешать ALSA, поскольку они берут под контроль многие функции ALSA, и все необходимые им дополнительные конфигурации делают вещи невероятно запутанными!

sudo apt-get remove pulseaudio

# You can keep `jack*`, but make sure it is not running.
# If it is running you need to stop it, disble it or remove it.
service --status-all
# Disable the running service with:
sudo systemctl disable xxxxx

C. Отключить внутреннюю (Broadcom) звуковую карту

Внутренняя звуковая карта управляется модулем ядра в: /lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko Если вы не планируете использовать аудиоразъем (в 1) или HDMI (в 2), вы должны отключить этот модуль ядра. Есть два способа сделать это.

  1. Отключите его с флагом конфигурации загрузки
  2. Запретить его загрузку в ядро modprobe.dдемоном

Стараясь придерживаться нашего минималистического подхода, мы выбираем (1).

# Edit boot config with:
sudo nano /boot/config.txt
# so that:
cat /boot/config.txt
...
# Enable audio (loads snd_bcm2835)
#dtparam=audio=on
dtparam=audio=off
...
# You need to reboot!
sudo reboot now

Если по какой-то причине вы предпочитаете использовать метод (2), то вам нужно занести в черный список модуль ядра. Для этого просто введите слово blacklist, а затем имя модуля в любом *.confфайле /etc/modprobe.d/. Однако там уже есть пустой, зарезервированный файл, вызванный raspi-blacklist.confдля этой цели. Однако через 6 месяцев вы забудете об этом и о том, что в нем содержится, поэтому вам лучше назвать его после того, как модуль занесен в черный список.

cd /etc/modprobe.d/
# Manually edit a new file:  blacklist-snd_bcm2835.conf
#sudo nano blacklist-snd_bcm2835.conf
# And add the line: blacklist snd_bcm2835
## OR directly with:
sudo tee /etc/modprobe.d/blacklist-snd_bcm2835.conf <<EOF
blacklist snd_bcm2835
EOF
# You need to reboot!
sudo reboot now

Какая разница? Нет, AFAICT.

После перезагрузки перепроверьте свои звуковые модули.

$ cat /proc/asound/modules
 1 snd_usb_audio

$ cat /proc/asound/cards
 1 [Set            ]: USB-Audio - C-Media USB Headphone Set
                      C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed

Bom! Ваш раздражающий bcm2835 ( card 0) больше нет, но индекс USB-карты такой же! Это на самом деле хорошо.

Настройте свой ALSA

Как я уже упоминал, мы хотим, чтобы ALSA по умолчанию использовала собственную звуковую карту USB. Это также означает, что мы хотим, чтобы он имел первый доступный индекс в списке звуковых модулей ядра. Поскольку модуль был удален выше, а индекс такой же (карточка 1), мы в порядке. Но в случае, если нам нужно снова загрузить bcm2835, это не так, так как этот модуль снова появится как первый ( card 0).

Нам просто нужно сообщить ALSA, каким должен быть индекс карты PCM по умолчанию и в каком порядке они должны быть приоритетными в ядре.

Есть 3 места, где вы можете настроить свой ALSA.

  • пользователем конфигурации в:~/.asoundrc
  • система конфигурации в:/usr/share/alsa/alsa.conf
  • модуль системы конф в:/lib/modprobe.d/aliases.conf

Первые 2 изменяют устройства по умолчанию, тогда как последние обеспечивают порядок появления.

Сначала мы исправляем нашу пользовательскую конфигурацию для использования card 1. Если у вас отображается более одной карты, выберите индекс, который вы хотите использовать по умолчанию.

#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc

pcm.!default {
        type hw
        card 1
}

ctl.!default {
        type hw
        card 1
}
EOF

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

sudo nano /usr/share/alsa/alsa.conf
# then replace:
#defaults.ctl.card 0
#defaults.pcm.card 0
# with:
defaults.ctl.card 1
defaults.pcm.card 1

Теперь перезагрузитесь, чтобы изменения вступили в силу.

Теперь у вас должна быть работающая аудиосистема.


Давайте проверим это!

Чтобы выполнить надлежащий тест, вам нужны соответствующие файлы для тестирования. Поэтому прежде всего убедитесь, что все ваши звуковые и видео файлы действительно работают.

(Я потратил немало времени, пытаясь получить тестовое видео h264 / mp4 для воспроизведения звука, но позже обнаружил, что на нем никогда не было закодированного звука!

ПРЕДУПРЕЖДЕНИЕ. Если вы пытаетесь протестировать видео, в которых используются кодеки MPEG-2или VC-1, необходимо купить (!) Ключ кодека в организации RPi, чтобы иметь возможность полностью декодировать его с помощью встроенных аппаратных декодеров. В противном случае вам нужно сначала конвертировать файлы.

Вы можете проверить, включен ли ваш кодек с помощью:

# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1

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

# get some demo sound and video files
cd ~/Music

wget -Lk http://rpf.io/lamp3 -O example_11k.mp3
wget -Lk http://www.kozco.com/tech/piano2-CoolEdit.mp3 -O pianoTest_48k.mp3
wget -Lk http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_2mb.mp4 -O bbb_720p_2mb.mp4
wget -Lk https://raw.githubusercontent.com/mediaelement/mediaelement-files/master/big_buck_bunny.mp4 -O bbb_360_22k.mp4

Далее давайте играть !!

# Double-check! 
aplay -l && arecord -l

**** List of PLAYBACK Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

**** List of CAPTURE Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0


# Play white noise on 2-channels (L/R) on Card-1 
speaker-test -c2 -D hw:1,0

# Play a WAV sound file
speaker-test -c2 -D hw:1,0 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav

# Once the correct default card+device is set, and after reboot, 
# then full left/right voice test (above) is performed, just by:
speaker-test -c2 -twav

# Record some sounds (with a VU bar):
arecord --device=hw:1,0 --format S16_LE --rate 44100 -c1 -V mono test.wav

# Play recorded sounds
aplay -D plughw:1,0 test.wav

# Play recorded sounds (sample rate have to be equal) 
speaker-test -c2 -D plughw:1,0 -r 44100 --test=wav -W $HOME -w test.wav

# Install an MP3 player
sudo apt-get install mpg123

# Play some MP3 file
mpg123 -v -r 44100 some.mp3

# Play an MP3 sound stream
mpg123 http://ice1.somafm.com/u80s-128-mp3


# This plays video, but no sound!
omxplayer -o alsa /opt/vc/src/hello_pi/hello_video/test.h264

# This plays video and sound!
omxplayer -o alsa bbb_720p_2mb.mp4

# The following plays sometimes (!?) and at the wrong speed!
omxplayer -o alsa some.mp3

ТЫ ХОРОШО ИДТИ!


[опционально] Заказ дополнительного аудиооборудования

ПРИМЕЧАНИЕ. Если вы используете этот раздел, вам нужно изменить все значения карт в указанных выше разделах!

Если вы подключили дополнительное аудиооборудование, и оно не отображается так, как вы хотите, вы можете изменить порядок расположения модулей в /lib/modprobe.d/aliases.confфайле.

Некоторые решения предложили внести изменения в этот файл. К сожалению, они не знают, что звуковой модуль USB RPi по умолчанию написан с ошибкой! Таким образом, изменения никогда не вступают в силу. Звуковой модуль ядра, с которым мы имеем дело, называется snd_usb_audioи нет snd-usb-audio. Имя файла snd-usb-audio.koи находится в: /lib/modules/4.9.59-v7+/kernel/sound/usb/.

Достаточно забавно, текст в файле говорит, что это не должно быть изменено!

sudo nano /lib/modprobe.d/aliases.conf

#--------------------------------------
# For original (out-of-box) use
#--------------------------------------
# replace this: 
options snd-usb-audio index=-2
# with this:
options snd_usb_audio index=-2

#--------------------------------------
# To change the index & order
#--------------------------------------
# Set the index value of the cards:
options snd_usb_audio index=0
options snd_bcm2835 index=1
# Set the order:
options snd slots=snd_usb_audio,snd_bcm2835

Ссылки:

not2qubit
источник
Используя raspi 3B + с Raspian, aplayпоследовательно ничего не делал после всей этой работы, пока я не использовал -D plughw:0,0вместо этого -D hw:0,0(на основе shttps: //raspberrypi.stackexchange.com/a/89162). К сожалению, хотя почти все теперь могут воспроизводить звук через USB, утилита, которая мне нужна больше всего ( vban_receptor), по-прежнему не работает, но на данный момент это почти наверняка уже не ошибка установки
Майк 'Pomax' Kamermans
1
Да, это кровавый кошмар. Пожалуйста, посмотрите список различных плагинов PCM здесь . Затем прочитайте 1-й раздел под названием «Устройства и плагины ALSA» здесь . Возможно, это поможет пролить свет на то, почему вы должны использовать plughwвместо hw. КСТАТИ. Поскольку hwречь идет о аппаратном обеспечении, а при plughwнекоторой обработке, вы можете проверить, что вы на самом деле пытаетесь играть.
not2qubit
Я проверил его с помощью одного из стандартных болотных аудиофайлов в /usr/share/sounds/alsa(в частности Front_Center.wav)
Mike 'Pomax' Kamermans
1
Вы абсолютная звезда. Я не ожидал, что получение звука из малинового пи будет многодневным проектом без четких указаний о том, что делать. Все +1 для вас.
Киран,
3
Преступно, что так мало голосов.
BradChesney79