##音频device setStreamVolumeIndex根据device和流类型来设置,换言之,每种设备的每种流类型的音量是分开的,可以不一样。比如蓝牙耳机的Music音量可以是15,而Speaker的音量可以是5。那么问题来了,上层根本没有 这些逻辑?这个是怎么实现的。我们先来看,怎么获取到的设备!
native的getDevicesForStream函数如下:
最后都是通过AudioPolicy来决定的。
mAudioPolicyManagers是AudioPolicy的核心,AudioPolicyService起来的时候就创建了mAudioPolicyManager以及相应的一些线程。
mAudioPolicyManager通过createAudioPolicyManager函数创建的,AOSP的createAudioPolicyManager如下:
Vendor也可以自己实现自己的AudioPolicyManager,比如高通的:
我们继续来看getDevicesForStream函数:
##音频流到音频策略的映射 在native会将流转换为策略,根据策略选择设备等。
mEngine是在AudioPolicyManager的构造函数中生成的。
Engine可以可以配置的,根据 USE_CONFIGURABLE_AUDIO_POLICY定义,我们这里分析Default的enginedefault。
native声音流的定义:
策略定义:
相互将的对应关系如下:
流代号
流类型
Strategy映射
描述
STREAM_VOICE_CALL
STRATEGY_PHONE
AUDIO_STREAM_BLUETOOTH_SCO
STRATEGY_PHONE
AUDIO_STREAM_RING
STRATEGY_SONIFICATION
铃声
AUDIO_STREAM_ALARM
STRATEGY_SONIFICATION
闹钟
AUDIO_STREAM_NOTIFICATION
STRATEGY_SONIFICATION_RESPECTFUL
通知音
AUDIO_STREAM_DTMF
STRATEGY_DTMF
DTMF音
AUDIO_STREAM_SYSTEM
STRATEGY_MEDIA
系统音
AUDIO_STREAM_MUSIC
STRATEGY_MEDIA
媒体音
AUDIO_STREAM_ENFORCED_AUDIBLE
STRATEGY_ENFORCED_AUDIBLE
强制为Speaker出声
AUDIO_STREAM_TTS
STRATEGY_TRANSMITTED_THROUGH_SPEAKER
TTS 播报
10
AUDIO_STREAM_ACCESSIBILITY
STRATEGY_ACCESSIBILITY
辅助音
11
AUDIO_STREAM_REROUTING
STRATEGY_REROUTING
动态输出混音
AUDIO_STREAM_ENFORCED_AUDIBLE 这个流是不让用户静音的,强制为Speaker出声。比如拍照音,拍照音是必须Speaker出声的,防偷拍。
回到getDevicesForStream函数~
最终通过mEngine来实现的。STRATEGY_TRANSMITTED_THROUGH_SPEAKER
主要实现在 getDeviceForStrategyInt 函数中。getDeviceForStrategyInt函数非常长。这里就不贴全部的代码。起主要有以下几个方面决定:
我们来看看STRATEGY_SONIFICATION_RESPECTFUL,AUDIO_STREAM_NOTIFICATION场景的:
具体情况,具体看,比较复杂的。Anyway,到此,我们的device算是获取到了。
音量都是通过AudioSystem的setStreamVolumeIndex函数,设置到native的:
中间的过程省略,我们直接AudioPolicyManager的实现:
Volume按照device保存到mIndexCur中:
如果当前没有任何流处在active,音量设置时是没有生效的,这根据前面的applyVolume来决定。如果这个时候没有生效,后续在startSource时,也会checkAndSetVolume。
Db值通过mVolumeCurves->volIndexToDb,进行转换,转换后,再根据实际的场景进行调整。
我们先来看看Volume::getDeviceCategory,Audio这边就死麻烦,各种概念。device_category将设备进行分类。
volIndexToDb函数 如下:
安装流和设备分类来区分,比如,耳机的通话音量:
除了直接定义值,还可以引用其他的,比如耳机的媒体音量,DEFAULT_MEDIA_VOLUME_CURVE。
DEFAULT_MEDIA_VOLUME_CURVE在另外已给表中:
所以,我们调节音量时,根据音量的index,来转为对应的db,最终生效的是db。很多用户反馈上面音量调的很大了,但是实际的声音还是小,可能就调调整一下这里的db配置了。
计算后的Db值通过setVolume函数设置给output
函数如下:
每个output都是安装流类型来保存的mCurVolume[stream]
AudioPolicyService通过AudioCommandThread,传给AudioManager
对应的命令:SET_VOLUME
最终还是通过AudioSystem的接口来完成:
AudioFlinger的setStreamVolume函数如下:
VolumeInterface 主要用以设置音量,PlaybackThread和MmapPlaybackThread实现VolumeInterface具体的接口:
我们来看看PlaybackThread的setStreamVolume函数:
PlaybackThread将音量值保存下来了,并设置到音效中。
OK,到此,都全是设置音量的过程,那么是在什么地方生效的呢?
对于MixerThread来说,是在这里生效的,音量值最终会被混音,设置到数据流中。
我们可以通过adb命令,将thread的各个流的音量都dump出来:
技术背景好多开发者会有这样的疑惑,既然你们有了实时静音接口了,为什么RTSP|RTMP播放器还要设计实时音量调节?实际上,我们知道,比如在一些工业场所、建筑工地等嘈杂的环境中,监控设备周围可能存在大量的噪音干扰。通过调节监控平台播放器的音量,可以提高监控音频的可听性,确保工作人员能够清晰地听到重要的声音信息,如设备运行的异常声音、人员的呼喊声等。例如,在工厂车间中,机器运转的轰鸣声可能会掩盖监控中
# 安卓蓝牙耳机调节音量的实现流程在这篇文章中,我们将为刚入行的小白开发者解释如何在安卓平台上实现蓝牙耳机调节音量的功能。我们将提供一个清晰的步骤流程、所需的代码示例和每段代码的详细解释。## 整体流程以下是实现蓝牙耳机调节音量的步骤概览:| 步骤 | 描述 || ------- | ---------------------
# Android蓝牙音量调节流程## 1. 引言蓝牙音频设备在日常生活中变得越来越普及,比如蓝牙耳机、音响等。为了提高用户体验,Android系统提供了一套蓝牙音量调节的API。本文将介绍Android蓝牙音量调节的流程,并附带代码示例。---## 2. 系统架构在Android中,音量的管理通常要通过AudioManager类进行。蓝牙音量调节流程包含以下几个关键步骤:-
# Android 蓝牙音量调节整个流程## 一、流程概述蓝牙音量调节的整个流程可以分为以下几个步骤:| 步骤 | 描述 ||------|-----------------------------|| 1 | 初始化蓝牙适配器 || 2 | 配对已连接的蓝牙设备 || 3 |
前言这一切都是源于《DIY LDAC蓝牙接收器》系列文章。蓝牙接收器的DIY当时因为材料未准备好等各种原因搁置了。后来想了想,先做一个音频输出设备吧,反正光有接收器也是不行的,总要有地方输出吧。 于是乎又觉得一两个喇叭声场不够大,喇叭多了组家庭影院又嫌多个分离的音箱难搞,也不好看,接线也复杂。很久以前就对回音壁情有独钟,虽然音质肯定不如一主多从式的多声道家庭影院好,但家庭听听也是绰绰有余了。结合实
无线蓝牙模块在汽车DSP的应用DSP为数字信号处理器,广义是指数字信号处理运算的微处理器,汽车DSP在此基础上增加了电子分频功能实现主动分频,并增加了7850的功放,变成了一台带数字信号处理电子分频的信号。狭义上DSP更多运用在原车主机,CD,安卓导航上,所有带音量增减,高低音调节的主机都是通过DSP芯片实现。也就是说目前已知的99%的汽车主机都带有DSP芯片。市面上的DSP的工作采取三种方式,原
Android手机连接蓝牙模块,并与蓝牙模块之间进行实时通讯。那么Android 手机端必须实现,蓝牙开关、扫描BLE模块、请求与BLE模块连接以及与BLE模块之间的数据互换。至于其他的包括检查手机是否支持蓝牙4.0之类的也是应该考虑到的。 那么就从检查手机是否支持蓝牙4.0开始吧。if(!getPackageManager().hasSystemFeature(PackageManager.F
无线蓝牙耳机进入我们生活之后,不得不感叹真的很实用!可以彻底解放双手,无线使用更加自由。不过市场上各种品牌的无线蓝牙耳机真不少,对于小编这样的打工人,一些动辄上千的外国品牌蓝牙耳机真心下不去手,当然,这并不是人家品牌的定位问题,这是我的问题,毕竟贫穷限制了我的消费,所以只能转战国内品牌中寻找,好在国产蓝牙耳机在经历不断更迭,发展之后也有了不少的优秀产品。这些年,我也体验过不少的国产蓝牙耳机,整体还
近段时间,真无线蓝牙耳机炒得火热,多半是苹果AirPods带起来的一阵风。苹果AirPods虽然各方面都不错但是价格不太适合上班族和学生党,今天给大家推荐一款性价比高,物美价廉的苹果AirPods评价替代品漫步者lollipods。 漫步者lollipods包装类似于苹果AirPods,我入手的是漫步者lollipods白色款,漫步者lollipods还有黑色的。
耳机,作为我们生活中必不可少的一样数码产品,可以说已经成为了标配。放眼,无论是上班的地铁和公交中,还是出门旅游和锻炼中,耳机一直伴随我们左右。随着技术的不断进步,真正的无线蓝牙耳机开始普及起来。而这种耳机的携带方便,完全摆脱了线材的束缚,真正的做到了随心所欲。再说说今天要分享给Lollipods真无线蓝牙耳机,这款耳机来自漫步者。作为老牌音响制造商,这个品牌已经有20多年的历史了,主
漫步者LolliPods真无线耳机简测体验测评(佩戴|音质|中高频|延迟)做工方面我觉得一般般,塑料拼接毛边还是有的,不过不仔细看也不明显质感差点,这个价位来说讲究这个过于苛刻了佩戴比airpods大一点?没啥好讲的,还算舒适,看图音质&小小对比本人的蓝牙耳机只有一个旧的小米,带aptx蓝牙4.2蓝牙也就只能对比小米了。耳塞我在讲调音的时候简单带过,半桶水,肉耳听,不喜勿喷lollipod
最近在做Android Audio方面的工作,有需求是在调节Volume_Up_Key & Volume_Down_key时,Spearker or Headset每音阶的衰减变为3db左右。所以利用Source Insight分析Android源码中音量控制的流程,如有错误,欢迎指正,谢谢! 以下是调节音量的流程: Step_1.首先在调节机台Volume_Up_Key &a
乐视2高通|MIUI10|安卓6.0|最终完美版|极速流畅|稳定实用|摇晃手势|DDK设置|养老专用更新编译工具ROM体积更小相机切换不卡因为Magisk的关系开机会有系统提示完全不影响精简桌面数据库,去掉残留图标适度精简系统应用APK、删除无用SO库运行文件提高全局触摸响应提高屏幕滑动灵敏度优化桌面响应速度已开启内核对支持init.d优化内存控制提高稳定性优化待机最高频率,降低待机功耗wifi优
TWS真无线蓝牙耳机因为拥有时尚小巧的外观,简单方便的操控,续航持久的播放能力等优点受到用户认可。JBL最新推出的JBL TUNE125 TWS真无线蓝牙耳机就是一款音质出色,续航时间长达8h+24h,支持蓝牙5.0,采用Tpye-C充电接口的精品,各方面都能满足音乐爱好者的需求。我也借着首发的机会,抢先入手,感受这款耳机的精彩。JBL TUNE125 TWS的包装采用JBL经典的简约设计风格,白
蓝牙绝对音量相关基础知识1. 什么是绝对音量Android 蓝牙部分的官方文档有如下描述:Androud Bluetooth Service在 Android 6.0 及更高版本中,Android 蓝牙堆栈允许音频源设置绝对音量,以便用户准确控制音频音量。音频源设备会将音量信息和未衰减的音频发送到接收器。然后,接收器会根据音量信息放大音频,以便用户听到准确的播放音量。 音频源设备还可以注册接收音量
一、MyBatis 简介与工作原理1. 基本情况:ORM 框架MyBatis 是一个优秀的 半自动 ORM(对象关系映射)框架。它将 Java 对象与数据库记录进行映射,支持自定义 SQL、存储过程以及高级映射。相比于 Hibernate 的全自动 ORM,MyBatis 更加灵活,允许开发者直接编 ...
NGINX WEBUI是一款基于Web的图形化Nginx配置管理工具,旨在简化Nginx服务器的配置与管理流程。通过直观的网页界面,用户可快速配置反向代理、负载均衡、SSL证书、TCP转发等常用Nginx功能,无需手动编写复杂的配置文件。该工具集成了证书自动申请与续签、配置文件备份与回滚、远程服务器... ...
TCP四次挥手机制详解:优雅关闭连接的底层逻辑 摘要: TCP协议通过四次挥手机制实现连接的可靠关闭,确保全双工通信的双方都能安全终止数据传输。流程分为:1)主动方发送FIN报文;2)被动方确认ACK;3)被动方发送FIN报文;4)主动方发送最终ACK。该设计通过四次交互确保双向数据通道独立关闭,避免数据丢失。相比三次握手,四次挥手更注重连接终止的完整性,体现了TCP"可靠传输"的核心思想。理解这一机制有助于排查网络连接问题,深入掌握TCP协议设计精髓。
本文介绍了云计算与服务器基础知识。云计算部分包括三种服务模型(IaaS、PaaS、SaaS)和三种部署模式(公有云、私有云、混合云),重点阐述了各自的特点和适用场景。服务器部分详细说明了服务器架构、硬件组成、操作系统选择、RAID配置及系统安装流程,并提供了服务器管理工具和基础命令。全文系统性地梳理了云计算和服务器领域的关键概念、技术特点及实践要点,为初学者提供了清晰的学习框架。
数据结构是计算机存储、组织数据的方式,是构建高效算法的基石。本文将深入探讨几种最经典、最基础的数据结构:线性结构的。假设有字符A(频率5)、B(频率9)、C(频率12)、D(频率13)、E(频率16)、F(频率45)。哈夫曼树(最优二叉树)是一种带权路径长度最短的二叉树,在数据压缩领域有巨大贡献。数据结构,用于表示具有层次关系的数据。一个典型的例子是文件系统。线性结构的特点是数据元素之间存在一对一的线性关系。