Android audio 音量曲线

index 转化为 db的流程

首先android 根据不同的流类型定义不同的曲线,曲线文件存放在/vendor/etc/audio_policy_volumes.xml

或者audio_policy_volumes_drc.xml下面 要看audio_policy_configuration.xml所引用的xml。

复制代码
    <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_SPEAKER">
        <point>1,-3400</point>
        <point>33,-2400</point>
        <point>66,-1500</point>
        <point>100,-600</point>
    </volume>

曲线的定义如上。

是定义了几个区间。point的两个值分别为index 和db。 定义的index范围是1到100, 而db的范围为-3400 到-600.

外部的index范围不一定是1,100 比如外部index范围为0,39.

  1. ui的index寻找在曲线index位置

    那么第一步先将传递进去的index,转换为1,100等比例的位置。 假设传递是x, 要求等比例的y。

    x/(39 -0) = y / (100 -1)。 假设传递的18 ,求出来y = 46.

  2. 寻找曲线index对应的分贝。

首先46是处在【33,66】的这个区间内,这个区间对应的db区间是【-2400,-1500】。

先求这个区间一个index对应多少db 将总的index(66 -33)除于总的db(-1500 - (-2400)) 为单位index对应的db。

那46对应的有多少index,46对应为 46 -33。 将这两者相乘就是46对应在这个区间内的db值, 加上起始的-2400就是最终的db。

db就在这个区间里面算。 所求的db = -2400 + (((- 1500 - (-2400))/(66 -33) x(46 -33)) = 2045.

也等比例计算的一个方式。 相对于一个个区间是独立。起始点是最靠近的上一个区间的index,然后计算区间内一个index对应多少db。

传递进去的index相对于起始index的值。

  1. db转为amplit

    复制代码
     //exp是以e为底的指数函数,常数 e 的值约为 2.718282;是由分贝算式推导过来的db = 20* ln(P1/P0);P0是基本功率
     aml =  exp( db * 0.115129f); // exp( dB * ln(10) / 20 )
  2. 相应的代码位置

    status_t AudioPolicyManager::checkAndSetVolume(IVolumeCurves &curves,
    VolumeSource volumeSource,
    int index,
    const sp<AudioOutputDescriptor>& outputDesc,
    DeviceTypeSet deviceTypes,
    int delayMs,
    bool force)

    float volumeDb = computeVolume(curves, volumeSource, index, deviceTypes);

    float AudioPolicyManager::computeVolume(IVolumeCurves &curves,
    VolumeSource volumeSource,
    int index,
    const DeviceTypeSet& deviceTypes)
    {
    float volumeDb = curves.volIndexToDb(Volume::getDeviceCategory(deviceTypes), index);

    }

    复制代码
    virtual float volIndexToDb(device_category deviceCat, int indexInUi) const
     {
         sp<VolumeCurve> vc = getCurvesFor(deviceCat);
         if (vc != 0) {
             return vc->volIndexToDb(indexInUi, mIndexMin, mIndexMax);
         } else {
             ALOGE("Invalid device category %d for Volume Curve", deviceCat);
             return 0.0f;
         }
     }
相关推荐
三少爷的鞋17 小时前
Repository 方法设计:suspend 与 Flow 的决选择指南(以朋友圈为例)
android
阿里云云原生18 小时前
Android App 崩溃排查指南:阿里云 RUM 如何让你快速从告警到定位根因?
android·java
cmdch201720 小时前
手持机安卓新增推送按钮功能
android
攻城狮201520 小时前
【rk3528/rk3518 android14 kernel-6.10 emcp sdk】
android
何妨呀~20 小时前
mysql 8服务器实验
android·mysql·adb
QuantumLeap丶21 小时前
《Flutter全栈开发实战指南:从零到高级》- 25 -性能优化
android·flutter·ios
木易 士心1 天前
MVC、MVP 与 MVVM:Android 架构演进之路
android·架构·mvc
百锦再1 天前
国产数据库的平替亮点——关系型数据库架构适配
android·java·前端·数据库·sql·算法·数据库架构
走在路上的菜鸟1 天前
Android学Dart学习笔记第十三节 注解
android·笔记·学习·flutter
介一安全1 天前
【Frida Android】实战篇15:Frida检测与绕过——基于/proc/self/maps的攻防实战
android·网络安全·逆向·安全性测试·frida