Як я можу використовувати зовнішню звукову карту USB та встановити її за замовчуванням?


16

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

Питання: Як я можу налаштувати ALSA для використання за замовчуванням?

Відповіді:


33

Фон

Дивовижно бачити, скільки зусиль було докладено до спроби вирішити різні проблеми, пов'язані зі звуком для Raspberry Pi. Мабуть, це має бути найслабшим місцем для нових користувачів, щоб успішно розвиватися та використовувати ALSA під програмою Raspbian. Витративши багато часу і зусиль на те, щоб отримати власний звук RPi3, працюючи в різних версіях ОС і в інших дистрибутивах Linux, я вирішив написати переконливу сторінку рішення. Принаймні для теми використання зовнішньої звукової карти на останній програмі Raspbian Stretch .

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

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

Однак жодного разу в історії людство не виробило такої кількості марних і нефункціональних діаграм, як для спроби пояснити ALSA. Єдиними, віддаленими інформацією, є ці два:

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

Отримання системної інформації

Перший крок - з’ясувати, який звук, якщо він є, працює і яке обладнання ви вже маєте. Існують всілякі способи дізнатися деталі, але для пересічної людини більшість цих деталей є безглуздими. Ми показуємо найважливіше.

Що ми хочемо знати про нашу (звукову) систему?

Ми хочемо знати:

  • вбудована звукова апаратна назва та версії
  • назва зовнішнього звукового обладнання та версії
  • які драйвери (модулі) ядра він використовує
  • які інші звукові драйвери / модулі завантажуються
  • які звукові карти доступні
  • в якому порядку звукові карти використовуються і вибираються ОС і програмами
  • якщо є якісь суперечливі програмні засоби апаратної чи звукової системи

Звідки ви хочете відтворювати та записувати звук у вашій системі?

Ваші варіанти відтворення звуків можуть бути:

  1. Вбудований 3,5 мм аудіороз'єм для навушників (аналоговий аудіо)
  2. З підключеного до екрана / монітора HDMI
  3. З зовнішньої звукової карти USB
  4. З порту GPIO

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

  • а. З зовнішньої звукової карти USB (щонайменше одного типу входу)
  • б. З файлу чи потоку
  • c. Від GPIO

У цій публікації ми розповімо, як відтворювати та записувати за допомогою зовнішньої звукової карти USB .

Майбутній план успішного доказування?

З оновленнями RPi постійно відбувається потік нових змін та вдосконалень, часто порушуючи старі рішення. Ідея тут полягає в тому, щоб зробити якомога менше змін у системі або зробити їх очевидними, якщо це потрібно. Це означає, що ми вважаємо за краще використовувати конфігурацію від користувача, ніж загальну для системи. Тобто спробуйте використовувати конфігураційні файли в домашньому каталозі, а не в кореневих системних файлах.


TL; DR (Давайте вже підемо!)

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

A. Зберіть деяку інформацію

# 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]

Тут ми бачимо, що за замовчуванням у системі ( card 0) використовується модуль ALSA bcm2835. Хоча ми зазвичай можемо вказати, якою карткою користуватися, деяке програмне забезпечення, як omxplayer , не має цієї опції, і не вдасться видавати звук різними способами.

На цьому етапі ви вже можете спробувати налаштувати свої конфігураційні файли ALSA. Деякі є успішними, тоді як багато інших - не тому, що не очевидно, як і де це потрібно робити. Ми хочемо сказати нашій системі використовувати нашу зовнішню звукову карту USB.

B. Видаліть звуковий сигнал

Якщо у вас є дуже вагомі причини зберегти 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

Бом! Ваш дратівливий 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

Список літератури:


Використовуючи 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)
Майк 'Pomax' Камерманс

1
Ви абсолютна зірка. Я не очікував, що отримання звуку з малинового пі буде багатоденним проектом без чітких вказівок, що робити. Усі позначки +1 для вас.
Кієран

3
Злочинним є те, що заявок так мало.
BradChesney79
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.