alsa aloop是alsa提供的内部loopback功能,可以用来实现录制系统内部声音,在没有硬件支持loopback功能时可以采用这种软件loopback的实现来代替。
alsa aloop实现了一个虚拟的声卡。
在kernel的编译配置选项文件中加入CONFIG_SND_ALOOP=y之后烧录到平台中声卡会多出两个pcm设备:
即
00-00: Loopback PCM : Loopback PCM : playback 8 : capture 8
00-01: Loopback PCM : Loopback PCM : playback 8 : capture 8
注意到此时原先板载的实际声卡的index将变为1,因为aloop注册比较早
有了这两个节点之后就可以使用tinyplay和tinycap来验证。
使用方法为:
tinyplay 写入card 0 device 0,同时tinycap从card 0 device 1录制
tinyplay /data/8ch_16bit.wav -d 0& tinycap /data/test.wav -d 1 -c 8 -r 48000 -b 16 <
[1] 8228
Playing sample: 8 ch, 48000 hz, 16 bit
Capturing sample: 8 ch, 48000 hz, 16 bit
注意的是打开的参数如采样率 位深和ch数要与录制的时候保持一致,否则会提示参数非法而打开失败。
这一步验证完成之后要实现在android里使用aloop录制系统声音则需要在audo hal中pcm_open,pcm_close,pcm_write实际声卡的地方一样加上操作aloop的虚拟声卡0,
在android P上调试发现使用pcm_open打开aloop device输出时传递的alsa config参数也有限制:
period_size = 1024;
period_count = 4;
period_size 和period_count 需要,不超过1024和4,否则一样会open失败 提示参数非法。
最后贴下alsa aloop的数据流向: