Android tinyalsa库函数剖析
1. PCM 流控制函数
打开、关闭及状态检查
-
pcm_open(unsigned int card, unsigned int device, unsigned int flags, struct pcm_config *config)
打开指定声卡(card)和设备(device)的 PCM 流。- flags 参数确定流的方向:例如
PCM_IN(录音)或PCM_OUT(回放)。 - config 参数为一个结构体,内含通道数、采样率、数据格式、周期大小与周期数等设置。
- 成功后返回一个
struct pcm *句柄,用于后续的数据传输操作。
- flags 参数确定流的方向:例如
-
pcm_close(struct pcm *pcm)
关闭之前通过pcm_open()打开的 PCM 句柄,释放资源。 -
pcm_is_ready(struct pcm *pcm)
判断 PCM 流是否已成功打开并处于可用状态。返回非零表示出错或不可用,通常在打开后立即检查以确保后续操作是安全的。
2. PCM 参数管理函数
为了判断硬件支持哪些采样参数,你可以获取 PCM 的能力信息:
-
pcm_params_get(unsigned int card, unsigned int device, unsigned int flags)
获取指定 PCM 设备的参数集合,返回一个struct pcm_params *。该结构体中包含了硬件支持的采样率、格式、周期大小等参数范围。 -
pcm_params_free(struct pcm_params *pcm_params)
释放由pcm_params_get()分配的参数信息结构体。 -
参数查询和设置函数:
pcm_params_get_mask(struct pcm_params *pcm_params, enum pcm_param param)
获取某个参数(如采样率、格式)的支持情况(一个 bit mask)。pcm_params_get_min()/pcm_params_get_max()
分别获取某个参数所支持的最小或最大值。pcm_params_set_min()/pcm_params_set_max()
为参数设置新的最小或最大值(一般用于定制或者限制范围)。
-
pcm_params_to_string(struct pcm_params *params, char *string, unsigned int size)
将参数信息转换为人类可读的字符串,便于调试或者日志输出。返回填充字符串的长度或所需的长度。 -
pcm_params_format_test(struct pcm_params *params, enum pcm_format format)
检查特定的 PCM 格式(例如 PCM_FORMAT_S16_LE)是否在支持的格式中,返回 1 表示支持,0 表示不支持。
3. PCM 配置操作
有时需要在流打开后获取或调整当前使用的配置:
-
pcm_get_config(struct pcm *pcm, struct pcm_config *config)
从已打开的 PCM 流中获取当前的配置信息(例如实际启用的通道数、采样率、缓冲区设置等)。 -
pcm_set_config(struct pcm *pcm, struct pcm_config *config)
修改已经打开的 PCM 流的配置(如果硬件和驱动支持动态调整的话)。
4. 错误信息、格式转换及辅助函数
-
pcm_get_error(struct pcm *pcm)
返回一个字符串,描述最近一次调用出错时的错误原因,用于调试和错误处理。 -
pcm_format_to_bits(enum pcm_format format)
返回所使用 PCM 格式的存储位数。例如,对于PCM_FORMAT_S24_LE,可能返回 32,因为实际存储 32 位数据(尽管只有 24 位有效)。 -
缓冲区大小转换函数:
pcm_get_buffer_size(struct pcm *pcm)
得到当前 PCM 流推荐使用的总缓冲区大小(单位:帧)。通常总帧数 =period_size * period_count。pcm_frames_to_bytes(struct pcm *pcm, unsigned int frames)
将帧数转换为字节数(考虑到每帧的采样数据大小,依赖通道数和采样格式)。pcm_bytes_to_frames(struct pcm *pcm, unsigned int bytes)
将字节数转换回帧数。
-
pcm_get_latency(struct pcm *pcm)
返回当前 PCM 流的延迟(以毫秒为单位)。延迟值与缓冲区配置(总大小、采样率等)直接相关。 -
pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail, struct timespec *tstamp)
获取当前缓冲区状态——返回流中可用帧数以及与之关联的时间戳。- 对于输入流,这表示可供应用读取的帧数。
- 对于输出流,这表示还空闲(可写)的帧数。
-
pcm_get_subdevice(struct pcm *pcm)
返回实际打开时使用的子设备编号,有些硬件可能提供多个子设备用于并发操作。
5. 数据传输操作
标准读写接口
-
pcm_read(struct pcm *pcm, void *data, unsigned int count)
从 PCM 输入流(或录音设备)中读取数据。- count 参数通常是以字节为单位,读取的数据量应与
pcm_frames_to_bytes()计算出的单个周期数据一致。 - 返回值为 0 表示成功,否则返回负值错误码。
- count 参数通常是以字节为单位,读取的数据量应与
-
pcm_write(struct pcm *pcm, const void *data, unsigned int count)
将数据写入 PCM 输出流(或播放设备):- 类似于
pcm_read(),count表示写入的数据量(单位:字节)。 - 写入操作会触发硬件播放,如果处于中断恢复状态时(例如 FIFO underrun 后)可能会重新启动播放。
- 类似于
内存映射(mmap)接口
直接使用内存映射技术可以降低数据传输的延迟和 CPU 占用:
pcm_mmap_begin(struct pcm *pcm, void **areas, unsigned int *offset, unsigned int *frames)
获取 PCM 设备内存映射缓冲区的起始地址、当前偏移量以及可操作的帧数。pcm_mmap_commit(struct pcm *pcm, unsigned int offset, unsigned int frames)
提交写入或读取的数据,更新缓冲区状态。pcm_mmap_write()与pcm_mmap_read()
分别用于直接向缓冲区写数据或从缓冲区读取数据,代替标准的pcm_write()与pcm_read()。pcm_mmap_avail(struct pcm *pcm)
返回当前缓冲区中可供写入或读取的帧数。pcm_mmap_get_hw_ptr(struct pcm* pcm, unsigned int *hw_ptr, struct timespec *tstamp)
获取当前硬件指针的位置以及它所对应的时间戳,用于同步时钟或进一步的数据处理。
6. 流状态控制和事件接口
-
pcm_prepare(struct pcm *pcm)
准备 PCM 子流,使其处于可触发状态。常用于在播放或录音前执行预处理(例如重置缓冲区)。 -
pcm_start(struct pcm *pcm)
启动 PCM 子流进行数据传输,适用于那些不自动启动数据传输的设备或在调用pcm_write()/pcm_read()之前要明确启动的数据流。 -
pcm_stop(struct pcm *pcm)
停止 PCM 子流的数据传输,常用于结束一段播放或录音过程。 -
pcm_ioctl(struct pcm *pcm, int request, ...)
通过 ioctl 调用发送控制命令给 PCM 驱动,允许更底层的控制和调整,这是更底层的设备操作接口。 -
事件与等待相关:
pcm_wait(struct pcm *pcm, int timeout)
等待 PCM 设备准备好数据(例如,等待缓冲区有足够数据可读或者有足够空闲帧可写)。pcm_get_poll_fd(struct pcm *pcm)
得到可以用于poll()或select()的文件描述符,以便与其他事件循环集成。pcm_set_avail_min(struct pcm *pcm, int avail_min)
修改在触发 PCM 数据传输前,缓冲区最小应达到的帧数。如果使用 MMAP 模式而且禁用了 IRQ,此设置尤其重要用于降低延迟。
7. Mixer(混音器)控制接口
TinyALSA 同时提供了对硬件混音器的基本控制接口,用于调整音量、开关、通道切换等。
打开、关闭及 Mixer 信息
mixer_open(unsigned int card)
打开指定声卡的混音器设备,返回表示 mixer 的句柄结构。mixer_close(struct mixer *mixer)
关闭并释放混音器资源。mixer_get_name(struct mixer *mixer)
获取混音器的名称,通常用于调试或显示硬件信息。
获取混音器控制(Control)
mixer_get_num_ctls(struct mixer *mixer)
返回混音器中包含多少个可控的控件。mixer_get_ctl(struct mixer *mixer, unsigned int id)与mixer_get_ctl_by_name(struct mixer *mixer, const char *name)
通过控件的索引或名称获取某个具体的混音器控制对象。mixer_ctl_get_name(struct mixer_ctl *ctl)
获取某个混音器控制项的名称。
混音器控件的属性与操作
-
类型和枚举检查:
mixer_ctl_get_type()/mixer_ctl_get_type_string()
返回控制项的数据类型(例如整数、布尔值、枚举等)。mixer_ctl_get_num_values(struct mixer_ctl *ctl)
一个控制项可能有多个值,返回值的数量。mixer_ctl_get_num_enums()与mixer_ctl_get_enum_string()
针对枚举类型的控制项,获取枚举数目及对应的字符串名称。
-
控件数据的获取与设置:
mixer_ctl_get_value()与mixer_ctl_set_value()
用于直接获取或设置控制项的具体值。mixer_ctl_get_percent()与mixer_ctl_set_percent()
针对音量等控件,允许以百分比形式获取或设置值。mixer_ctl_get_array()与mixer_ctl_set_array()
用于读取或设置控件的数组数据(适合多通道或复合控件)。mixer_ctl_set_enum_by_string()
针对枚举控件,通过输入字符串来设置控制值。
-
范围控制:
mixer_ctl_get_range_min()/mixer_ctl_get_range_max()
获取混音器控件支持的最小或最大值,这对限制控制设置非常有用。
混音器事件支持
mixer_subscribe_events(struct mixer *mixer, int subscribe)
允许应用订阅或取消订阅混音器事件(例如,外部变化触发控制更新)。mixer_wait_event(struct mixer *mixer, int timeout)
等待混音器事件的发生。mixer_consume_event(struct mixer *mixer)
消费已经发生的事件,确保事件不会被重复处理。
小结
- PCM 流相关的函数(
pcm_open、pcm_close、pcm_read、pcm_write等)主要负责数据传输的初始化、实时读写操作及状态管理。 - 参数管理、配置和转换函数(例如
pcm_params_get、pcm_frames_to_bytes等)帮助开发者在运行时查询硬件能力、进行单位转换以及调试配置。 - 高级数据传输接口(如
pcm_mmap_*系列函数)提供了直接内存映射方式,可用于降低延迟和优化性能。 - Mixer 接口 则提供了对硬件混音器(如音量、通道路由、开关等)的操作,以便对声音输入输出进行更细粒度的控制。
相关文章:
Android tinyalsa库函数剖析
1. PCM 流控制函数 打开、关闭及状态检查 pcm_open(unsigned int card, unsigned int device, unsigned int flags, struct pcm_config *config) 打开指定声卡(card)和设备(device)的 PCM 流。 flags 参数确定流的方向࿱…...
PyCharm Flask 使用 Tailwind CSS v3 配置
安装 Tailwind CSS 步骤 1:初始化项目 在 PyCharm 终端运行:npm init -y安装 Tailwind CSS:npm install -D tailwindcss3 postcss autoprefixer初始化 Tailwind 配置文件:npx tailwindcss init这会生成 tailwind.config.js。 步…...
Python爬虫第17节-动态渲染页面抓取之Selenium使用下篇
目录 引言 一、获取节点信息 1.1 获取属性 1.2 获取文本值 1.3 获取ID、位置、标签名、大小 二、切换Frame 三、延时等待 3.1 隐式等待 3.2 显式等待 四、前进后退 五、Cookies 六、选项卡管理 七、异常处理 引言 这一节我们继续讲解Selenium的使用下篇࿰…...
HarmonyOS 第2章 Ability的开发,鸿蒙HarmonyOS 应用开发入门
第2章 Ability的开发 本章内容 本章介绍HarmonyOS的核心组件Ability的开发。 2.1 Ability概述 2.2 FA模型介绍 2.3 Stage模型介绍 2.4 Ability内页面的跳转和数据传递 2.5 Want概述 2.6 实战:显式Want启动Ability 2.7 实战:隐式Want打开应用管理 2.8 小结 2.9 习题 2.1 Abili…...
day2-小白学习JAVA---java第一个程序
java第一个程序 1、新建一个文件,以.java为结尾2、用编辑器打开后写入代码(本人写前端,所以用vscode,也可用其他)3、编译文件4、运行文件5、HelloWorld代码解释6、文档注释 1、新建一个文件,以.java为结尾 …...
Rockchip 新一代 64 位处理器 RK3562--九鼎开发板
RK3562 是 Rockchip 新一代 64 位处理器 RK3562(Quad-core ARM Cortex-A53,主频 最高 2.0GHz),最大支持 8GB 内存;内置独立的 NPU,可用于轻量级人工智能应用,RK3562 拥有 PCIE2.1/USB3.0 OTG/…...
z-library电子图书馆最新地址的查询方法
对于喜欢读书的伙伴们,应该都听说过z站(z-library),优点多多,缺点就是地址不稳定,经常会变化网站地址。然后我最近发现了一个工具,可以不间断更新官方可用的z站地址:电子书最新地址...
常见MQ及类MQ对比:Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ
常见MQ及类MQ对比 基于Grok调研 Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ 关键点: Redis Pub/Sub 适合简单实时消息,但不持久化,消息可能丢失。Redis Stream 提供持久化,适合需要消息历史的场景,但…...
Kaggle-Bag of Words Meets Bags of Popcorn-(二分类+NLP+Bert模型)
Bag of Words Meets Bags of Popcorn 题意: 有很多条电影评论记录,问你每一条记录是积极性的评论还是消极性的评论。 数据处理: 1.首先这是文件是zip形式,要先解压,注意sep ‘\t’。 2.加载预训练的 BERT 分词器 …...
Spring Boot 3 + SpringDoc:打造接口文档
1、背景公司 新项目使用SpringBoot3.0以上构建,其中需要对外输出接口文档。接口文档一方面给到前端调试,另一方面给到测试使用。 2、SpringDoc 是什么? SpringDoc 是一个基于 Spring Boot 项目的库,能够自动根据项目中的配置、…...
Json 在线格式化 - 加菲工具
Json 在线格式化 打开网站 加菲工具 选择“Json 在线格式化” 或者直接进入 https://www.orcc.top/tools/json 输入Json,点击左上角的“格式化”按钮 得到格式化后的结果...
React 列表渲染基础示例
React 中最常见的一个需求就是「把一组数据渲染成一组 DOM 元素」,比如一个列表。下面是我写的一个最小示例,目的是搞清楚它到底是怎么工作的。 示例代码 // 定义一个静态数组,模拟后续要渲染的数据源 // 每个对象代表一个前端框架…...
HarmonyOS-ArkUI V2装饰器: @Monitor装饰器:状态变量修改监听
Monitor作用 Monitor的作用就是来监听状态变量的值变化的。被Monitor修饰的函数,会在其对应监听的变量发生值的变化时,回调此函数,从而可以让您知道是什么值发生变化了,变化前是什么值,变化后是什么值。 V1版本的装饰器,有个叫@Watch的装饰器,其实也有监听变化的能力,…...
微信小程序文字混合、填充动画有效果图
效果图 .wxml <view class"text" style"--deg:{{deg}}deg;"><view>混合父级颜色</view> </view> <view class"fill {{status?action:}}">文字颜色填充</view> <button bind:tap"setStatus"…...
【计算机网络 | 第一篇】计算机网络基础知识
网络分层模型 1.OSI七层模型国际标准化组织提出的一个网络分层模型,总共有七层,其大体功能以及每一层分工如下所示: 每一层都专注做一件事,并且每一层都需要下一层提供的功能。 OSI七层模型七层结构体系清晰,理论完整…...
二叉树理论基础
二叉树种类 满二叉树:每个非叶子节点都有且只有两个子节点。 和完全二叉树:除了最底层外,其他各层都是满的;最底层的节点都集中在左侧。 二叉搜索树:对于任意节点 u,左子树上所有节 点的值都小于 u.val…...
再读bert(Bidirectional Encoder Representations from Transformers)
再读 BERT,仿佛在数字丛林中邂逅一位古老而智慧的先知。初次相见时,惊叹于它以 Transformer 架构为罗盘,在预训练与微调的星河中精准导航,打破 NLP 领域长久以来的迷雾。而如今,书页间跃动的不再仅是 Attention 机制精…...
uCOS3实时操作系统(系统架构和中断管理)
文章目录 系统架构中断管理ARM中断寄存器相关知识ucos中断机制 系统架构 ucos主要包含三个部分的源码: 1、OS核心源码及其配置文件(ucos源码) 2、LIB库文件源码及其配置文件(库文件,比如字符处理、内存管理࿰…...
图像预处理-图像噪点消除
一.基本介绍 噪声:指图像中的一些干扰因素,也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器:也可以叫做卷积核 - 低通滤波器是模糊,高通滤波器是锐化 - 低通滤波器就…...
6.数据手册解读—运算放大器(二)
目录 6、细节描述 6.1预览 6.2功能框图 6.3 特征描述 6.3.1输入保护 6.3.1 EMI抑制 6.3.3 温度保护 6.3.4 容性负载和稳定性 6.3.5 共模电压范围 6.3.6反相保护 6.3.7 电气过载 6.3.8 过载恢复 6.3.9 典型规格与分布 6.3.9 散热焊盘的封装 6.3.11 Shutdown 6.4…...
用 Deepseek 写的uniapp油耗计算器
下面是一个基于 Uniapp 的油耗计算器实现,包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面: <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…...
thinkphp实现图像验证码
示例 服务类 app\common\lib\captcha <?php namespace app\common\lib\captcha;use think\facade\Cache; use think\facade\Config; use Exception;class Captcha {private $im null; // 验证码图片实例private $color null; // 验证码字体颜色// 默认配置protected $co…...
【k8s系列4】工具介绍
1、虚拟机软件 vmware workstation 2、shell 软件 MobaXterm 3、centos7.9 下载地址 (https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.374bf5adOaiFPW) 4、上网软件...
微博辐射源和干扰机
微波辐射源和干扰机是电子战和通信领域中的两个重要概念,它们在军事、民用及科研中具有广泛应用。以下是两者的详细解析及其相互关系: 1. 微波辐射源 定义: 微波辐射源是指能够主动发射微波(频率范围通常为 300 MHz&…...
计算机网络——网络模型
一、OSI七层模型 (1)客户端发送请求时 OSI 七层模型的运作流程 应用层(Application Layer) 用户通过浏览器输入URL(如https://example.com),根据协议类型(HTTP/HTTPS)确…...
Spark-SQL核心编程2
路径问题 相对路径与绝对路径:建议使用绝对路径,避免复制粘贴导致的错误,必要时将斜杠改为双反斜杠。 数据处理与展示 SQL 风格语法:创建临时视图并使用 SQL 风格语法查询数据。 DSL 风格语法:使用 DSL 风格语法查询…...
Java 序列化与反序列化终极解析
Java 序列化与反序列化终极解析 1. 核心概念 (1) 什么是序列化? 定义:将对象转换为字节流的过程(对象 → 字节) 目的: 持久化存储(如保存到文件) 网络传输(如RPC调用)…...
STM32单片机入门学习——第41节: [12-1] Unix时间戳
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.18 STM32开发板学习——第41节: [12-1] Unix时间戳 前言开发板说明引用解答和科普一…...
无人机自主导航与路径规划技术要点!
一、自主导航与路径规划技术要点 1. 传感器融合 GPS/北斗定位:提供全局定位,但在室内或遮挡环境下易失效。 惯性测量单元(IMU)**:通过加速度计和陀螺仪实时追踪姿态,弥补GPS信号丢失时的定位空缺。 …...
AI绘画SD中,如何保持生成人物角色脸部一致?Stable Diffusion精准控制AI人像一致性两种实用方法教程!
在AI绘画StableDiffusion中,一直都有一个比较困难的问题,就是如何保证每次出图都是同一个人。今天就这个问题分享一些个人实践,大家和我一起来看看吧。 一. 有哪些实现方式 方式1:固定Seed种子值。 固定Seed种子值出来的图片人…...
