ALSA 设备只能在 VMWare 下的 android-x86 上作为 root 用户使用

ALSA devices only available as root user on android-x86 under VMWare

尝试在 vmware-workstation16 中设置 android-x86_64,default/unprivileged 用户似乎无法访问 ALSA 音频设备。尝试手动调用 alsa_amixer set PCM 100%/alsa_aplay /mnt/sdcard/Download/test.wav 作为非 root 权限被拒绝,所有这些都可以作为 root 正常工作。

因为android是基于linux的,所以我试图以某种方式手动授予默认用户对特定ALSA设备的访问权限。我环顾四周,手动调整 /etc/group(这似乎不是 android 的有效配置文件),让 read/write 可以访问 /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:) 我不太确定如何修改对音频组的访问权限存在这样的问题,这是否是问题 here/what 否则我可以做。

虚拟机镜像版本:android-x86_64-8.1-r6

此外,这似乎不是主机音频设备配置错误的问题 - 当 运行 alsa_aplay 作为根音频在主机端被正确路由为脉冲音频客户端(并且它是可听见的) .

毕竟是 VMware 配置错误造成的。
为了在 VM 的图像目录中修复此问题,为 ${VMName}.vmx 添加行(默认情况下不应存在):

sound.virtualDev = "hdaudio"

我依稀记得之前将此解决方案与其他 linux<->linux 设置一起使用。
由于此设置无法通过 Workstation GUI 的 VM>Settings>Hardware>Sound Card settings 获得,并且在官方或非官方 android-x86 vmware 安装文档中均未提及。

奇怪的是,在不启用 HDAudio 的情况下,您仍然可以获得声音输出,尽管只是直接从 tty 使用 aplay/amixer。
您还可以通过 chmod 666 /dev/snd/* 在非根用户上启用此类功能,尽管 android 应用程序在阻止 ALSA 总线本身(显然试图流式传输音频缓冲区)时不会正确路由到主机混音器(而非特权 tty 会)。

以防万一,有人偶然发现了这个问题,or/and 可以扩展这种行为的真正原因。