怎样在蓝牙中audio.conf文件怎么打开中的节在哪

audio_policy.conf文件分析
不同的Android产品在音频的设计上通常是存在差异的,而这些差异可以同过Audio的配置文件audio_policy.conf来获得。在Android系统中音频配置文件存放路径有两处,存放地址可以从AudioPolicyManagerBase.cpp文件中知道:
#define AUDIO_POLICY_VENDOR_CONFIG_FILE
"/vendor/etc/audio_policy.conf"
#define AUDIO_POLICY_CONFIG_FILE
"/system/etc/audio_policy.conf"
  在AudioPolicyManager.cpp文件中可以知道系统会首先加载vendor/etc目录下的configure文件,再加载system/etc目录下的configure文件。若这两者加载都发生错误的话,系统会加载default配置文件,并命名为primary module,从这可以看出,音频系统中一定必须存在的module就是primary了。
if (loadAudioPolicyConfig(AUDIO_POLICY_VENDOR_CONFIG_FILE) != NO_ERROR) {
if (loadAudioPolicyConfig(AUDIO_POLICY_CONFIG_FILE) != NO_ERROR) {
ALOGE("could not load audio policy configuration file, setting defaults");
defaultAudioPolicyConfig();
  【摘录audio_policy.conf】 
1 # Global configuration section: lists input and output devices always present on the device
2 # as well as the output device selected by default.
3 # Devices are designated by a string that corresponds to the enum in audio.h
5 global_configuration {
attached_output_devices AUDIO_DEVICE_OUT_SPEAKER
default_output_device AUDIO_DEVICE_OUT_SPEAKER
attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_VOICE_CALL|AUDIO_DEVICE_IN_REMOTE_SUBMIX
custom_properties {
voice_volume_applied_after_mixing_in_call true
voice_volume_applied_after_mixing_in_communication false
in_call_music_attenuation_dB 6
16 # audio hardware module section: contains descriptors for all audio hw modules present on the
17 # device. Each hw module node is named after the corresponding hw module library base name.
18 # For instance, "primary" corresponds to audio.primary.&device&.so.
19 # The "primary" module is mandatory and must include at least one output with
20 # AUDIO_OUTPUT_FLAG_PRIMARY flag.
21 # Each module descriptor contains one or more output profile descriptors and zero or more
22 # input profile descriptors. Each profile lists all the parameters supported by a given output
23 # or input stream category.
24 # The "channel_masks", "formats", "devices" and "flags" are specified using strings corresponding
25 # to enums in audio.h and audio_policy.h. They are concatenated by use of "|" without space or "\n".
27 audio_hw_modules {
sampling_rates 48000
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO
flags AUDIO_OUTPUT_FLAG_PRIMARY
deep_buffer {
sampling_rates 48000
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE
flags AUDIO_OUTPUT_FLAG_DEEP_BUFFER
sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000
channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_VOICE_CALL
sampling_rates 44100
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_ALL_A2DP
hdmi_stereo {
sampling_rates 48000
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_AUX_DIGITAL
hdmi_multi {
sampling_rates 32000|44100|48000|88200|96000
# channel_masks AUDIO_CHANNEL_OUT_5POINT1
channel_masks dynamic
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_AUX_DIGITAL
flags AUDIO_OUTPUT_FLAG_DIRECT
r_submix {
sampling_rates 48000
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_REMOTE_SUBMIX
sampling_rates 48000
channel_masks AUDIO_CHANNEL_IN_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_IN_REMOTE_SUBMIX
usb_dgtl {
sampling_rates 44100|48000
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET
usb_accessory {
sampling_rates 44100
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_USB_ACCESSORY
usb_device {
sampling_rates 44100
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_USB_DEVICE
  从audio_policy.conf文件中可以发现,系统包含了primary、a2dp、usb等音频接口,对应着系统中的audio.&primary/a2dp/usb&.&device&.so。每个音频接口中又包含了若干个outputs & inputs,并且每个output or input又包含了若干个devices,且还有采样频率,声道数等信息。这些devices信息、采样频率信息
& 声道信息等都会保存在各自module的IOProfile中。按上文中audio_policy.conf配置文件所描述,系统最后会生成6个modules(eg.primary,a2dp,hdmi,r_submix,hs_usb & usb)以及7个outputs。以AUDIO_DEVICE_OUT_SPEAKER为例,该device会定义在primary模块中outputs所属的IOProfile1中,其它设备依次类推。
  根据audio_policy.conf文件可以简化Audio module的架构,如下图1所示:
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!注册花火通行证,没有账号
智能硬件分类
可穿戴设备
  如果人们稍微知道一些音频方面的知识的话,就一定会知道一些蓝牙耳机音质差的原因。很多人认为音质差会和蓝牙传输速度有关,并且蓝牙的升级以及音质方面也存在必然的额联系但是事情的真相真的是这样的吗?那么导致蓝牙耳机音质差的原因又有哪些呢?  蓝牙传输过程中的有损压缩  其实造成蓝牙耳机音质不好的原因很简单,主要是因为在传输过程中编码对音频信号进行了压缩。而有损编码在压缩时为了能够达到较大的压缩比以便实现更小的数据量,会舍弃音频信号当中原有的一些信息。而压缩后的信息不足,从而在解压缩还原的过程当中产生了失真。  有损音频的失真是这么一回事  我想很多人都知道过度压缩的图片会产生明显的噪点或是色块,而这两个现象就是有损压缩带来的失真。音频的有损压缩也是如此,在还原时同样会引入失真,只不过不是非常直观。很多人会比较难以区分有损和、无损音乐之间的差别,所以即使没有感受出蓝牙传输所带来的音质损失那也是非常正常的一件事。  如果想分辨出有损和无损之间的明显区别,我建议可以将一首无损音乐压缩成小码率的MP3(最好低于96kbps)。这样对比之后能够明显发现有损的mp3版本会丢失大量的细节以及高频。同时听起来的密度感也会下降,你会感觉有损音频有种非常松散的听感。但随着有损音频码率(文件体积)的上升,区别会变得越来越小,甚至是难以区分,远不如图像和视频来的直观。  为什么要使用有损传输  在早期因为蓝牙带宽有限,所以不得不使用有损压缩,将音频码率变小后再进行传输。而时至今日,蓝牙已经经过了好几代的发展,蓝牙4.0极限传输可达24Mbps。放在现在来看,无损音频对带宽的需求并不算苛刻,CD规格的无损音频只需1.4Mbps带宽即可实现,远低于极限速度,但为何仍旧无法做到无损传输?  目前蓝牙传输时的音质可能是受限于两个方面。首先是因为协议,蓝牙传输音频主要依赖于A2DP( Advanced Audio Distribution
Profile)协议,A2DP规定了音频通过蓝牙传输时必须满足的条件。如果未采用A2DP协议进行传输,会导致接收方无法识别发送方所发出的音频数据。  该协议在蓝牙标准的早期确立,未考虑到现在的情况,对传输时的数据量进行了限制,使得音频数据只能达到约328kbps。所以即使新的蓝牙标准能带来更高的传输速度,但这些协议并没有更新,使用时依旧会受限于它们所限定的速度。  其次,蓝牙也是基于2.4GHz频段,而WiFi、无线键鼠等均会使用到该频段
。传输数据较大时会产生一些干扰,导致声音断续,尤其是音频设备会对用户体验产生明显的影响。  音质其实正在逐渐提升  即使蓝牙音频传输时的数据量受限于协议,通过提升传输编码的压缩质量却可以提升音质。而现在非常热门的aptX编码就是通过这一方式实现的提升。简单来讲,就是在同码率的情况下可以带来更好的压缩效果,所以即使受限于协议,仍旧能够提升声音质量。aptX虽然提高了音质,但并没有做到无损,和无损音频的音质仍有差距。  目前能够实现蓝牙无损音频传输的应该只有索尼LDAC技术,这其实是一种另辟蹊径的方法。索尼为了做到这一点,采用了自家独有的方式。因此LDAC并不通用,只能在索尼自家的音频设备或是手机、Walkman上使用,当然也不排除未来会将其授权给其他厂商使用的可能性。  事实上索尼的LDAC技术不算完美,LDAC会有三种压缩模式,如果采用最高品质(码率)进行传输,很容易受到干扰导致声音断续。而索尼在相应的设置界面也给出了提示,建议我们关闭同样是基于2.4GHz的WiFi。  所以通过这一点可以知道,为何目前没有全面普及蓝牙音频尚未无损传输,是因为这样做并不稳定。会影响到用户的使用体验,而且这肯定是比较难以解决的问题,不然黑科技满满的索尼早就搞定了。  蓝牙音频设备内置DAC、功放的影响也不可忽视  除了传输时所造成的问题外,由于蓝牙音频设备接收到的是数字信号,因此在内部还需要集成有DAC和功放。为了美观和便携性,蓝牙音箱耳机还要考虑体积。受限于有限的空间,会影响到DAC以及功放部分的电路设计,从而对音质产生了局限,无法带来和独立DAC、功放一致的性能表现。而且相比无源音箱或是有线耳机,蓝牙音频设备还无法随意进行搭配,会影响可玩性。即使手头有充分的预算,也无法为其配备更好的DAC和功放。  未来又会有怎样的发展  就在前不久蓝牙5.0标准也已经发布,据说会在传输距离和速度方面进行提升,而非像前两代一样,着重于功耗控制。看似实现无损蓝牙无损音频传输有望,但这只是一个大前提,因为除了蓝牙标准之外,还需要相关协议的跟进。同时在压缩编码、支持设备、内置DAC方面也必须做出相应的升级。从高音质的aptX编码逐渐被更多的厂商使用当中就能看出,蓝牙音频设备全面实现无损传输其实是时间早晚的问题。
花火网微信公众号huahuozhineng;欢迎打开微信点击添加好友搜索我们的公众帐号,关注我们!
一周热门资讯
Copyright @
HUAHUO.COM, All Rights Reserved. 版权所有 花火网怎样在蓝牙中audio.conf文件中节下添加内容_百度知道
怎样在蓝牙中audio.conf文件中节下添加内容
我有更好的答案
Android 自 ICS 开始,音频系统就有了很大的变化,先是抛弃了 alsalib,然后是采用了 AIO,各级框架上,都有了自己的特色,与 Linux 的音频应用渐行渐远,形成了自己独特的音频管理和音频配置功能。总的来说改进还是非常大,至少在用户体验上已经大大的超越了之前的版本。我们就从 4.4 的音频实现上来分析其中的一些变化和实现机制。
采纳率:85%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。蓝牙技术基础知识学习 - 简书
蓝牙技术基础知识学习
在网络上收集的一些资料,做一下汇总,方便自己查阅和学习。
作为一种通用的无线通信技术,规范自然是蓝牙技术的核心。蓝牙规范可分为两个层次
Core Specification(核心规范),用于规定蓝牙设备必须实现的通用功能和协议层次。它由软件和硬件模块组成,两个模块之间的信息和数据通过主机控制接口(HCI)的解释才能进行传递。 这个是必选。
profiles(蓝牙应用规范),它从应用场景的角度为蓝牙技术的使用制定了不同的规范。这也是和大众日常生活接触最多的一部分。蓝牙支持很多Profiles,下文将介绍几种使用最广泛的蓝牙应用规范。profile是可选。
两种蓝牙技术:Basic Rate(BR)和Low Energy(LE),蓝牙4.0之后才支持ble,之前的都是br,也叫做经典蓝牙。这两种技术,都包括搜索(discovery)管理、连接(connection)管理等机制,相互独立的,
Basic Rate -经典蓝牙
Basic Rate是正宗的蓝牙技术,可以包括可选(optional)的EDR(Enhanced Data Rate)技术,以及交替使用的(Alternate)的MAC(Media Access Control)层和PHY层扩展(简称AMP),
蓝牙诞生之初,使用的是BR技术,此时蓝牙的理论传输速率,只能达到721.2Kbps。在那个年代,56Kbps的Modem就是高大上了,这个速度可以说是惊为天人了啊!但是科技变化太快了,BR技术转眼就过时了。那怎么办呢?缝缝补补一下,增强速度呗,Enhanced Data Rate就出现了。
使用EDR技术的蓝牙,理论速率可以达到2.1Mbps。这一次的升级换代,还算优雅,因为没有改变任何的硬件架构、软件架构和使用方式上的改变。
也许你也猜到了,EDR又落伍了,看看人家WIFI(WLAN),几十Mbps,上百Mbps,咱们才2.1Mbps,也太寒酸了吧!那怎么办呢?蓝牙组织想了个坏主意:哎,WIFI!把你的物理层和MAC层借我用用呗!这就是AMP(Alternate MAC and PHY layer extension)。艾玛,终于松口气了,我们可以达到24Mbps了。
不过呢,由于蓝牙自身的物理层和AMP技术差异太明显了,这次扩展只能是交替使用(Alternate)的,也就是说,有我(BR/EDR)没你(AMP)。
Low Energy(LE)
上面所讲的BR技术的进化路线,就是传输速率的加快、加快、再加快。但能量是守恒的,你想传的更快,代价就是消耗更多的能量。而有很多的应用场景,并不关心传输速率,反而非常关心功耗。这就是Bluetooth LE(称作蓝牙低功耗)产生的背景。
LE技术相比BR技术,差异非常大,或者说就是两种不同的技术,凑巧都加一个“蓝牙”的前缀而已。后面我们会详细的解释这种差异,以及LE的行为特征。
蓝牙4.0的BLE技术:
蓝牙核心规范4.0的模块增加了以下几个蓝牙低功耗组件
GATT:表示服务器属性和客户端属性,描述了属性服务器中使用的服务层次,特点和属性。BLE设备使用它作为蓝牙低功耗应用规范的服务发现。
ATT:实现了属性客户端和服务器之间的点对点协议。ATT客户端给ATT服务器发送请求命令,ATT服务器端向ATT客户端发送回复和通知。
SMP用于生成对等协议的加密密钥和身份密钥。SMP管理加密密钥和身份密钥的存储,它通过生成和解析设备的地址来识别蓝牙设备。
几个常用的蓝牙规范:
全称为 Advances Audio Distribution Profile ,高质量音频分发规范,定义了如何将立体质量的音频通过流媒体的方式从媒体源传输到接收器上,A2DP使用Asynchronous Connectionless Link(ACL,蓝牙异步传输)信道传输高质量音频内容,它依赖于Generic Audio/Video Distribution Profile(GAVDP,通用音频/视频分发规范)。A2DP必须支持低复杂度及Sub-bandCodec(SBC,低带宽编解码),可选支持MPEG1,2音频,MPEG2、4AAC。A2DP的应用场景如图所示
A2DP有两种应用场景分别是播放和录音。
播放场景是具有蓝牙功能的播放器通过A2DP向蓝牙耳机或蓝牙立体声扬声器传送高质量音频。
录音场景是具有蓝牙功能的麦克风通过A2DP向蓝牙录音器传送高质量音频。
和A2DP相关的规范有Video Distribution Profile(VDP,视频分发规范),Audio/Video Remote Control Profile(AVRCP,音频/视频运程控制规范)。
Object Push Profile
OPP(对象推送规范)定义了推送服务器和客户端之间基于Generic Object Exchange Profile(GOEP,通用对象交换规范)进行对象交换的规范OPP的应用场景如图4所示
OPP主要用于手机与手机或者手机与电脑之间通过蓝牙进行文件操作
HFP(HFP,免提规范)定义了蓝牙音频网关设备如何通过蓝牙免提设备拨打和接听电话。HFP的应用场景如图所示:
HFP包括两个角色:
Audio Gateway(AG,音频网关)和Hands-Free Unit(HF,免提设备)。AG是音频输入和输出的设备,典型的AG设备是手机。HF是执行音频网关的远程音频输入输出设备。
HFP常见的场景是汽车上的车载套件,当车载套件和耳机通过蓝牙方式连接到手机时,通过无线蓝牙耳机拨打和接听电话。
和HFP相关的规范有Headset Profile(HSP,耳机规范),Phonebook Access Profile(PBAP,电话簿访问规范。
** Heart Rate Profile**
HRP(心率规范)定位与和医疗/健康相关的应用场景中,它使得蓝牙设备能与心率传感器交互
左图是HRP定义的角色关系。HRP中有两个角色:心率感应器和收集器。心率感应器是GATT服务器,是测量心率的设备,它包含心率服务和设备信息服务,心率服务导出心率测量数据;收集器是GATT客户端,是从心率感应器接收心率测量数据和其它数据的设备。
右图是HRP的应用场景。心率规范用于让设备获得心率传感器的心率测量和其它数据。例如,护士或医生可以用心率传感器测量病人的心率,并把心率数据传到笔记本或手持设备上。
和HRP相关的健康规范有Glucose Profile(GLP,血糖规范),Blood Pressure Profile(BLP,血压规范BLP),Health Thermometer Profile(HTP,健康体温计规范)。
Cycling Speed and Cadence Profile
CSCP(自行车速度和步调规范)让人们在骑自行车锻炼时跟踪速度和节奏。CSCP也基于GATT的规范。自行车速度和步调规范的角色关系和应用场景如图所示
左图是CSCP的角色关系。CSCP定义了两个角色:自行车速度和步调感应器和收集器。CSC感应器是GATT服务器,向收集器报告车轮转速数据或轴转速数据。CSC感应器包含CSC服务和设备信息服务;收集器是GATT客户端,从CSC感应器接收自行车的速度和步调数据。
右图是CSCP的应用场景。传感器测量被广泛应用于运动和健身,通过传感器来监视和控制训练强调,以及在多个训练中衡量进展情况。自行车速度传感器和自行车踏频传感器是用户测量车轮速度或蹬踏节奏的设备。任何设备实现CSC规范可以与CSC传感器连接并接收数据。
****HID ****
HUMAN INTERFACE DEVICE (HID) PROFILE,我们的蓝牙鼠标键盘,遥控器等的配置规范。
鼠标键盘:
profile 汇总
蓝牙技术联盟的-----
android 蓝牙结构
Android 4.2BlueDroid框架结构图
android 经典蓝牙
android BLE
[BLE](Bluetooth Low Energy)
三线码农!
http://www.jianshu.com/p/http://www.jianshu.com/p/
一、蓝牙介绍 蓝牙(Bluetooth(R)):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝...
姓名:于川皓 学号: 转载自:http://blog.csdn.net/xubin341719/article/details/ 【嵌牛导读】:蓝牙(Bluetooth(R)):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间...
蓝牙 蓝牙的波段为MHz(包括防护频带)。这是全球范围内无需取得执照(但定不是无管制的)的工业、科学和医疗用(ISM)波段的2.4GHz短距离无线电频段。 蓝牙使用跳频技术,讲传输的数据分割成数据包,通过79个指定的蓝牙频道分别传输数据包。每个频道的频...
Guide to BluetoothSecurity原文 本出版物可免费从以下网址获得:https://doi.org/10.6028/NIST.SP.800-121r2 权威 本出版物是由NIST根据2014年 “联邦信息安全现代化法案” (FISMA),44 USC §...
audio标签:autoplay
自动播放controls
显示控件loop
循环播放mp3
音频格式js控制:oA=new Audio();oA.play()自动播放
解放初期在周恩来总理亲自关注下,集合了北京周边十三家酒坊的酿酒精华创造了“北京二锅头酒”。 旧社会过来的老酒友健在的不多了,在解放前北京人喝的是“高粱烧”。喝上纯粮食酿的酒是上品。 解放后有了“二锅头”也分一毛三一两的和一毛七一两的。六、七十年代趁钱的北京人讲究喝一毛七一两...
瑞典电影《欧维决定去死》,情节暖暖的,带着点忧伤,适合一个人静静观看。
欧维五十九岁了,他花白头发,大个子,嘴角的纹路下垂,看身边的一切都不顺眼,有股生人勿近的气场。这样一个老头儿,如果你知道他经历了什么,就知道什么是倒霉人生的样板。童年丧母。他跟随父亲长大,父亲不善言...
青红辣椒凉薯片炒肉~~ 国庆假期的第四天,10月4日,在老家,我婆婆晚上炒了一个新鲜菜,今年吃第一回。 菜园里刚刚摘的新鲜辣椒,红辣椒几个,青辣椒几个,挖几个凉薯(小的,比拳头大一点点,很嫩,两三个就好)。 回来辣椒洗干净,切薄片。 凉薯洗干净,去皮,同样切薄片。 肥肉切薄...Posts - 5,
Articles - 0,
Comments - 0
20:44 by wulizhi, ... 阅读,
Android系统可以通过配置audio_policy.conf文件,来实现不同产品的差异化,audio_policy.conf文件中,配置了当前项目audio策略中支持的输入输出设备,对应的播放模式,采样率,采样精度,声道数等等。例如下面:
1 Primary {
sampling_rates <span style="color: #100|<span style="color: #000
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_PROXY|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET|AUDIO_DEVICE_OUT_FM|AUDIO_DEVICE_OUT_FM_TX
flags AUDIO_OUTPUT_FLAG_PRIMARY
low_latency {
sampling_rates <span style="color: #100|<span style="color: #000
<span style="color: #
channel_masks AUDIO_CHANNEL_OUT_STEREO
<span style="color: #
formats AUDIO_FORMAT_PCM_16_BIT
<span style="color: #
devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_PROXY|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET|AUDIO_DEVICE_OUT_FM|AUDIO_DEVICE_OUT_FM_TX
<span style="color: #
flags AUDIO_OUTPUT_FLAG_FAST
<span style="color: #
<span style="color: #
compress_offload {
<span style="color: #
sampling_rates <span style="color: #00|<span style="color: #025|<span style="color: #000|<span style="color: #050|<span style="color: #000|<span style="color: #100|<span style="color: #000
<span style="color: #
channel_masks AUDIO_CHANNEL_OUT_MONO|AUDIO_CHANNEL_OUT_STEREO
<span style="color: #
formats AUDIO_FORMAT_MP3|AUDIO_FORMAT_AAC_LC|AUDIO_FORMAT_AAC_HE_V1|AUDIO_FORMAT_AAC_HE_V2
<span style="color: #
devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_PROXY|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET|AUDIO_DEVICE_OUT_FM_TX
<span style="color: #
flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING
<span style="color: #
sampling_rates <span style="color: #100
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_ALL_A2DP
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
usb_accessory {
<span style="color: #
sampling_rates <span style="color: #100
<span style="color: #
channel_masks AUDIO_CHANNEL_OUT_STEREO
<span style="color: #
formats AUDIO_FORMAT_PCM_16_BIT
<span style="color: #
devices AUDIO_DEVICE_OUT_USB_ACCESSORY
<span style="color: #
<span style="color: #
usb_device {
<span style="color: #
sampling_rates dynamic
<span style="color: #
channel_masks dynamic
<span style="color: #
formats dynamic
<span style="color: #
devices AUDIO_DEVICE_OUT_USB_DEVICE
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
usb_device {
<span style="color: #
sampling_rates dynamic
<span style="color: #
channel_masks AUDIO_CHANNEL_IN_STEREO
<span style="color: #
formats AUDIO_FORMAT_PCM_16_BIT
<span style="color: #
devices AUDIO_DEVICE_IN_USB_DEVICE
<span style="color: #
<span style="color: #
<span style="color: #
在AudioPolicyManager中会解析此文件,获取此信息,那什么时候会需要修改此文件呢,例如:如果所在项目没有听筒设备,所以在接听电话的时候需要默认切换到喇叭输出,这个时候就需要修改此文件,把听筒设备AUDIO_DEVICE_OUT_EARPIECE从所有场景下支持的输出设备中删除,这样的话,就会切换到默认输出设备喇叭下。这个文件的信息,也可以通过指令
adb shell dumpsys media.audio_policy 打印出来,如下:
1 HW Modules dump:
2 - HW Module <span style="color: #:
- name: primary
- handle: <span style="color: #
- version: <span style="color: #.0
- outputs:
output <span style="color: #:
- name: primary
- sampling rates: <span style="color: #100, <span style="color: #000
<span style="color: #
- channel masks: <span style="color: #x0003
<span style="color: #
- formats: AUDIO_FORMAT_PCM_16_BIT
<span style="color: #
- flags: <span style="color: #x0002
<span style="color: #
- devices:
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_EARPIECE
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_SPEAKER
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_WIRED_HEADSET
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_WIRED_HEADPHONE
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_ALL_SCO
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_PROXY
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_AUX_DIGITAL
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_FM
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_FM_TX
<span style="color: #
output <span style="color: #:
<span style="color: #
- name: low_latency
<span style="color: #
- sampling rates: <span style="color: #100, <span style="color: #000
<span style="color: #
- channel masks: <span style="color: #x0003
<span style="color: #
- formats: AUDIO_FORMAT_PCM_16_BIT
<span style="color: #
- flags: <span style="color: #x0004
<span style="color: #
- devices:
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_SPEAKER
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_EARPIECE
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_WIRED_HEADSET
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_WIRED_HEADPHONE
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_ALL_SCO
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_AUX_DIGITAL
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_PROXY
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET
<span style="color: #
Device <span style="color: #:
<span style="color: #
- type: AUDIO_DEVICE_OUT_FM
<span style="color: #
Device <span style="color: #:
在文件系统里,有两个地方存放此文件/system/etc/audio_policy.conf 和&/vendor/etc/audio_policy.conf, 在创建AudioPolicyManager的时候会加载此配置文件:
1 AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface)
/*将默认输出设备设置成SPEAKER*/
mDefaultOutputDevice = new DeviceDescriptor(String8(""), AUDIO_DEVICE_OUT_SPEAKER);
/*加载audio_policy.conf文件,先默认去加载vendor目录下的文件,如果找不到就去加载system目录下的*/
if (loadAudioPolicyConfig(AUDIO_POLICY_VENDOR_CONFIG_FILE) != NO_ERROR) {
if (loadAudioPolicyConfig(AUDIO_POLICY_CONFIG_FILE) != NO_ERROR) {
ALOGE("could not load audio policy configuration file, setting defaults");
/*如果两个目录都没有找到,就去加载一个默认的配置,默认的配置中会创建一个Primary module,
为它创建一个默认的输出设备speaker和默认输出设备主Mic.
defaultAudioPolicyConfig();
/*把所有的输入输出设备都会操作打开一遍,检查该设备是否是有效的*/
// open all output streams needed to access attached devices
audio_devices_t outputDeviceTypes = mAvailableOutputDevices.types();
audio_devices_t inputDeviceTypes = mAvailableInputDevices.types() & ~AUDIO_DEVICE_BIT_IN;
for (size_t i = <span style="color: #; i & mHwModules.size(); i++) {
mHwModules[i]-&mHandle = mpClientInterface-&loadHwModule(mHwModules[i]-&mName);
if (mHwModules[i]-&mHandle == <span style="color: #) {
ALOGW("could not open HW module %s", mHwModules[i]-&mName);
// open all output streams needed to access attached devices
// except for direct output streams that are only opened when they are actually
// required by an app.
// This also validates mAvailableOutputDevices list
for (size_t j = <span style="color: #; j & mHwModules[i]-&mOutputProfiles.size(); j++)
const sp&IOProfile& outProfile = mHwModules[i]-&mOutputProfiles[j];
if (outProfile-&mSupportedDevices.isEmpty()) {
ALOGW("Output profile contains no device on module %s", mHwModules[i]-&mName);
if ((outProfile-&mFlags & AUDIO_OUTPUT_FLAG_DIRECT) != <span style="color: #) {
audio_devices_t profileType = outProfile-&mSupportedDevices.types();
if ((profileType & mDefaultOutputDevice-&mDeviceType) != AUDIO_DEVICE_NONE) {
profileType = mDefaultOutputDevice-&mDeviceT
// chose first device present in mSupportedDevices also part of
// outputDeviceTypes
for (size_t k = <span style="color: #; k
& outProfile-&mSupportedDevices.size(); k++) {
profileType = outProfile-&mSupportedDevices[k]-&mDeviceT
if ((profileType & outputDeviceTypes) != <span style="color: #) {
if ((profileType & outputDeviceTypes) == <span style="color: #) {
sp&AudioOutputDescriptor& outputDesc = new AudioOutputDescriptor(outProfile);
outputDesc-&mDevice = profileT
audio_config_t config = AUDIO_CONFIG_INITIALIZER;
config.sample_rate = outputDesc-&mSamplingR
config.channel_mask = outputDesc-&mChannelM
config.format = outputDesc-&mF
audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
status_t status = mpClientInterface-&openOutput(outProfile-&mModule-&mHandle,
&outputDesc-&mDevice,
String8(""),
&outputDesc-&mLatency,
outputDesc-&mFlags);
if (status != NO_ERROR) {
ALOGW("Cannot open output stream for device %08x on hw module %s",
outputDesc-&mDevice,
mHwModules[i]-&mName);
outputDesc-&mSamplingRate = config.sample_
outputDesc-&mChannelMask = config.channel_
outputDesc-&mFormat = config.
for (size_t k = <span style="color: #; k
& outProfile-&mSupportedDevices.size(); k++) {
audio_devices_t type = outProfile-&mSupportedDevices[k]-&mDeviceT
ssize_t index =
mAvailableOutputDevices.indexOf(outProfile-&mSupportedDevices[k]);
/*如果打开的输出设备有效,为它分配一个 有效的ID,赋值对应的module*/
// give a valid ID to an attached device once confirmed it is reachable
if ((index &= <span style="color: #) && (mAvailableOutputDevices[index]-&mId == <span style="color: #)) {
mAvailableOutputDevices[index]-&mId = nextUniqueId();
mAvailableOutputDevices[index]-&mModule = mHwModules[i];
if (mPrimaryOutput == <span style="color: # &&
outProfile-&mFlags & AUDIO_OUTPUT_FLAG_PRIMARY) {
mPrimaryOutput =
addOutput(output, outputDesc);
setOutputDevice(output,
<span style="color: #0
outputDesc-&mDevice,
<span style="color: #1
<span style="color: #2
<span style="color: #3
<span style="color: #4
// open input streams needed to access attached devices to validate
<span style="color: #5
// mAvailableInputDevices list
<span style="color: #6
for (size_t j = <span style="color: #; j & mHwModules[i]-&mInputProfiles.size(); j++)
<span style="color: #7
<span style="color: #8
const sp&IOProfile& inProfile = mHwModules[i]-&mInputProfiles[j];
<span style="color: #9
<span style="color: #0
if (inProfile-&mSupportedDevices.isEmpty()) {
<span style="color: #1
ALOGW("Input profile contains no device on module %s", mHwModules[i]-&mName);
<span style="color: #2
<span style="color: #3
<span style="color: #4
// chose first device present in mSupportedDevices also part of
<span style="color: #5
// inputDeviceTypes
<span style="color: #6
audio_devices_t profileType = AUDIO_DEVICE_NONE;
<span style="color: #7
for (size_t k = <span style="color: #; k
& inProfile-&mSupportedDevices.size(); k++) {
<span style="color: #8
profileType = inProfile-&mSupportedDevices[k]-&mDeviceT
<span style="color: #9
if (profileType & inputDeviceTypes) {
<span style="color: #0
<span style="color: #1
<span style="color: #2
<span style="color: #3
if ((profileType & inputDeviceTypes) == <span style="color: #) {
<span style="color: #4
<span style="color: #5
<span style="color: #6
sp&AudioInputDescriptor& inputDesc = new AudioInputDescriptor(inProfile);
<span style="color: #7
<span style="color: #8
inputDesc-&mInputSource = AUDIO_SOURCE_MIC;
<span style="color: #9
inputDesc-&mDevice = profileT
<span style="color: #0
<span style="color: #1
// find the address
<span style="color: #2
DeviceVector inputDevices = mAvailableInputDevices.getDevicesFromType(profileType);
<span style="color: #3
the inputs vector must be of size 1, but we don't want to crash here
<span style="color: #4
String8 address = inputDevices.size() & <span style="color: # ? inputDevices.itemAt(<span style="color: #)-&mAddress
<span style="color: #5
: String8("");
<span style="color: #6
for input device 0x%x using address %s", profileType, address.string());
<span style="color: #7
ALOGE_IF(inputDevices.size() == <span style="color: #, "Input device list is empty!");
<span style="color: #8
<span style="color: #9
audio_config_t config = AUDIO_CONFIG_INITIALIZER;
<span style="color: #0
config.sample_rate = inputDesc-&mSamplingR
<span style="color: #1
config.channel_mask = inputDesc-&mChannelM
<span style="color: #2
config.format = inputDesc-&mF
<span style="color: #3
audio_io_handle_t input = AUDIO_IO_HANDLE_NONE;
<span style="color: #4
status_t status = mpClientInterface-&openInput(inProfile-&mModule-&mHandle,
<span style="color: #5
<span style="color: #6
<span style="color: #7
&inputDesc-&mDevice,
<span style="color: #8
<span style="color: #9
AUDIO_SOURCE_MIC,
<span style="color: #0
AUDIO_INPUT_FLAG_NONE);
<span style="color: #1
<span style="color: #2
if (status == NO_ERROR) {
<span style="color: #3
for (size_t k = <span style="color: #; k
& inProfile-&mSupportedDevices.size(); k++) {
<span style="color: #4
audio_devices_t type = inProfile-&mSupportedDevices[k]-&mDeviceT
<span style="color: #5
ssize_t index =
<span style="color: #6
mAvailableInputDevices.indexOf(inProfile-&mSupportedDevices[k]);
<span style="color: #7
// give a valid ID to an attached device once confirmed it is reachable
<span style="color: #8
if ((index &= <span style="color: #) && (mAvailableInputDevices[index]-&mId == <span style="color: #)) {
<span style="color: #9
mAvailableInputDevices[index]-&mId = nextUniqueId();
<span style="color: #0
mAvailableInputDevices[index]-&mModule = mHwModules[i];
<span style="color: #1
<span style="color: #2
<span style="color: #3
mpClientInterface-&closeInput(input);
<span style="color: #4
<span style="color: #5
ALOGW("Cannot open input stream for device %08x on hw module %s",
<span style="color: #6
inputDesc-&mDevice,
<span style="color: #7
mHwModules[i]-&mName);
<span style="color: #8
<span style="color: #9
<span style="color: #0
<span style="color: #1
<span style="color: #2
/*确认mAvailableOutputDevices设备列表中的所有输出设备的id是有效的,如果无效,移除该设备*/
<span style="color: #3
// make sure all attached devices have been allocated a unique ID
<span style="color: #4
for (size_t i = <span style="color: #; i
& mAvailableOutputDevices.size();) {
<span style="color: #5
if (mAvailableOutputDevices[i]-&mId == <span style="color: #) {
<span style="color: #6
ALOGW("Input device %08x unreachable", mAvailableOutputDevices[i]-&mDeviceType);
<span style="color: #7
mAvailableOutputDevices.remove(mAvailableOutputDevices[i]);
<span style="color: #8
<span style="color: #9
<span style="color: #0
<span style="color: #1
<span style="color: #2
for (size_t i = <span style="color: #; i
& mAvailableInputDevices.size();) {
<span style="color: #3
if (mAvailableInputDevices[i]-&mId == <span style="color: #) {
<span style="color: #4
ALOGW("Input device %08x unreachable", mAvailableInputDevices[i]-&mDeviceType);
<span style="color: #5
mAvailableInputDevices.remove(mAvailableInputDevices[i]);
<span style="color: #6
<span style="color: #7
<span style="color: #8
<span style="color: #9
<span style="color: #0
<span style="color: #1
/*确认默认输出设备是有效的*/
<span style="color: #2
// make sure default device is reachable
<span style="color: #3
if (mAvailableOutputDevices.indexOf(mDefaultOutputDevice) & <span style="color: #) {
<span style="color: #4
ALOGE("Default device %08x is unreachable", mDefaultOutputDevice-&mDeviceType);
<span style="color: #5
<span style="color: #6
<span style="color: #7
ALOGE_IF((mPrimaryOutput == <span style="color: #), "Failed to open primary output");
<span style="color: #8
<span style="color: #9
/*更新下音频策略*/
<span style="color: #0
updateDevicesAndOutputs();
<span style="color: #1 }
在创建AudioPolicyManager的时候,会load&audio_policy.conf文件建立起有效输出设备列表mAvailableOutputDevices 和有效输入设备列表mAvailableInputDevices。
1 status_t AudioPolicyManager::loadAudioPolicyConfig(const char *path)
data = (char *)load_file(path, NULL);
if (data == NULL) {
return -ENODEV;
<span style="color: #
root = config_node("", "");
<span style="color: #
config_load(root, data);
<span style="color: #
<span style="color: #
/*根据配置文件支持的module,分别load
audio.&primary/a2dp/usb&.&device&.so 这三个so文件 */
<span style="color: #
loadHwModules(root);
<span style="color: #
// legacy audio_policy.conf files have one global_configuration section
<span style="color: #
/*加载audio_policy.conf 中的global_configuration 配置*/
<span style="color: #
loadGlobalConfig(root, getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY));
<span style="color: #
config_free(root);
<span style="color: #
free(root);
<span style="color: #
free(data);
<span style="color: #
<span style="color: #
ALOGI("loadAudioPolicyConfig() loaded %s\n", path);
<span style="color: # }
<span style="color: #
<span style="color: #
配置文件中可以看到,一般平台都会支持primary, a2dp, usb三中输出方式,所以,这里会分别load三个module的so文件。如果两个地方配置文件找不到,也会创建一个默认的primary module来进行音频的输入输出。
为什么会想到看这个呢,是因为在播放的音乐的时候,选用播放模式的时候,会判断是否可以用compress_offload模式,其中,有一项判断,就是判断它的设置是否在compress_offload支持的范围,而compress_offload支持的参数,就是在此conf文件中配置的。
例如,它支持8k~48k之间的采样率,支持MP3,AAC格式,支持常见的喇叭,听筒,耳机等输出,如果设置的参数,不在此配置内,就不能使用compress_offload模式进行播放
<span style="color: # compress_offload {
<span style="color: #
sampling_rates <span style="color: #00|<span style="color: #025|<span style="color: #000|<span style="color: #050|<span style="color: #000|<span style="color: #100|<span style="color: #000
<span style="color: #
channel_masks AUDIO_CHANNEL_OUT_MONO|AUDIO_CHANNEL_OUT_STEREO
<span style="color: #
formats AUDIO_FORMAT_MP3|AUDIO_FORMAT_AAC_LC|AUDIO_FORMAT_AAC_HE_V1|AUDIO_FORMAT_AAC_HE_V2
<span style="color: #
devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_PROXY|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET|AUDIO_DEVICE_OUT_FM_TX
<span style="color: #
flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING}

我要回帖

更多关于 蓝牙audio 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信