连载目录
1.qemu声卡模拟原理-基本使用方法
2.qemu声卡模拟原理-声卡初始化(pa+ac97)
3.qemu声卡模拟原理-声音播放(pa+ac97)

qemu版本:5.2.50
qemu声卡的模拟分为模拟声卡和声卡后端设备两个部分。模拟声卡主要为虚拟机提供一个模拟的硬件设备,他负责声卡的硬件配置操作还有音频数据的转换。而后端负责处理模拟声卡的声音数据,可以是直接播放声音、存储为文件或者传送到远程进行播放。

编译选项

在编译配置中选中要编译的后端,这里添加了oss和pa两个后端设备

./configure  --target-list=x86_64-softmmu --enable-kvm \
 --audio-drv-list='oss pa'
创建后端设备

要模拟声卡首先要考虑采用那种音频后端设备,常用的后端设备大致有:ossspicesdlwavalsapa这几种。

pa后端

pa其实就是linux上的音频服务pulseaudio,在linux本地播放声音选择pa作为后端是一种较好的方式。oss、alsa都不建议选择,他们会独占声卡导致其他程序无法播放声音,并且qemu的音量不受系统控制。

qemu的后端设备使用参数audiodev来创建

-audiodev pa,id=pa1,server=unix:${XDG_RUNTIME_DIR}/pulse/native,out.stream-name=audio-out,in.stream-name=audio-in

这里特别要注意的是qemu如果用sudo启动会导致环境的改变使得XDG_RUNTIME_DIR不相同,在qemu中还会使用XDG_RUNTIME_DIR环境变量来初始化pa,解决办法可以使用sudo -u ${USER} qemu-system-x86_64 ${args}。建议能不用sudo就不用sudo。
指定频率的写法:

-audiodev pa,id=pa1,out.frequency=48000,out.stream-name=audio-out
spice后端
-audiodev spice,id=sp1
-audiodev alsa,id=snd0,out.buffer-length=10000,out.period-length=2500

spice后端不用创建也是可以的,使用了spice会默认启用spice的音频后端

alsa后端
-audiodev alsa,id=au1,out.dev=default
oss后端
-audiodev oss,id=oss1,out.dev=default
创建模拟声卡设备

后端创建好之后还需要创建一个模拟声卡,模拟声卡使用-device参数创建,以前可以使用-soundhw参数创建,目前已经废弃。模拟声卡通过audiodev=${audiodev_id}的方式与audiodev绑定,常见的模拟声卡型号有:AC97CS4231aHDASB16PCSPKADLIBES1370GUS。根据自己内核拥有的声卡驱动选择合适的声卡设备。

-device AC97,id=sound0,bus=pci.0,audiodev=pa1
-device AC97,id=sound0,bus=pci.0,addr=0x1,audiodev=pa1
-device intel-hda -device hda-output,audiodev=pa1
Logo

更多推荐