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

本文共 1417 字,大约阅读时间需要 4 分钟。

qemu声卡虚拟化的实现核心围绕着audio.c文件展开,这一文件统筹管理了整个音频数据结构与通用逻辑框架。在此基础上,我们以pa后端加ac97模拟设备为例,详细剖析qemu中声卡初始化的过程。

后端初始化

pa后端的代码位于audio/paaudio.c中。在vl.c的qemu_create_early_backends函数启动点处,后端的主流程初始化如下:首先调用paaudio.c中的register_audio_pa注册声音后端对象到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。随后,在audio_init中创建了一个AudioState对象,并初始化了pa_driver,将其注册到AudioState对象中。最后,将生成的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,故直接获取此链表中的第一个对象,根据命令行传入的后端参数pa。

此时,应注意到:为何命令行中注册多个后端只会生效一个?这是因为通过调用audio_states链表中的第一个对象实现了只使用一个后端的要求。

前后端绑定

前后端绑定的实现主要在线下ac97模拟设备的相关代码中。具体流程包括以下几个关键步骤:

  • 初始化模拟设备的音频输出能力。
  • 创建SWVoiceOut(虚拟声卡输出)对象。
  • 创建HWVoiceOut(后端硬件输出)对象,并通过后端的pcm_ops操作函数完成绑定。
  • 最终调用SWVoiceOut(cosound_card_swarter_dispatch)完成前后端真正的绑定。
  • 具体来说:

    • audio_pcm_create_voice_pair_out函数中创建了SWVoiceOut对象,是虚拟声卡输出的核心实现。
    • audio_pcm_hw_add_new_out函数中创建了HWVoiceOut对象,并完成了后端的绑定。
    • audio_pcm_sw_init_out函数实现了前后端的最终绑定。

    全过程的核心目标是实现虚拟声卡与模拟设备的高效通信,确保声音输出流程的顺畅运行。

    结语图

    图片显示了虚拟声卡与模拟设备的前后端绑定实现流程,清晰展示了整个初始化过程。

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

    你可能感兴趣的文章
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>