Мне нужно подготовить два скрипта, которые
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, то есть это не готовый дистрибутив вроде убунту или дебиана.
Требуется универсальное решение (скрипты), которое работало бы на разных платформах и могло вывести в консоль список аудио выходов и переключать вывод звука на заданный выход.
Как же это можно сделать?