Android tinyalsa之pcm_close调用流程与实战(一百零四)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1. 前言2. 用法与应用场景3. 调用流程剖析3.1 核心步骤3.2 涉及核心时序图4. 实战应用案例5. 用法总结1. 前言本篇目的Android tinyalsa之pcm_close调用流程与实战。2. 用法与应用场景pcm_close是tinyalsa库中用于关闭 PCM 设备并释放所有相关资源的终点函数。它不仅负责用户态内存的回收更重要的是触发内核驱动释放物理硬件资源。用法int pcm_close(struct pcm *pcm);返回值成功返回0。若传入指针无效函数会安全返回。应用场景结束音频会话在播放或录音任务完成后正常关闭设备节点。错误处理路径当pcm_open成功但后续的pcm_prepare或数据读写发生严重错误时必须调用此函数进行资源清理。动态路由切换在 Android 系统切换音频路径如 Speaker 切换至有线耳机时HAL 层通常需要关闭当前的 PCM 实例并重新配置。3. 调用流程剖析3.1 核心步骤指针合法性校验检查传入的pcm是否为NULL或指向bad_pcm。tinyalsa的设计确保了对非法句柄调用 close 也不会导致系统崩溃。停止流传输如果设备仍处于RUNNING状态底层驱动会在关闭文件描述符前尝试停止 DMA 传输。解映射 MMAP 缓冲区检查pcm-mmap_buffer。如果用户以PCM_MMAP模式打开设备pcm_close会自动调用munmap释放映射的内存块。触发内核 Release执行系统调用close(pcm-fd)。这会进入内核 ALSA 核心层调用驱动的release回调函数进而关闭硬件功放或重置硬件寄存器。内存释放调用free(pcm)销毁用户态的结构体实例完成最后的清理工作。关键技术坏句柄安全回收tinyalsa在pcm_open失败时也会返回一个结构体fd 为 -1。pcm_close能够识别这种“坏句柄”并仅释放内存而不尝试执行内核关闭操作这简化了 HAL 层的异常处理逻辑。3.2 涉及核心时序图Audio Codec/DMAKernel ALSA CoreVFS (close syscall)tinyalsa (pcm_close)Audio HALAudio Codec/DMAKernel ALSA CoreVFS (close syscall)tinyalsa (pcm_close)Audio HALalt[MMAP 模式已启用]调用 pcm_close(pcm)1. 验证 pcm 指针及状态2. munmap(pcm-mmap_buffer)3. close(pcm-fd)触发 snd_pcm_release停止 DMA, 降低功耗硬件已重置返回4. free(pcm) 释放结构体返回 04. 实战应用案例此 Demo 展示了在 Android HAL 开发中如何规范地使用pcm_close并通过指针置空防止野指针异常。#includetinyalsa/asoundlib.h#includestdio.h#includestdlib.h/** * 模拟 HAL 层安全释放音频流的逻辑 */voidhal_pcm_release(structpcm**pp_pcm){if(pp_pcmNULL||*pp_pcmNULL){return;}/* 1. 执行 tinyalsa 关闭操作 */printf(HAL: Closing pcm device...\n);intretpcm_close(*pp_pcm);if(ret!0){printf(HAL: Warning - pcm_close returned error code %d\n,ret);}/* 2. 极其重要手动将原指针置为 NULL * 防止 HAL 层其他线程误用已释放的内存 (Use-After-Free) */*pp_pcmNULL;printf(HAL: Resource cleanup complete.\n);}intmain(){structpcm_configconfig{.channels2,.rate44100,.period_size1024,.period_count4,.formatPCM_FORMAT_S16_LE};// 打开设备 (声卡 0, 设备 0, 播放模式)structpcm*out_streampcm_open(0,0,PCM_OUT,config);if(out_streampcm_is_ready(out_stream)){printf(HAL: Audio session started.\n);// ... 此处执行音频数据写入 pcm_write ...}// 无论打开成功还是失败最终都要调用清理函数hal_pcm_release(out_stream);return0;}5. 用法总结特性详情描述内存管理完全清理。内部集成了对mmap缓冲区和pcm结构体本身的free。调用配对必须与 pcm_open 配对。漏掉 close 会导致声卡被占用Device Busy以及系统 fd 泄露。线程安全非线程安全。严禁在主线程 close 的同时在另一线程执行pcm_write需在 HAL 层加锁。硬件状态重置硬件。该函数执行后内核通常会关闭相关的 DAC/ADC 电源以节省功耗。容错性高容忍度。可以安全处理未成功 ready 的 pcm 指针不会造成内核异常。

相关新闻

Z-Image-Turbo让非技术人员也能玩转AI绘画

Z-Image-Turbo让非技术人员也能玩转AI绘画

Z-Image-Turbo让非技术人员也能玩转AI绘画 你有没有过这样的经历:想为朋友圈配一张定制插画,想给公司产品设计一张海报,或者只是单纯想把脑海里那个“穿汉服站在樱花雨中的少女”变成现实——但打开Stable Diffusion,面对一堆参数…

2026/7/3 14:20:42 阅读更多 →
AI口型同步怎么做?Heygem技术原理浅析

AI口型同步怎么做?Heygem技术原理浅析

AI口型同步怎么做?Heygem技术原理浅析 在数字人视频批量生成需求爆发的当下,一个看似简单却极难做好的技术环节正成为内容生产的关键瓶颈:音频与数字人口型的精准同步。你是否也遇到过这样的问题——语音清晰流畅,但数字人嘴型僵硬…

2026/7/3 0:20:14 阅读更多 →
QwQ-32B保姆级教程:用Ollama本地部署最强推理模型

QwQ-32B保姆级教程:用Ollama本地部署最强推理模型

QwQ-32B保姆级教程:用Ollama本地部署最强推理模型 你是否也经历过这样的时刻——在官网排队15分钟,终于等到QwQ-32B的响应,结果刚输入问题,页面就卡在“思考中”不动了?或者想验证一个数学推理题,却要反复…

2026/7/3 14:20:46 阅读更多 →

最新新闻

STM32F303RE扩展EEPROM存储方案与优化实践

STM32F303RE扩展EEPROM存储方案与优化实践

1. 为什么需要扩展存储空间在嵌入式系统开发中,STM32F303RE这类微控制器虽然内置了Flash和SRAM,但实际项目经常会遇到存储空间不足的问题。我最近在做一个工业数据采集项目时就深有体会——需要长时间记录设备运行参数,但MCU内部的256KB Flas…

2026/7/4 12:02:48 阅读更多 →
智能散热系统设计:基于DRV8213与PID控制的嵌入式解决方案

智能散热系统设计:基于DRV8213与PID控制的嵌入式解决方案

1. 项目背景与核心组件选型 在嵌入式电子系统设计中,散热管理一直是工程师面临的关键挑战。特别是在汽车电子、医疗设备等对温度敏感的应用场景中,过热可能导致系统性能下降甚至硬件损坏。本项目采用DRV8213电机驱动器、MF25060V2-1000U-A99散热风扇和PI…

2026/7/4 12:02:48 阅读更多 →
Windows任务栏透明化神器:5种模式彻底改变你的桌面体验

Windows任务栏透明化神器:5种模式彻底改变你的桌面体验

Windows任务栏透明化神器:5种模式彻底改变你的桌面体验 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Windows任…

2026/7/4 12:00:48 阅读更多 →
量子傅里叶变换在多光子干涉测量中的高效应用

量子傅里叶变换在多光子干涉测量中的高效应用

1. 量子傅里叶变换在多光子干涉基准测试中的突破性进展在量子光学实验中,多光子干涉现象是量子计算和量子通信的核心基础。想象一下,当多个完全相同的光子同时进入一个光学系统时,它们会像训练有素的芭蕾舞者一样完美同步地舞动,产…

2026/7/4 12:00:48 阅读更多 →
MiniMax-M2.7 + DMXAPI:轻量级大模型调用新范式

MiniMax-M2.7 + DMXAPI:轻量级大模型调用新范式

1. 项目概述:这不是“又一个API接口”,而是大模型调用链路的轻量化重构 最近在多个技术群和开发者论坛里, MiniMax-M2.7 这个名字出现频率陡增——不是作为论文里的新架构,也不是某家大厂发布会上的PPT配图,而是真实…

2026/7/4 12:00:48 阅读更多 →
MLOps实战:从Notebook到生产环境的模型服务化与可观测性

MLOps实战:从Notebook到生产环境的模型服务化与可观测性

1. 项目概述:当模型走出Jupyter,真正开始养家糊口 “From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题里藏着一个被无数数据科学家反复咀嚼、又悄悄咽下的现实:我们花了80%的时间调参、画图、写 print(mo…

2026/7/4 11:58:47 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻