1、通过起流、停流,不确定stream应该是0,还是3,判断不出来是哪部分日志。
AudioFlinger: pid(30768)
AudioFlinger: pid(3375)
可以查一下,这两个pid都是什么应用在播,:com.hihonor.soundrecorder就是收音机在播放。
AS.AudioService: Voice call active pkgName:com.hihonor.soundrecorder 2、然后根据流类型 3或者0 把这里的stream改一下再搜 InputEvent: 25|InputEvent: 24|startoutput()|stopoutput()|factor is|adjuststreamvolume|volume_changed_action stream=0|checkandsetvolume volumesource 6|audioservice: setstreamvolume|audioflinger: pid|AudioFlinger: AudioFlinger: setStreamVolume stream=行 33782: 09-24 19:42:22.967 3375 3375 I InputEvent: 25-0 行 33814: 09-24 19:42:22.971 3375 3375 I InputEvent: 25-1 行 33840: 09-24 19:42:22.973 3687 3687 I AS.AudioService: adjustStreamVolume() stream=0, dir=-1, flags=4113, caller=android 行 33878: 09-24 19:42:22.975 3687 6987 D AS.AudioService: setStreamVolumeIndexAS(0, 15, 128) 行 33888: 09-24 19:42:22.976 1883 1993 I APM_AudioPolicyManager: checkAndSetVolume volumeSource 13, index 15, device 0x80, volumeDb 0.000000, output 13 行 33915: 09-24 19:42:22.978 3687 3687 I AS.AudioService: adjustStreamVolume() stream=0, dir=0, flags=4112, caller=android 行 33957: 09-24 19:42:22.981 7175 9070 I vol.VolumeDialogControl: onReceive VOLUME_CHANGED_ACTION stream=0 level=3 oldLevel=4
index 15 --- level 3 : 数值不相等,说明调节的音量和播放的音量不一致
注:如果是通话流 蓝牙耳机 adjuststreamvolume这个的入参必须要是stream = 6,才能调节成功
if(isInCommunication() || mAudioSystem.isStreamActive(AudioManager.STREAM_VOICE_CALL, 0)){ if (mDeviceBroker.isBluetoothScoActive()){ return AudioSystem.STREAM_BLUETOOTH_SCO; }这里会赋值成最大音量 然后没变化,绝对音量 除媒体流外 其他的都是最大发给底层
}
AudioService.java void applyDeviceVolume_syncVSS(int device) { int index; /* <DTS2019010904102 chengzeyuan WX394030 20190109 begin */ boolean isTurnOff = false; String str = null; if (mVSSCust != null) { isTurnOff = mVSSCust.isTurnOffAllSound(); } if (isFullyMuted()|| isTurnOff) { index = 0; str = "fully muted"; } else if (isAbsoluteVolumeDevice(device) || isA2dpAbsoluteVolumeDevice(device) || AudioSystem.isLeAudioDeviceType(device)) { // do not change the volume logic for dynamic abs behavior devices like HDMI if (absVolumeIndexFix() && isAbsoluteVolumeDevice(device)) { index = getAbsoluteVolumeIndex((mIndexMax + 5) / 10); } else { index = getAbsoluteVolumeIndex((getIndex(device) + 5) / 10); } str = "AbsVolSupported " + mAvrcpAbsVolSupported + " index " + index; }
3、个别耳机有绝对音量,【蓝牙设备音量与手机同步】,重新打开蓝牙开关或重新连接蓝牙设备后生效
这两行日志是,音量设置 是否开启的。
4、结论:
那可能是播的是媒体流 要在连接蓝牙前 先选听筒 1 先解释成规格,复现调节不了后让测试把这个开关关了,再关开蓝牙,就能调节成功了,历史一直这样,也没舆情 2 如果测试不接受是规格,那就拉录音机的看看,让他们在连接蓝牙的时候用媒体,或者建scohttps://dts.ipd.hihonor.com/DTSPortal/ticket/DTS2022072031850 5、附加其他相似问题的处理:
绝对音量蓝牙耳机在位,调节媒体音可调节屏幕朗读声音的大小,不会出现声音过小怎么都调不大的情况,但是单独调节无障碍音量条没有作用,会给用户带来疑惑。
该问题为谷歌原生特性,绝对音量蓝牙耳机在位时,耳机音量由媒体流音量等级决定,框架将数据最大发给蓝牙,所有流的音量由媒体音量条也就是耳机音量统一调节。
根因分析:
在蓝牙设置中,绝对音量的描述为“蓝牙设备音量与手机同步”,这个特性是为了解决用户使用过程中一般不会关注耳机音量的问题,具体在代码逻辑中,会将媒体流的音量等级发给蓝牙,蓝牙获取到媒体流的音量等级,按比例做运算,计算得出耳机的音量,框架侧不做音量处理,最大(音量等级15)发给蓝牙,蓝牙通过调节耳机音量的大小控制听感音量的大小。
现在在代码里面,绝对音量蓝牙耳机在位时,所有流类型的音量都不会做处理,最大发给蓝牙,如下:
else if (isAbsoluteVolumeDevice(device)
|| isA2dpAbsoluteVolumeDevice(device) || AudioSystem.isLeAudioDeviceType(device)) { // do not change the volume logic for dynamic abs behavior devices like HDMI if (absVolumeIndexFix() && isAbsoluteVolumeDevice(device)) { index = getAbsoluteVolumeIndex((mIndexMax + 5) / 10); } else { index = getAbsoluteVolumeIndex((getIndex(device) + 5) / 10); } str = "AbsVolSupported " + mAvrcpAbsVolSupported + " index " + index; }
if (!isTv || (isTv && mStreamType == AudioSystem.STREAM_MUSIC)) { setStreamVolumeIndex(index, device); }
也就是说,即使设置通知音等级为5,在Java层计算的时候也会赋值为15,发给native层,得出float型的音量值(最大为1)作为参数参与混音等逻辑,以最大数据发给蓝牙,由耳机音量(媒体音量)控制听感音量的大小。所以,在上层把通知音等级调节为7、8、9,也会赋值为15参与运算,表现出来的现象就是“通知音无法单独调节”。
需要说明一点,铃声、闹钟这些是双响场景,走复制流,在native层把扬声器数据复制一份作为发给蓝牙的PCM的数据,所以耳机音量(媒体音量)固定的情况下,调节铃声、闹钟音量实际上调节的是扬声器下的音量,耳机里面的听感音量是会有变化的。
这个地方框架可以做修改,增加流类型限制,只在媒体流的时候赋值为15,其他情况下是多少音量等级就发给native层多少。这个修改影响很大,静态动态都会影响,需要遍历蓝牙在位音量相关的测试场景,尤其需要测试各种设备下调节音量后再去切换设备,音量有没有正常被保存,重启后音量初始化是不是正常的等。
即便做了这个修改,无障碍领域的测试还是不满意效果,无障碍音量15,媒体音音量为1的时候声音还是很小,因为绝对音量的意思是“蓝牙设备音量与手机同步”,此时蓝牙耳机的耳机音量是由媒体流的音量等级决定的。
听感音量 = Audio音量 * 耳机音量。
1 * 0.1 = 0.1,Audio音量的最大值为1。
总结,框架可以做修改,无障碍音量条的音量大小变化会在最终听感音量中体现,但是听感音量的最大值会受到耳机音量也就是绝对音量下媒体音音量等级的限制。
这个事情,市面上所有安卓鸿蒙手机打开绝对音量开关后现象都是一致的,因为这个现象就是特性本身。
竞品对比:
鸿蒙手机与荣耀手机现象一致,绝对音量蓝牙耳机在位,通知音、无障碍音量完全由媒体音控制;
Pixel,小米,oppo手机可单独调节通知音、无障碍音量,但是听感音量受媒体音量(耳机音量)的制约,媒体音量等级决定了其他流听感音量的最大值;
鸿蒙手机绝对音量开关默认关闭,oppo绝对音量开关默认打开且开关在开发者选项里面,荣耀、Pixel、小米手机绝对音量开关默认打开且在蓝牙设置中。解决方案:
1:问题单挂起,不做修改,保持现有规格,绝对音量蓝牙耳机在位,所有流的音量由媒体流音量条统一控制;
2:修改为只有媒体流走绝对音量,调节其他流的音量会起到影响最终听感音量的作用,保留听感音量的最大值会受媒体音量大小影响的绝对音量特性。标签:耳机,媒体,调节,蓝牙,听筒,听感,音量 From: https://www.cnblogs.com/mengyaoli/p/18432152