当前位置: 首页 > article >正文

【RK3568】dummy.c

阶段1主要是注册 platform_driver创建设备static struct platform_driver snd_dummy_driver { .probe snd_dummy_probe, .remove snd_dummy_remove, .driver { .name SND_DUMMY_DRIVER, .pm SND_DUMMY_PM_OPS, }, };module_init( alsa_card_dummy_init )↓alsa_card_dummy_init()↓platform_driver_register() ← 注册平台驱动↓platform_device_register_simple() ← 创建设备↓snd_dummy_probe() ← 探针函数被调用阶段2snd_dummy_probe()↓snd_card_new() // 创建声卡实例↓snd_card_dummy_pcm() // 创建PCM设备↓snd_card_dummy_new_mixer() // 创建混音器↓snd_card_register() // 注册声卡系统PCMsnd_card_dummy_pcm()↓snd_pcm_new() // 创建 PCM 实例↓snd_pcm_set_ops() // 设置操作函数-----// 设置播放操作集snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, ops);// 设置捕获操作集snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, ops);------↓returnPCM操作函数static struct snd_pcm_ops dummy_pcm_ops { .open dummy_pcm_open, .close dummy_pcm_close, .ioctl snd_pcm_lib_ioctl, .hw_params dummy_pcm_hw_params, .hw_free dummy_pcm_hw_free, .prepare dummy_pcm_prepare, .trigger dummy_pcm_trigger, .pointer dummy_pcm_pointer, };open当用户空间应用程序打开一个 PCM 设备如 /dev/snd/pcmC0D0p 时ALSA 框架会调用此函数来初始化 PCM 子流。close当用户空间应用程序关闭 PCM 设备如调用 snd_pcm_close() 或进程退出时ALSA 框架会调用此函数来清理 PCM 子流占用的资源。hw_params当用户空间应用程序通过 snd_pcm_hw_params() 设置 PCM 硬件参数缓冲区大小、周期大小、格式等时ALSA 框架会调用此函数来分配音频缓冲区。应用程序调用流程snd_pcm_open() → 调用 dummy_pcm_open()↓snd_pcm_hw_params() → 调用 dummy_pcm_hw_params() [本函数]↓snd_pcm_prepare() → 调用 dummy_pcm_prepare()↓snd_pcm_writei() → 音频数据传输...hw_free当 PCM 流需要释放硬件资源时如应用程序调用 snd_pcm_hw_free() 或准备重新配置硬件参数时ALSA 框架会调用此函数来释放之前分配的音频缓冲区。应用程序调用流程┌─────────────────────────────────────┐↓ │snd_pcm_open() → dummy_pcm_open() │↓ │snd_pcm_hw_params() → dummy_pcm_hw_params() [分配缓冲区] │↓ │音频播放/录制... │↓ │snd_pcm_hw_free() → dummy_pcm_hw_free() [释放缓冲区] ────────┘↓snd_pcm_hw_params() → 可重新配置参数再次分配缓冲区prepare当 PCM 流准备好开始数据传输时如应用程序调用 snd_pcm_prepare() ALSA 框架会调用此函数来初始化硬件状态为即将开始的音频传输做准备。应用程序调用流程snd_pcm_open() → dummy_pcm_open() [打开设备]↓snd_pcm_hw_params() → dummy_pcm_hw_params() [配置参数分配缓冲区]↓snd_pcm_prepare() → dummy_pcm_prepare() [准备传输 ← 本函数]↓snd_pcm_writei/readi → 开始音频数据传输↓snd_pcm_drop/drain() → dummy_pcm_trigger(STOP) [停止传输]↓snd_pcm_prepare() → dummy_pcm_prepare() [再次准备可重复]trigger当需要控制音频流的启动、停止、暂停或恢复时ALSA 框架会调用此函数。它是音频数据传输的 控制中心 负责将应用程序的控制命令转换为硬件操作。命令 含义 触发场景SNDRV_PCM_TRIGGER_START 开始传输 首次开始播放/录制SNDRV_PCM_TRIGGER_RESUME 恢复传输 从暂停状态恢复SNDRV_PCM_TRIGGER_STOP 停止传输 正常停止播放SNDRV_PCM_TRIGGER_SUSPEND 挂起传输 系统挂起/休眠应用程序调用流程【开始播放】snd_pcm_writei() 数据写入 → 内部调用 snd_pcm_start()↓SNDRV_PCM_TRIGGER_START↓dummy_pcm_trigger(START)↓启动定时器 → 开始音频传输【停止播放】snd_pcm_drop() 或 snd_pcm_drain()↓SNDRV_PCM_TRIGGER_STOP↓dummy_pcm_trigger(STOP)↓停止定时器 → 停止音频传输【暂停/恢复】snd_pcm_pause() → SNDRV_PCM_TRIGGER_SUSPEND → 停止定时器↓snd_pcm_pause(0) → SNDRV_PCM_TRIGGER_RESUME → 启动定时器pointerALSA 框架通过此函数获取当前音频硬件在 DMA 缓冲区中的位置指针。这个指针表示硬件已经处理播放或录制了多少帧音频数据。为什么需要 pointer 函数1. 缓冲区管理ALSA 使用环形缓冲区ring buffer进行音频数据传输┌────────────────────────────────────────────────────────┐│ DMA 缓冲区 (环形) │├────────────────────────────────────────────────────────┤│ 已播放区域 │ 当前播放位置 │ 待播放区域 ││ (可写入) │ hw_ptr (硬件读位置) ▼ │ (应用程序写入) │├────────────┼─────────────────┼─────────────────────────┤│ │ │ ││ -- appl_ptr ││ (应用写位置) ││ │ │ │└────────────┴─────────────────┴─────────────────────────┘- hw_ptr (硬件指针) : 硬件当前读取/写入的位置- appl_ptr (应用指针) : 应用程序当前读取/写入的位置2. 流程控制ALSA 通过比较 hw_ptr 和 appl_ptr 来- 计算可用空间应用程序可以写入多少数据- 检测溢出/欠载XRUN- 决定何时唤醒等待的应用程序

相关文章:

【RK3568】dummy.c

阶段1:主要是注册 platform_driver,创建设备static struct platform_driver snd_dummy_driver {.probe snd_dummy_probe,.remove snd_dummy_remove,.driver {.name SND_DUMMY_DRIVER,.pm SND_DUMMY_PM_OPS,}, };module_init( alsa_card_dummy_i…...

3分钟掌握Xenos:Windows平台最全面的DLL注入解决方案

3分钟掌握Xenos:Windows平台最全面的DLL注入解决方案 【免费下载链接】Xenos Windows dll injector 项目地址: https://gitcode.com/gh_mirrors/xe/Xenos 你是否曾想在Windows系统中为其他程序添加功能或进行调试,却发现传统的DLL注入方法既复杂又…...

全自动的智能鱼缸推荐

养鱼本是件陶冶情操的事,可传统养鱼方式却状况百出,让不少人头疼不已。数据显示,新手死鱼率超60%,37%鱼友因维护麻烦放弃,出差旅游时也无法照顾。传统养鱼的痛点新手养鱼,死鱼率高是大问题。因为缺乏科学水…...

Sunshine游戏串流终极指南:如何打造你的个人云游戏服务器

Sunshine游戏串流终极指南:如何打造你的个人云游戏服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一个强大的自托管游戏串流服务器解决方案&#xff…...

RimSort终极指南:3分钟搞定环世界MOD管理,告别加载顺序混乱

RimSort终极指南:3分钟搞定环世界MOD管理,告别加载顺序混乱 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a reliable…...

5分钟打造你的智能文献助手:Zotero AI插件终极指南

5分钟打造你的智能文献助手:Zotero AI插件终极指南 【免费下载链接】zotero-gpt GPT Meet Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-gpt 还在为海量文献管理而烦恼吗?每天面对堆积如山的PDF文件,你是否也经历过这…...

Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接。[windows]

目标计算机积极拒绝:你的程序(比如 redis-cli 或你的应用)已经成功找到了 127.0.0.1 这台计算机(就是本机),也找到了 6379 这个端口,但是当它尝试在这个端口上建立连接时,对方(也就是…...

YOLOv2算法全方位解析:从BatchNorm到聚类先验框的九大改进

YOLOv2 在 v1 的基础上引入了 BatchNorm、高分辨率分类器、Anchor Box、K-means 聚类先验框、直接位置预测、细粒度特征与多尺度训练等多项关键改进,彻底解决了 v1 在小目标检测和定位精度方面的痛点。本文逐层拆解 YOLOv2 的设计细节与实现逻辑,带你系统…...

SmartFusion2 FPGA在安全关键系统中的设计与实践

1. SmartFusion2在安全关键应用中的核心优势解析 在工业自动化、轨道交通和能源控制等领域,安全关键系统的设计一直面临着严苛的技术挑战。这类系统一旦失效,可能导致人员伤亡、重大经济损失或环境灾难。作为深耕工业级FPGA领域十余年的工程师&#xff0…...

深入解读C++中的指针变量

针变量是一种特殊的变量,它和以前学过的其他类型的变量的不同之处是:用它来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在C中用“*”符号表示指向,例如,i_pointer是一个指针变量,而*i_po…...

基于Simulink的燃料电池-锂电池混合动力能量流管理​

目录 手把手教你学Simulink——基于Simulink的燃料电池-锂电池混合动力能量流管理​ 摘要​ 一、背景与挑战​ 1.1 为什么1+1<2?揭秘多能源系统的“木桶效应”​ 1.2 核心痛点与设计目标​ 二、系统架构与核心控制推导​ 2.1 整体架构:从“各自为战”到“黄金搭档”…...

白沟全屋定制厂家哪家好

想找白沟靠谱的全屋定制厂家&#xff1f;选不好可就掉坑里了。我之前装修就踩过雷&#xff0c;找的小厂家&#xff0c;板材质量差&#xff0c;设计也不合理&#xff0c;入住没多久就出问题。后来我做了很多功课&#xff0c;重新选了宁创全屋定制&#xff0c;效果非常满意。选全…...

告别断电丢时!手把手教你为RK3568开发板配置外置RTC(PCF8563T)并设置开机自动同步

RK3568开发板外置RTC配置实战&#xff1a;从硬件连接到系统集成 在工业控制、物联网网关和边缘计算设备中&#xff0c;精确的时间同步往往关系到整个系统的可靠性。RK3568作为一款高性能嵌入式处理器&#xff0c;虽然内置了RTC模块&#xff0c;但在需要更高精度或更长断电保持的…...

如何实现Gofile高速下载:多线程文件传输的终极解决方案

如何实现Gofile高速下载&#xff1a;多线程文件传输的终极解决方案 【免费下载链接】gofile-downloader Download files from https://gofile.io 项目地址: https://gitcode.com/gh_mirrors/go/gofile-downloader 你是否曾经因为Gofile下载速度缓慢而感到沮丧&#xff1…...

如何在5分钟内为Unity游戏添加自动翻译:XUnity.AutoTranslator完整指南

如何在5分钟内为Unity游戏添加自动翻译&#xff1a;XUnity.AutoTranslator完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过了精彩的Unity游戏&#xff1f;面对日文、…...

BPSK调制中的相位旋转与ISI实现差分隐私

1. BPSK调制中的相位旋转与ISI实现差分隐私&#xff1a;原理与实现在物联网和联邦学习等分布式系统中&#xff0c;数据隐私保护正面临前所未有的挑战。传统差分隐私(DP)机制依赖人工噪声注入&#xff0c;往往带来额外的能耗和通信开销。而最新研究表明&#xff0c;BPSK调制中的…...

.NET 9云原生落地实践(2024年Q3最新Gartner验证架构):Service Mesh集成+自动扩缩容+可观测性闭环

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;.NET 9云原生容器化部署概览 .NET 9 正式引入对云原生场景的深度原生支持&#xff0c;包括更轻量的运行时裁剪、内置 OpenTelemetry 指标导出、Kubernetes 原生健康检查端点&#xff08;/healthz 和 /r…...

video-subtitle-extractor:本地AI字幕提取终极方案深度解析

video-subtitle-extractor&#xff1a;本地AI字幕提取终极方案深度解析 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测、字…...

Cursor破解工具深度解析:如何实现永久免费使用AI编程助手的技术奥秘

Cursor破解工具深度解析&#xff1a;如何实现永久免费使用AI编程助手的技术奥秘 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve rea…...

2026年,呼和浩特市唯一专业疗愈茶空间,究竟有何独特魅力?

在呼和浩特这座繁华都市&#xff0c;车水马龙、人来人往&#xff0c;高知、高收入、高审美的我们&#xff0c;每天都在社交、工作的漩涡里打转。职场的竞争压力、复杂的人际关系&#xff0c;让我们的内心疲惫不堪&#xff0c;情绪内耗严重&#xff0c;就像在茫茫大海中漂泊的船…...

COT-FM框架:机器人策略优化的条件最优传输方法

1. COT-FM框架概述&#xff1a;机器人策略优化的新范式 在机器人控制领域&#xff0c;策略优化一直面临着样本效率低、泛化能力差等核心挑战。COT-FM&#xff08;Conditional Optimal Transport-Flow Matching&#xff09;框架的提出&#xff0c;为这一领域带来了全新的解决思路…...

贪心算法:经典题目与证明

贪心算法&#xff1a;经典题目与证明 贪心算法因其简洁高效的特点&#xff0c;在解决优化问题时备受青睐。它通过每一步的局部最优选择&#xff0c;试图达到全局最优解。虽然并非所有问题都适用&#xff0c;但许多经典问题如背包问题、活动选择问题等&#xff0c;都能通过贪心…...

CodePercept:多模态AI在STEM视觉任务中的代码增强理解

1. 项目背景与核心价值CodePercept这个项目名本身就揭示了它的双重基因——"Code"代表编程能力&#xff0c;"Percept"暗示感知增强。作为一名长期关注AI工程化落地的开发者&#xff0c;我第一次看到这个标题就意识到&#xff1a;这可能是解决传统计算机视觉…...

大数据处理框架入门

大数据处理框架入门&#xff1a;解锁数据洪流的钥匙 在信息爆炸的时代&#xff0c;每天产生的数据量以ZB级增长&#xff0c;传统工具已难以应对。大数据处理框架应运而生&#xff0c;成为挖掘数据价值的核心工具。无论是企业决策、科学研究还是智能应用&#xff0c;掌握这些框…...

CodePercept:代码增强多模态模型在工业视觉中的应用

1. 项目背景与核心价值 去年在开发一个工业质检系统时&#xff0c;我发现传统CV模型对复杂缺陷的识别率始终卡在87%左右难以突破。当时尝试了各种数据增强和模型微调手段&#xff0c;直到偶然将代码逻辑作为辅助输入喂给视觉模型&#xff0c;准确率突然跃升到93.5%。这个意外发…...

技术赎罪券交易:软件测试从业者的专业实践与未来展望

在软件开发的复杂生态中&#xff0c;每一行代码都可能潜藏缺陷——这些“代码原罪”源于人为失误、需求漂移或技术债务积累。2026年&#xff0c;全球因代码错误导致的系统崩溃事件年增长率高达15%&#xff0c;尤其在金融和医疗领域&#xff0c;后果往往是灾难性的。作为软件测试…...

量子计算与可视化技术融合的前沿探索

1. 量子计算与可视化&#xff1a;当两种前沿技术相遇作为一名长期从事科学可视化研究的工程师&#xff0c;我见证了GPU如何彻底改变图形处理领域。如今&#xff0c;量子计算(QC)正在引发类似的变革讨论。但与GPU不同&#xff0c;量子计算机不是简单的"更快处理器"&am…...

时间序列预测中的功率变换技术与实战应用

## 1. 时间序列预测中的功率变换核心价值当我在2015年第一次尝试预测某电商平台的节日销量时&#xff0c;发现传统ARIMA模型在原始数据上表现糟糕。直到将销售额数据取对数后&#xff0c;预测准确率突然提升了37%。这个经历让我深刻认识到功率变换在时间序列分析中的魔法般的作…...

智慧树学习辅助插件:3分钟实现视频学习自动化 ⚡

智慧树学习辅助插件&#xff1a;3分钟实现视频学习自动化 ⚡ 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的视频学习流程而烦恼吗&#xff1f;…...

OralGPT-Omni:牙科多模态大语言模型的技术突破与应用

1. OralGPT-Omni&#xff1a;牙科多模态大语言模型的技术突破作为一名在牙科AI领域深耕多年的从业者&#xff0c;我见证了从传统影像分析到智能诊断的技术演进。OralGPT-Omni的出现标志着牙科人工智能进入了一个新阶段——它不仅是首个专为牙科设计的MLLM&#xff08;多模态大语…...