@nckma

Есть ли единый способ переключения выхода звука ALSA из скрипта?

Мне нужно подготовить два скрипта, которые
1) выведут список имеющихся аудио выходов ALSA
2) смогут переключить вывод звука на заданный выход.

Казалось бы, что тут нет никаких проблем и все можно сделать командами aplay и amixer.
Но что-то не получается. Проблема в следующем.
Например, на Raspberry Pi3 есть выход HDMI и есть разъем Jack.
Вывод aplay:

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0


Вот казалось бы можно играть на HDMI командой aplay -D hw:0,1 music.wav и играть на аналоговом Jack
командой aplay -D hw:0,0 music.wav

Но это так не работает.
Единственный способ, переключения выхода, который я нашел это
amixer cset numid=3 2 для вывода через jack или
amixer cset numid=3 1 для вывода через HDMI.
Причем не важно играю aplay через hw:0,0 или hw:0,1

numid еще нужно как-то знать, например, на распери список numid вот такой:
$ amixer controls
numid=3,iface=MIXER,name='PCM Playback Route'
numid=2,iface=MIXER,name='PCM Playback Switch'
numid=1,iface=MIXER,name='PCM Playback Volume'
numid=5,iface=PCM,name='IEC958 Playback Con Mask'
numid=4,iface=PCM,name='IEC958 Playback Default'


Но мне нужно, чтоб скрипты работали и на x86 платформе, не известно заранее, какие там будут аудио устройства установлены. На моем тестовом ноутбуке amixer показывает следующее:
$ amixer controls
numid=23,iface=CARD,name='HDMI/DP,pcm=3 Jack'
numid=19,iface=CARD,name='Headphone Jack'
numid=17,iface=CARD,name='Internal Mic Phantom Jack'
numid=18,iface=CARD,name='Mic Jack'
numid=20,iface=CARD,name='Speaker Phantom Jack'
numid=16,iface=MIXER,name='Master Playback Switch'
numid=15,iface=MIXER,name='Master Playback Volume'
numid=2,iface=MIXER,name='Headphone Playback Switch'
numid=1,iface=MIXER,name='Headphone Playback Volume'
numid=14,iface=MIXER,name='Mic Boost Volume'
numid=9,iface=MIXER,name='Mic Playback Switch'
numid=8,iface=MIXER,name='Mic Playback Volume'
numid=12,iface=MIXER,name='Capture Switch'
numid=11,iface=MIXER,name='Capture Volume'
numid=5,iface=MIXER,name='Loopback Mixing'
numid=24,iface=MIXER,name='IEC958 Playback Con Mask'
numid=25,iface=MIXER,name='IEC958 Playback Pro Mask'
numid=26,iface=MIXER,name='IEC958 Playback Default'
numid=27,iface=MIXER,name='IEC958 Playback Switch'
numid=10,iface=MIXER,name='Auto-Mute Mode'
numid=13,iface=MIXER,name='Internal Mic Boost Volume'
numid=7,iface=MIXER,name='Internal Mic Playback Switch'
numid=6,iface=MIXER,name='Internal Mic Playback Volume'
numid=4,iface=MIXER,name='Speaker Playback Switch'
numid=3,iface=MIXER,name='Speaker Playback Volume'
numid=22,iface=PCM,name='Capture Channel Map'
numid=21,iface=PCM,name='Playback Channel Map'
numid=28,iface=PCM,name='ELD',device=3
numid=29,iface=PCM,name='Playback Channel Map',device=3

То есть здесь на этой платформе такого параметар ROUTE вообще нет. И как же тогда переключиться с HDMI на Jack на ноутбуке? Система строится в buildroot, то есть это не готовый дистрибутив вроде убунту или дебиана.

Требуется универсальное решение (скрипты), которое работало бы на разных платформах и могло вывести в консоль список аудио выходов и переключать вывод звука на заданный выход.
Как же это можно сделать?
  • Вопрос задан
  • 651 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы