qemu声卡模拟原理-声卡初始化(pa+ac97)
連載目錄
1.qemu聲卡模擬
2.qemu聲卡模擬原理-聲卡初始化(pa+ac97)
3.qemu聲卡模擬原理-聲音播放(pa+ac97)
qemu的整個聲卡虛擬化都是圍繞著audio.c這個文件展開的,audio.c統管了整個音頻的數據結構和音頻框架通用邏輯,下面以pa后端+ac97模擬設備為例剖析一下qemu中聲卡的整個初始化過程。
后端初始化
pa后端的源碼在:audio/paaudio.c
在vl.c的qemu_create_early_backends開始初始化,初始化主體流程如下:
這里先吧聲卡后端對象注冊到audio里面的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
AudioState是一個比較關鍵的數據結構,它代表了一個整個后端設備。audio_init中先初始化一個AudioState,再初始化pa_driver,然后將pa_driver注冊到AudioState,到這里pa就成功注冊上了。
最后QTAILQ_INSERT_TAIL(&audio_states, s, list);將AudioState注冊到了audio_states鏈表上備用,這個時候模擬設備還沒有被注冊進來。
設備初始化
模擬設備的初始化與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_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前面說道注冊了pa的AudioState和ac97持有的QEMUSoundCard已經綁定到了一起,但是后端的綁定還沒有完成。當虛擬機內啟用聲卡的時候才是后端真正綁定在一起的時候。虛擬聲卡和后端通過SWVoiceOut(虛擬聲卡輸出)、HWVoiceOut(后端輸出)兩個對象綁定在一起才真正完成綁定。
在audio_pcm_create_voice_pair_out中創建了SWVoiceOut(虛擬聲卡輸出)對象。
在audio_pcm_hw_add_new_out中 創建了HWVoiceOut(后端輸出)對象,并通過后端的pcm_ops操作函數組與后端綁定在了一起。
最后通過audio_pcm_sw_init_out函數將虛擬聲卡和后端綁定在了一起。
最后來一張圖概覽一下
總結
以上是生活随笔為你收集整理的qemu声卡模拟原理-声卡初始化(pa+ac97)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新萝卜家园GHOST WIN7 SP1
- 下一篇: cv2.VideoWriter生成avi