Android如何找到正确的ALSA底层kcontrol接口?

linux alsa 音频路径切换 阅读详情

转:http://blog.youkuaiyun.com/sepnic/article/details/6152792

昨天分析了一把snd_kcontrol,可以认为上层应用的确是通过名称标识name来遍历底层的snd_kcontrol链表,从而找到相匹配的kcontrol。见snd_ctl_find_id函数

[cpp]  view plain copy
  1. /** 
  2.  * snd_ctl_find_id - find the control instance with the given id 
  3.  * @card: the card instance 
  4.  * @id: the id to search 
  5.  * 
  6.  * Finds the control instance with the given id from the card. 
  7.  * 
  8.  * Returns the pointer of the instance if found, or NULL if not. 
  9.  * 
  10.  * The caller must down card->controls_rwsem before calling this function 
  11.  * (if the race condition can happen). 
  12.  */  
  13. struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card,  
  14.                      struct snd_ctl_elem_id *id)  
  15. {  
  16.     struct snd_kcontrol *kctl;  
  17.   
  18.     if (snd_BUG_ON(!card || !id))  
  19.         return NULL;  
  20.     if (id->numid != 0)  
  21.         return snd_ctl_find_numid(card, id->numid);  
  22.     list_for_each_entry(kctl, &card->controls, list) {  
  23.         if (kctl->id.iface != id->iface)  
  24.             continue;  
  25.         if (kctl->id.device != id->device)  
  26.             continue;  
  27.         if (kctl->id.subdevice != id->subdevice)  
  28.             continue;  
  29.         if (strncmp(kctl->id.name, id->name, sizeof(kctl->id.name)))  
  30.             continue;  
  31.         if (kctl->id.index > id->index)  
  32.             continue;  
  33.         if (kctl->id.index + kctl->count <= id->index)  
  34.             continue;  
  35.         return kctl;  
  36.     }  
  37.     return NULL;  
  38. }  


今天继续跟踪Android音频系统时,发现无论如何都找不到Android与snd_kcontrol的联结点,无论是name还是numid(alsa_amixer controls打印出来的那个numid,即是内核层snd_kcontrol链表元素的numid)都找不到相关关键字。但是它确实可以进行调节音量等控制。后来我修改内核的Codec驱动,将音量控制的kcontrol.name换成其他字符串,重新编译,Android还是可以进行音量控制。

看起来有点像是通过numid来控制的,《Android音频HAL移植》一文有提到:“设备的切换就需要和驱动联调。例如,目前earpiece的id为10,那么就可以通过ALSA的amixer设置earpiece的开和关,以及大小。而id的值就需要做驱动的同事提供。”但是还不能就此肯定。目前也没有找到保存这些值的脚本文件。


继续以上问题,我在调节音量时,打印Codec寄存器的值,发现volume寄存器的值根本不会发生变化,但是音量确确实实是变化的。那时就在怀疑我们Android的音量调节不是通过硬件来实现的,而是有自身的sw mixer机制。晚上和Vic一起吃饭时,聊起这个,肯定了我的猜测。

[cpp]  view plain copy
  1. status_t AudioFlinger::setMasterVolume(float value)  
  2. {  
  3.     // check calling permissions  
  4.     if (!settingsAllowed()) {  
  5.         return PERMISSION_DENIED;  
  6.     }  
  7.   
  8.     // when hw supports master volume, don't scale in sw mixer  
  9.     AutoMutex lock(mHardwareLock);  
  10.     mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;  
  11.     if (mAudioHardware->setMasterVolume(value) == NO_ERROR) {  
  12.         value = 1.0f;  
  13.     }  
  14.     mHardwareStatus = AUDIO_HW_IDLE;  
  15.   
  16.     mMasterVolume = value;  
  17.     for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)  
  18.        mPlaybackThreads.valueAt(i)->setMasterVolume(value);  
  19.   
  20.     return NO_ERROR;  
  21. }  
应该是Android允许开发者在HAL层实现hw mixer,当AudioFlinger探测到存在hw mixer时,则调用mAudioHardware->setMasterVolume()对volume寄存器进行设置,也不会对volume值进行scale。至于sw mixer如何使用scale值的,我没有深入探究。

以后实现hw mixer看看(反正到时也要实现EQ)效果,现在这个音量设置不是线性的,用硬件控制应该更好一点。


PS:标题就不用管它了,默认下Android根本不去找底层的kcontrol接口,而是使用自身的sw mixer。

Android14音频子系统-Linux音频子系统ALSA 面对多种多样的codec芯片和总线,音频子系统需要做的就是兼容所有设备,换做是你的话该怎么设计?1、ALSA如何统一规范?1)ALSA驱动本质上是对字符设备驱动的进一步封装,由于抽象更统一的接口使其变得复杂一些;2)封装字符设备的操作,向上统一提供接口,驱动程序必须使用其提供的API注册声卡设备;>>三层file_operations结构:顶层->控制->playback/capture3)使用ALSA的大部分是PCI设备,即个人电脑上的声卡; 阅读详情

相关推荐

Android14音频子系统-ASoC-ALSA之DAPM电源管理子系统

ALSA声卡驱动中的DAPM详解之一 :https://blog.youkuaiyun.com/DroidPhone/article/details/12793293基本概念>>可以当做ASoc-ALSA系统下的一个子系统,构造也是相当复杂,但声卡驱动需要熟悉此框架,使用其框架的宏和API来构造(电源)寄存器对象;产生的背景:1)ASOC框架中动态音频电源管理子系统 - 设计的目的是省电2)同时也达到减少暴露给应用的操作(寄存器操作)效果 - 比如封装打开某个input通道、MUX、mixer操作等等;

STCNXPARM的博客 1024

snd_kcontrol探究

control控制接口 控制接口对于许多开关(switch)和调节器(slider)应用广泛,它能被用户空间存取,从而读写CODEC相关寄存器。control的主要用于mixer。它用snd_kcontrol_new结构体描述。 snd_kcontrol_new struct snd_kcontrol_new { snd_ctl_elem_ifac

AZURE 1万+

Android Audio HAL 与 Linux ALSA 架构对比:3 大差异与 2 种跨平台调试方法

本文深入对比了Android Audio HAL与Linux ALSA架构的3大核心差异,包括音频系统架构、数据流路径及控制逻辑,并提供了2种跨平台调试方法。针对嵌入式音频工程师,详细解析了分层隔离法和信号溯源法等实用技巧,帮助开发者高效解决双平台音频开发中的常见问题。

weixin_30417487的博客 503

QNX声音架构(翻译)

要重新配置音频流,您必须调用 snd_pcm_plugin_params() 或 snd_pcm_channel_params(),然后调用相应的 snd_pcm_plugin_setup() 或 snd_pcm_channel_setup() 函数。因此,请确保在写入音频数据之前,您在进行 snd_pcm_*_params() 调用后,调用 snd_pcm_*_setup() 和 snd_pcm_*_prepare() 函数。随着同时混合的音频流数量的增加,溢出的程度和频率也会增加。

chuanpeng0130的专栏 3493

Android audio subsystem 框架综括概述汇总入门详解

编者注: 为方便学习Android Linux audio subsystem 的朋友入门,根据个人学习audio查阅搜索期间所遇到的本领域牛人的博客汇总于此。 阅读目录 linux驱动 alsa模型: Android音频系统: ALSA声卡驱动中的DAPM详解: linux驱动 alsa模型: Linux ALSA声卡驱动之一:ALSA架构简介 Linux ALSA声卡驱动...

qianxuedegushi的博客 766

【gcc】跨版本兼容实战:高版本编译程序在低版本glibc环境下的部署方案

本文针对高版本gcc编译的程序在低版本glibc环境下部署的兼容性问题,提供了四种实战解决方案:静态编译的局限性、容器化部署的优雅方案、使用Devtoolset工具链的官方支持,以及最通用灵活的打包依赖SO发布方案。重点剖析了通过设置RPATH和Interpreter或使用patchelf工具,实现程序与自带库的独立部署,有效解决glibc版本鸿沟。

weixin_29237635的博客 362

【Android Audio 入门 三】--- KControl 介绍

【Audio System 三】--- KControl 介始三、KControl 介始3.1 如何调用kcontrol ( /dev/snd/controlC%u )3.2 IOCTL,snd_ctl_ioctl() 函数介绍3.3 SNDRV_CTL_IOCTL_ELEM_LIST 获得所有kcontrl列表 接着前面我们写的文章《【Audio System 二】— /dev/snd下的p...

|~~~热爱生活、努力学习的小伙汁~~~| 4554

Fluent基于低氧舱气体交换仿真(氮气与空气混合)

一、背景概述 模拟低氧舱充氮气和排除混合气体的过程,假设注入95%的氮气,舱内原有气体为空气,压力为标准大气压,温度为300K。观察气体注入过程中,舱内平均氮气和氧气浓度的变化。 二、Fluent设置 Setup 1、General type选择压力基 绝对速度 瞬态 重力勾选 2、Model 能量方程开启 组分运输开启,设置方法如下: 选择后OK,view就会变成Edit,点击Edit。然后再次点击Edit。 将组分中的非氮气氧气和空气的气体移除,右边选项需要将空气放在最后一位。 3、Materi

qq_35535616的博客 1万+

Android如何找到正确的ALSA底层kcontrol接口?(转)

昨天分析了一把snd_kcontrol,可以认为上层应用的确是通过名称标识name来遍历底层的snd_kcontrol链表,从而找到相匹配的kcontrol。见snd_ctl_find_id函数 /** * snd_ctl_find_id - find the control instance with the given id * @card: the card instance *...

mmdev 255

PCIe中ACS知识小记

虚拟机内部的访问数据显而易见是带的GPA地址。而目前几乎所有的PCIe 设备都带ACS control,所以它们可以单独assign给不同的VM,但是随之而来的就是即使两个GPU同时assign给同一个VM,由于ACS的存在,他们之间也不会有真正的物理层面的P2P访问。每一个TLP都自带一个address(寻址类TLP),同时每一个endpoint,PCIe switch都自带一段BIOS配置的地址空间范围,一旦这个TLP的address落入某个设备的地址范围,那么这个TLP就属于这个设备并消费。

Summer的博客 5078

别再到处找模型了!手把手教你将TI、ADI官网的SPICE模型导入LTspice(附路径避坑指南)

本文详细介绍了如何将TI、ADI官网的SPICE模型导入LTspice的全流程,包括模型获取、路径配置、符号生成等关键步骤,并提供了路径避坑指南。通过实战案例和技巧分享,帮助电子工程师高效利用外部元器件模型进行电路仿真,提升设计效率。

weixin_42535703的博客 406

snd_kcontrol_new名称中的SOURCE字段

前些日子写了一篇snd_kcontrol探究,该文主要从内核源码出发简单讲述一下kcontrol接口的始末。这几天因为要在Android里面添加一些音频控制接口,配合alsa_amixer scontents分析,对此有了更深的体会,记录于此。因为这方面的资料实在太少,很多东西都是自我理解的,如有错误请见谅并指出。   name字段是名称标识,这个字段非常重要,因为kcontrol的作用由名称

tronteng的专栏 729

Verilog实现FIR滤波器

1、FIR滤波器简介 不追究FIR滤波器的深层含义,我们只关注如何实现;可以看出,FIR滤波器的本质就是延迟、系数相乘与求和,如下图: 2、设计 基于以上分析,按照三级流水实现FIR滤波器设计:信号延迟-系数相乘-求和 `timescale 1ns / 1ps module fir( input clk, input rst_n, input [3:0]din, output reg [9:0]dout ); // data reg reg [3:0]din1; reg [3:.

CLL_caicai的博客 1万+

ALSA之 snd_kcontrol_new名称中的SOURCE字段

前些日子写了一篇snd_kcontrol探究,该文主要从内核源码出发简单讲述一下kcontrol接口的始末。这几天因为要在Android里面添加一些音频控制接口,配合alsa_amixer scontents分析,对此有了更深的体会,记录于此。因为这方面的资料实在太少,很多东西都是自我理解的,如有错误请见谅并指出。   name字段是名称标识,这个字段非常重要,因为kcontrol的作

linuxyant的专栏 811

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

灵境引路人 3227

北斗导航 | 从北一到北二再到北三,你应该知道的北斗导航系统

博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 一、引言 我国高度重视北斗系统的建设和发展。自20世纪80年代开始探索适合我们国家国情的卫星导航系统发展道路,形成了“三步走”的发展战略:2000年底,建成北斗一号导航系统,向我国广大用户提供服务;2012年底,建成北斗二号导航系统,...

尘世冰封的专栏 3079

alsa分析:网络资源

关于alsa,网络上已经有很多人做了分析,有的分析的非常好,图文并茂,我就拿来主义,直接引用了。 下面是收集的一些链接,内容包括: alsa驱动架构 audio codec的驱动 alsa的snd_controls/dapm/alsa-lib/alsa配置脚本..... alsa的中间层:alsa-lib alsa-HAL alsa-framework ++++

eydwyz的专栏 354

基于simulink的预测电流控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于预测电流控制策略的三相逆变器仿真方法。主要内容包括:准备工作(安装必要软件及工具箱)、构建三相逆变器基础模型、设计预测电流控制器(包含状态空间建模和控制器设计)、实现控制逻辑、添加示波器观察输出、配置仿真参数以及运行仿真分析结果。通过MATLAB代码示例和Simulink模块说明,展示了如何选择最优开关状态来最小化电流误差。该仿真方法为研究快速响应、高精度的逆变器控制提供了实用工具,但需注意实际应用中可能需要的调试工作。

amy_mhd的博客 275

Linux/Android alsa codec音频路由dapm的配置详解

ALSA声卡驱动中的DAPM详解之一:kcontrol DAPM是Dynamic Audio Power Management的缩写,直译过来就是动态音频电源管理的意思,DAPM是为了使基于Linux的移动设备上的音频子系统,在任何时候都工作在最小功耗状态下。DAPM对用户空间的应用程序来说是透明的,所有与电源相关的开关都在ASoc core中完成。用户空间的应用程序无需对代码做出修改,

lp542718520的专栏 4667

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: ALSA之PCM分析
下一篇: 音频采样概念
evilcode
博客等级 码龄20年 307粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值