qemu声卡模拟原理-声卡初始化(pa+ac97)
連載目錄
1.qemu聲卡模擬
2.qemu聲卡模擬原理-聲卡初始化(pa+ac97)
3.qemu聲卡模擬原理-聲音播放(pa+ac97)
qemu的整個(gè)聲卡虛擬化都是圍繞著audio.c這個(gè)文件展開(kāi)的,audio.c統(tǒng)管了整個(gè)音頻的數(shù)據(jù)結(jié)構(gòu)和音頻框架通用邏輯,下面以pa后端+ac97模擬設(shè)備為例剖析一下qemu中聲卡的整個(gè)初始化過(guò)程。
后端初始化
pa后端的源碼在:audio/paaudio.c
在vl.c的qemu_create_early_backends開(kāi)始初始化,初始化主體流程如下:
這里先吧聲卡后端對(duì)象注冊(cè)到audio里面的audio_drivers備用,相應(yīng)的其他后端也是如此
下面看看后端的初始化:
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中通過(guò)命令行傳入的參數(shù)pa,找到了上面注冊(cè)到audio_drivers的pa_driver
AudioState是一個(gè)比較關(guān)鍵的數(shù)據(jù)結(jié)構(gòu),它代表了一個(gè)整個(gè)后端設(shè)備。audio_init中先初始化一個(gè)AudioState,再初始化pa_driver,然后將pa_driver注冊(cè)到AudioState,到這里pa就成功注冊(cè)上了。
最后QTAILQ_INSERT_TAIL(&audio_states, s, list);將AudioState注冊(cè)到了audio_states鏈表上備用,這個(gè)時(shí)候模擬設(shè)備還沒(méi)有被注冊(cè)進(jìn)來(lái)。
設(shè)備初始化
模擬設(shè)備的初始化與pci設(shè)備的初始化幾乎一致,就不細(xì)說(shuō)了
ac97.c:ac97_class_init->ac97.c:ac97_realize->audio.c:AUD_register_card->audio.c:audio_init->這里又調(diào)用到了audio_init這個(gè)函數(shù),傳入的參數(shù)是NULL,這里主要做的事情是拿到一個(gè)系統(tǒng)中已經(jīng)注冊(cè)好的AudioState。這里上面的audio_states已經(jīng)注冊(cè)了一個(gè)AudioState,所以這里直接拿到第一個(gè)后端返回,也就是我們上面注冊(cè)的那個(gè)AudioState,所以你在命令行中注冊(cè)了多個(gè)后端只會(huì)有一個(gè)起作用。
拿到AudioState之后注冊(cè)到了QEMUSoundCard中
前后端綁定
前后端綁定是在虛擬機(jī)內(nèi)的驅(qū)動(dòng)初始化聲卡設(shè)備的過(guò)程中進(jìn)行的:
ac97.c:nam_writeac97.c:nam_writeac97.c:nam_writewac97.c:open_voiceaudio_template.c:AUD_open_outaudio_template.c:audio_pcm_create_voice_pair_outaudio_template.c:audio_pcm_hw_add_outaudio_template.c:audio_pcm_hw_add_new_outaudio_template.c:audio_pcm_sw_init_out前面說(shuō)道注冊(cè)了pa的AudioState和ac97持有的QEMUSoundCard已經(jīng)綁定到了一起,但是后端的綁定還沒(méi)有完成。當(dāng)虛擬機(jī)內(nèi)啟用聲卡的時(shí)候才是后端真正綁定在一起的時(shí)候。虛擬聲卡和后端通過(guò)SWVoiceOut(虛擬聲卡輸出)、HWVoiceOut(后端輸出)兩個(gè)對(duì)象綁定在一起才真正完成綁定。
在audio_pcm_create_voice_pair_out中創(chuàng)建了SWVoiceOut(虛擬聲卡輸出)對(duì)象。
在audio_pcm_hw_add_new_out中 創(chuàng)建了HWVoiceOut(后端輸出)對(duì)象,并通過(guò)后端的pcm_ops操作函數(shù)組與后端綁定在了一起。
最后通過(guò)audio_pcm_sw_init_out函數(shù)將虛擬聲卡和后端綁定在了一起。
最后來(lái)一張圖概覽一下
總結(jié)
以上是生活随笔為你收集整理的qemu声卡模拟原理-声卡初始化(pa+ac97)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新萝卜家园GHOST WIN7 SP1
- 下一篇: cv2.VideoWriter生成avi