连载目录
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开始初始化,初始化主体流程如下:

paaudio.c:register_audio_pa->
audio.c:audio_driver_register


这里先吧声卡后端对象注册到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)相关推荐

  1. qemu声卡模拟原理-声音播放(pa+ac97)

    连载目录 1.qemu声卡模拟 2.qemu声卡模拟原理-声卡初始化(pa+ac97) 3.qemu声卡模拟原理-声音播放(pa+ac97) PCM数据 PCM数据格式这里抛砖引玉贴一点别人写的: P ...

  2. qemu声卡模拟原理-基本使用方法

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

  3. linux alsa声卡驱动原理分析- 设备打开过程和数据流程,linux alsa声卡驱动原理分析解析- 设备打开过程跟数据流程资料.ppt...

    linux alsa声卡驱动原理分析解析- 设备打开过程跟数据流程资料 Linux ALSA声卡驱动原理分析 -设备打开过程和数据流程;目 录;目 录;一.导 读;目 录;二.ALSA架构简介;二. ...

  4. QEMU 中音频模拟如何工作

    事情有点棘手,但这里有一个粗略的描述: QEMUSoundCard:建模一个给定的模拟的声卡 SWVoiceOut:建模一个来自 QEMUSoundCard 的音频输出 SWVoiceIn:建模一个来 ...

  5. 声卡---android USB声卡调试(播放和录音)

    目录 一.概述 二.实例 三.总结 一.概述 这里注意一下,声卡只是包含adc(模拟音频转数字音频),dac(数字音频转模拟音频)这两个主要部件.里面没有编码和解码器.asoc驱动架构中的codec也 ...

  6. QEMU中音频模拟工作过程(十)

    QEMUSoundCard:建模一个给定的模拟的声卡 SWVoiceOut:建模一个来自 QEMUSoundCard 的音频输出 SWVoiceIn:建模一个来自 QEMUSoundCard 的音频输 ...

  7. 一步步教你:如何用Qemu来模拟ARM系统

    这是道哥的第011篇原创 文章目录 前言 为什么需要ARM模拟系统 应用程序的开发 系统开发(BSP) Qemu是什么? Qemu的两种模式 Qemu 能做什么?或者说适合做什么? 在 Ubuntu1 ...

  8. 一步步教你如何在Ubuntu虚拟机中安装QEMU并模拟模拟arm 开发环境(一)uImage u-boot

    初次接触qemu是因为工作的需要,有时候下了班,可能需要在家研究一些东西,因为博主用到arm环境,这时候博主比较小气,不愿花钱买开发板,当然博主在这里给大家的建议是,如果要真正学懂arm构架的相关知识 ...

  9. 电音与计算机相关吗,什么是电音声卡 电音声卡功能和区别介绍【图文】

    电音声卡属于声卡的一种,主要用于多媒体技术中的声波以及信号之间的转换,凭借这一特性,它也能够实现声音文件等等的录制工作,因此在许多场景中都扮演着尤为重要的角色.除此之外,我们还了解到电音声卡可以通过调 ...

最新文章

  1. stack UVA 442 Matrix Chain Multiplication
  2. html 找不到文件,WebView 加载本地HTML 文件 提示找不到该文件
  3. 什么是公网IP、内网IP和NAT转换?
  4. mysql数据库制定位置_MySQL数据库在指定位置增加字段
  5. 降低Java占用_如何减少JAVA应用程序的CPU使用率?
  6. [Abp 源码分析]后台作业与后台工作者
  7. 你们考试,我们都有点紧张呢…
  8. 与Java EE和Spring的集成架构
  9. 看一次广告听30分钟歌 你愿意为QQ音乐新功能买单吗?
  10. moment获取几小时前_请问怎么把“多少小时前”精确到“多少小时多少分钟前”...
  11. Redis笔记(五)Redis的事务
  12. c语言实训项目,C语言项目实训教程
  13. 如何将dwg文件转成kml文件
  14. python两台电脑文件传输_两台电脑怎么互相连接传送文件?
  15. 【Kindle】Kindle免费推送网
  16. 【华人学者风采】丛京生 加州大学洛杉矶分校
  17. 宝德自强PT620Z1
  18. 医院绩效考核病案首页数据上报的难点及解决方案
  19. 《统计学习方法》(李航)第1章主要内容介绍(统计学习概述、分类、三要素)
  20. Latex中的实心原点

热门文章

  1. 制造业产品开发中应用敏捷Scrum的思考 (下篇)
  2. STM32软件的烧写方式
  3. matlab-R、G、B三通道颜色展示
  4. FPGA—VGA显示
  5. Melo作为程序员的2016年
  6. MATLAB智能算法实现 (一)
  7. 最后的颁奖典礼:汉芯的幕后英雄集体亮相
  8. ubuntu10的pci扩展卡驱动安装失败后检查方法
  9. Excel中删除重复数据(用VBA代码)
  10. SQL中on条件与where条件的区别