码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 三 android tinyalsa 理解


    目录

    tinyalsa 简述:

    作用

    实际操作:

    1. 查看设备

    2. tinypcminfo

    2. tinymix

    3. tinyplay​

    4. tinycap​



    关于AudioPolicy 中audio_policy_configuration.xml定义的hal设备,hal层和tinyalsa、音频设备驱动的关系。
    经常会看到分析android 音频框架的图解,会将hal层和tinyalsa进行关联,似乎是音频的hal会调用tinyalsa将pcm数据交给alsa然后再到内核驱动,给到硬件播放。 所以有一个疑问,用tinyalsa 工具是不是就可以完全调试到所有的音频设备,然而实际操作起来却并不是这样。  音频hal层并不一定使用alsa,甚至可能都不会使用linux 内核里面的alsa音频驱动框架。


    tinyalsa 简述:

    ALSA 是linux上的音频框架,音频设备按照此框架实现自己的驱动 alsa-driver,在应用层即可以通过统一的alsa-lib 来读写控制音频设备。  tinyalsa,  就是简化版的alsa-lib ,用于调试查看 linux内核里面alsa 驱动下的音频设备,其原理,即读写 dev/snd/pcmxx 设备节点,ioctl操作。
    https://github.com/tinyalsa/tinyalsa/
    tinyalsa - OpenGrok cross reference for /external/tinyalsa/
    并且基于libtinyalsa  提供了四个小工具,tinypcminfo  tinymix  tinycap tinyplay. 

    作用

    这四个工具,只是用于调试查看 linux内核里面alsa 驱动下的音频设备
    现在的android 音频hal,完全可以不走 内核的alsa驱动,只是一个应用层音频库也可以
    这取决于 hal层的具体实现,如果不经过alsa,那么这个tinyalsa也就没法调试到这些音频设备,比如 aosp 上 audio_remote_submix (一个音频的远程播放hal设备,一般用来 mircast投屏的时候把本设备的音频输出到投屏客户端 audio_remote_submix - OpenGrok cross reference for /hardware/libhardware/modules/audio_remote_submix/), 这个就不需要和alsa有关系,就像virtualDisplay 一样。 而hal,基本上是soc提供的so库比如高通,没有开源。 

    实际操作:

    以下在google pixel3  ,刷机成 aosp_blueline-userdebug 版本,操作结果。

    1. 查看设备

    #cat /proc/asound/cards

    设备节点:

    #ls /dev/snd/

     pcmC0D0c  表示card 0 ,device 0, capture (只有一个capture节点)
     pcmC0D0p  表示card 0, device 0, play(只有一个play节点)
     pcmC0D11p 表示card 0, device 1, 1 paly(第1paly节点)

    2. tinypcminfo

     tinypcminfo.c  
    原理是读取 dev/snd/pcmCxDxx 设备节点,ioctol 获取信息。

    "/dev/snd/pcmC%uD%u%c", card, device,flags & PCM_IN ? 'c' : 'p'
    pcm.c - OpenGrok cross reference for /external/tinyalsa/pcm.c
    pcm.c - OpenGrok cross reference for /external/tinyalsa_new/src/pcm.c

    2. tinymix

    直接使用tinymix 不加参数,会列举出所有的支持的控制命令
    然后可以使用 tinymix + 命令(int数),详细列举当前命令的用法

    具体支持什么命令控制,是由具体设备完提供的,比如 google手机,这里就列出来2000多个控制,但就是没有 Path,切换通道的控制。

     mixer.c - OpenGrok cross reference for /external/tinyalsa/mixer.c (android 13这里不一样,本文分析以Android11为准)
    原理:通过设备控制节点, /dev/snd/controlCx
    "/dev/snd/controlC%u", card
    ioctl
     

    3. tinyplay

     同tinypcminfo 一样的设备节点,写数据。播放.wav格式文件,wav格式文件是对pcm数据的一个简单包装,它在头部位置存储有pcm数据的通道采样率采样深度等信息。可以很方便解析出来,后续的pcm数据直接读取也不需要解码。(需要先用tinymix 配置好设备,具体tinymix 设备支持哪些操作,就得看具体实现了,没标准)

    4. tinycap

     同tinyplay,  这次是读设备节点,读到pcm数据存储到.wav文件,也不需要编码。

  • 相关阅读:
    wxpython 的sizer布局
    【PostgreSQL】性能飞跃:PostgreSQL性能调优与优化策略
    [hadoop全分布部署]虚拟机Hadoop集群配置/etc/hosts、配置无密码登录(SSH)
    PHP各种老版本下载方式
    机器学习(8)——特征工程(2)
    用JavaScript撸一个静态链表
    基于Java+SpringBoot+Thymeleaf+Mysql在线外卖点餐系统设计与实现
    Rust 第三方库创建和导入(cargo --lib)
    上周热点回顾(6.12-6.18)
    大学四年如何有效的使用『牛客』平台
  • 原文地址:https://blog.csdn.net/u012459903/article/details/126849343
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号