博客
关于我
qemu声卡模拟原理-声卡初始化(pa+ac97)
阅读量:683 次
发布时间:2019-03-17

本文共 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里面的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_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(虚拟声卡输出)对象。
在这里插入图片描述
在audio_pcm_hw_add_new_out中 创建了HWVoiceOut(后端输出)对象,并通过后端的pcm_ops操作函数组与后端绑定在了一起。
在这里插入图片描述
最后通过audio_pcm_sw_init_out函数将虚拟声卡和后端绑定在了一起。
在这里插入图片描述

最后来一张图概览一下

在这里插入图片描述

转载地址:http://evzhz.baihongyu.com/

你可能感兴趣的文章
Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
查看>>
Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
查看>>
Mysql学习总结(51)——Linux主机Mysql数据库自动备份
查看>>
Mysql学习总结(52)——最全面的MySQL 索引详解
查看>>
Mysql学习总结(53)——使用MySql开发的Java开发者规范
查看>>
Mysql学习总结(54)——MySQL 集群常用的几种高可用架构方案
查看>>
Mysql学习总结(55)——MySQL 语句大全再温习
查看>>
Mysql学习总结(56)——MySQL用户管理和权限设置
查看>>
Mysql学习总结(57)——MySQL查询当天、本周、本月、上周、本周、上月、距离当前现在6个月数据
查看>>
Mysql学习总结(58)——深入理解Mysql的四种隔离级别
查看>>
Mysql学习总结(59)——数据库分库分表策略总结
查看>>
Mysql学习总结(5)——MySql常用函数大全讲解
查看>>
Mysql学习总结(60)——并发量大、数据量大的互联网业务数据库设计规范总结
查看>>
Mysql学习总结(61)——MySQL优化之DBA级优化整理汇总
查看>>
Mysql学习总结(62)——MySQL连接com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link问题
查看>>
Mysql学习总结(63)——Mysql数据库架构方案选择与分析
查看>>
Mysql学习总结(64)——Mysql配置文件my.cnf各项参数解读
查看>>
Mysql学习总结(65)——项目实战中常用SQL实践总结
查看>>
Mysql学习总结(66)——设置MYSQL数据库编码为UTF-8
查看>>
Mysql学习总结(67)——MYSQL慢查询日志
查看>>