本文共 1761 字,大约阅读时间需要 5 分钟。
连载目录
qemu的整个声卡虚拟化都是围绕着audio.c这个文件展开的,audio.c统管了整个音频的数据结构和音频框架通用逻辑,下面以pa后端+ac97模拟设备为例剖析一下qemu中声卡的整个初始化过程。
pa后端的源码在:audio/paaudio.c
在vl.c的qemu_create_early_backends开始初始化,初始化主体流程如下:paaudio.c:register_audio_pa->audio.c:audio_driver_register
audio_drivers
备用,相应的其他后端也是如此 下面看看后端的初始化:
vl.c:qemu_create_early_backends-> audio.c:audio_init_audiodevs-> audio.c:audio_init-> audio.c:audio_driver_lookup-> audio.c:audio_driver_init-> paaudio.c:qpa_audio_init
在audio_driver_lookup中通过命令行传入的参数pa,找到了上面注册到audio_drivers
的pa_driver
模拟设备的初始化与pci设备的初始化几乎一致,就不细说了
ac97.c:ac97_class_init-> ac97.c:ac97_realize-> audio.c:AUD_register_card-> audio.c:audio_init->
这里又调用到了audio_init这个函数,传入的参数是NULL,这里主要做的事情是拿到一个系统中已经注册好的AudioState。这里上面的audio_states已经注册了一个AudioState,所以这里直接拿到第一个后端返回,也就是我们上面注册的那个AudioState,所以你在命令行中注册了多个后端只会有一个起作用。
拿到AudioState之后注册到了QEMUSoundCard中
前后端绑定是在虚拟机内的驱动初始化声卡设备的过程中进行的:
ac97.c:nam_write ac97.c:nam_write ac97.c:nam_writew ac97.c:open_voice audio_template.c:AUD_open_out audio_template.c:audio_pcm_create_voice_pair_out audio_template.c:audio_pcm_hw_add_out audio_template.c:audio_pcm_hw_add_new_out audio_template.c:audio_pcm_sw_init_out
前面说道注册了pa的AudioState和ac97持有的QEMUSoundCard已经绑定到了一起,但是后端的绑定还没有完成。当虚拟机内启用声卡的时候才是后端真正绑定在一起的时候。虚拟声卡和后端通过SWVoiceOut(虚拟声卡输出)、HWVoiceOut(后端输出)两个对象绑定在一起才真正完成绑定。
在audio_pcm_create_voice_pair_out中创建了SWVoiceOut(虚拟声卡输出)对象。最后来一张图概览一下
转载地址:http://evzhz.baihongyu.com/