连载目录
    
    
    
     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'
    
    
    创建后端设备
   
    要模拟声卡首先要考虑采用那种音频后端设备,常用的后端设备大致有:
    
     oss
    
    、
    
     spice
    
    、
    
     sdl
    
    、
    
     wav
    
    、
    
     alsa
    
    、
    
     pa
    
    这几种。
   
    
    
    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绑定,常见的模拟声卡型号有:
    
     AC97
    
    、
    
     CS4231a
    
    、
    
     HDA
    
    、
    
     SB16
    
    、
    
     PCSPK
    
    、
    
     ADLIB
    
    、
    
     ES1370
    
    、
    
     GUS
    
    。根据自己内核拥有的声卡驱动选择合适的声卡设备。
   
-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
 
