Android tinyalsa库函数剖析

news2025/4/19 19:38:34

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 * 句柄,用于后续的数据传输操作。
  • 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 表示成功,否则返回负值错误码。
  • 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_openpcm_closepcm_readpcm_write 等)主要负责数据传输的初始化、实时读写操作及状态管理。
  • 参数管理、配置和转换函数(例如 pcm_params_getpcm_frames_to_bytes 等)帮助开发者在运行时查询硬件能力、进行单位转换以及调试配置。
  • 高级数据传输接口(如 pcm_mmap_* 系列函数)提供了直接内存映射方式,可用于降低延迟和优化性能。
  • Mixer 接口 则提供了对硬件混音器(如音量、通道路由、开关等)的操作,以便对声音输入输出进行更细粒度的控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2338215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫第17节-动态渲染页面抓取之Selenium使用下篇

目录 引言 一、获取节点信息 1.1 获取属性 1.2 获取文本值 1.3 获取ID、位置、标签名、大小 二、切换Frame 三、延时等待 3.1 隐式等待 3.2 显式等待 四、前进后退 五、Cookies 六、选项卡管理 七、异常处理 引言 这一节我们继续讲解Selenium的使用下篇&#xff0…

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站地址:电子书最新地址

Spring Boot 3 + SpringDoc:打造接口文档

1、背景公司 新项目使用SpringBoot3.0以上构建,其中需要对外输出接口文档。接口文档一方面给到前端调试,另一方面给到测试使用。 2、SpringDoc 是什么? SpringDoc 是一个基于 Spring Boot 项目的库,能够自动根据项目中的配置、…

Json 在线格式化 - 加菲工具

Json 在线格式化 打开网站 加菲工具 选择“Json 在线格式化” 或者直接进入 https://www.orcc.top/tools/json 输入Json,点击左上角的“格式化”按钮 得到格式化后的结果

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七层模型国际标准化组织提出的一个网络分层模型&#xff0c;总共有七层&#xff0c;其大体功能以及每一层分工如下所示&#xff1a; 每一层都专注做一件事&#xff0c;并且每一层都需要下一层提供的功能。 OSI七层模型七层结构体系清晰&#xff0c;理论完整…

再读bert(Bidirectional Encoder Representations from Transformers)

再读 BERT&#xff0c;仿佛在数字丛林中邂逅一位古老而智慧的先知。初次相见时&#xff0c;惊叹于它以 Transformer 架构为罗盘&#xff0c;在预训练与微调的星河中精准导航&#xff0c;打破 NLP 领域长久以来的迷雾。而如今&#xff0c;书页间跃动的不再仅是 Attention 机制精…

uCOS3实时操作系统(系统架构和中断管理)

文章目录 系统架构中断管理ARM中断寄存器相关知识ucos中断机制 系统架构 ucos主要包含三个部分的源码&#xff1a; 1、OS核心源码及其配置文件&#xff08;ucos源码&#xff09; 2、LIB库文件源码及其配置文件&#xff08;库文件&#xff0c;比如字符处理、内存管理&#xff0…

图像预处理-图像噪点消除

一.基本介绍 噪声&#xff1a;指图像中的一些干扰因素&#xff0c;也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器&#xff1a;也可以叫做卷积核 - 低通滤波器是模糊&#xff0c;高通滤波器是锐化 - 低通滤波器就…

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 的油耗计算器实现&#xff0c;包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面&#xff1a; <!-- 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 下载地址 &#xff08;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.374bf5adOaiFPW&#xff09; 4、上网软件

Spark-SQL核心编程2

路径问题 相对路径与绝对路径&#xff1a;建议使用绝对路径&#xff0c;避免复制粘贴导致的错误&#xff0c;必要时将斜杠改为双反斜杠。 数据处理与展示 SQL 风格语法&#xff1a;创建临时视图并使用 SQL 风格语法查询数据。 DSL 风格语法&#xff1a;使用 DSL 风格语法查询…

STM32单片机入门学习——第41节: [12-1] Unix时间戳

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.18 STM32开发板学习——第41节: [12-1] Unix时间戳 前言开发板说明引用解答和科普一…

无人机自主导航与路径规划技术要点!

一、自主导航与路径规划技术要点 1. 传感器融合 GPS/北斗定位&#xff1a;提供全局定位&#xff0c;但在室内或遮挡环境下易失效。 惯性测量单元&#xff08;IMU&#xff09;**&#xff1a;通过加速度计和陀螺仪实时追踪姿态&#xff0c;弥补GPS信号丢失时的定位空缺。 …