#android #vmware #alsa #vmware-workstation #android-x86
Вопрос:
При попытке настроить android-x86_64 внутри vmware-workstation16 аудиоустройство ALSA в качестве пользователя по умолчанию/непривилегированного, похоже, недоступно. Попытка вручную вызвать alsa_amixer set PCM 100%
/ alsa_aplay /mnt/sdcard/Download/test.wav
как некорневой дает отказ в разрешении, все это прекрасно работает как root.
Поскольку Android основан на Linux, я пытался каким-то образом вручную предоставить пользователю доступ по умолчанию к определенному устройству ALSA. Я осмотрел вручную настройку /etc/group (которая, похоже, не является допустимым файлом конфигурации для Android), предоставляя доступ для чтения/записи к аудиоустройствам внутри /dev/, но я не смог определить, какое это будет устройство. Попытался вручную alsa_ctl init 0
(но устройство уже правильно инициализировано на стороне root) без разницы.
Вывод команд от имени пользователя root:
> alsa_aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/2 [ES1371 DAC1]
Subdevices: 1/1
Subdevice #0: subdevice #0
> alsa_ctl init 0
alsa-lib external/alsa-lib//src/ucm/main.c:1406(snd_use case_mgr_open) error: failed to import hw:0 use case config
Found hardware: "ENS1371" "Cirrus Logic CS4297A rev 3" "AC97a:43525913" "0x1274" "0x1371"
Hardware is initialized using a generic method
> cat /etc/init.sh | grep alsa
f=/system/etc/alsa/$(cat /proc/asound/card$c/id).state
alsa_ctl -f $f restore $c
alsa_ctl init $c
alsa_amixer -c $c set Master on
alsa_amixer -c $c set Master 100%
alsa_amixer -c $c set Headphone on
alsa_amixer -c $c set Headphone 100%
alsa_amixer -c $c set Speaker 100%
alsa_amixer -c $c set Capture 80%
alsa_amixer -c $c set Capture cap
alsa_amixer -c $c set PCM 100% unmute
alsa_amixer -c $c set SPO unmute
alsa_amixer -c $c set IEC958 on
alsa_amixer -c $c set 'Mic Boost' 1
alsa_amixer -c $c set 'Internal Mic Boost' 1
> ls -l /proc/asound
lrwxrwxrwx 1 root root 5 AudioPCI -> card0
dr-xr-xr-x 9 root root 0 card0
-r--r--r-- 1 root root 0 cards
-r--r--r-- 1 root root 0 devices
-r--r--r-- 1 root root 0 modules
dr-xr-xr-x 4 root root 0 oss
-r--r--r-- 1 root root 0 pcm
dr-xr-xr-x 3 root root 0 seq
-r--r--r-- 1 root root 0 timers
-r--r--r-- 1 root root 0 version
Вывод команд от имени непривилегированного пользователя:
> alsa_aplay -l
aplay: device_list:274: no soundcards found...
> alsa_ctl init 0
alsa_ctl: snd_card_iterator_sinit:257: Cannot find soundcard '0'...
> groups
uid=10067(u0_a67) gid=10067(u0_a67) groups=10067(u0_a67)inet everybody u0_a67_cache all_a67
Поскольку Android, похоже, не использует одинаковые групповые политики (/etc/group audio:x:
) Я не совсем уверен, как обойти изменение доступа к аудиогруппе, если таковая существует, и в этом ли проблема здесь/что еще я могу сделать.
Версия образа виртуальной машины: android-x86_64-8.1-r6
Кроме того , это, похоже, не связано с неправильной настройкой аудиоустройства хоста — при запуске alsa_aplay в качестве корневого аудио правильно маршрутизируется как аудиоклиент pulse на стороне хоста (и это слышно).
Ответ №1:
В конце концов, это было вызвано неправильной конфигурацией VMware.
Чтобы исправить это в каталоге образов виртуальной машины, для ${VMName}.vmx
строки добавления (по умолчанию не должно присутствовать):
sound.virtualDev = "hdaudio"
Я смутно помню, как использовал это решение с некоторыми другими настройками linux<->linux раньше.
Поскольку этот параметр недоступен через виртуальную машину графического интерфейса рабочей станции>Настройки>>Оборудование>>>Настройки звуковой карты и не был упомянут ни в официальной, ни в неофициальной документации по установке vmware на Android-x86.
Как ни странно, без включения HDAudio вы все равно можете получать вывод звука, хотя и только с помощью aplay/amixer непосредственно из tty.
Вы также можете включить такую функциональность для пользователей , не являющихся пользователями root chmod 666 /dev/snd/*
, хотя приложения Android, блокируя саму шину ALSA (явно пытающуюся передавать аудиобуфер), не будут правильно перенаправлены на хост-микшер (в то время как непривилегированный tty будет).
Оставляя это на случай, если кто-то наткнется на этот вопрос или/и может продолжить, какова фактическая причина такого поведения.