音量调节流程

本文深入探讨了Android音量调节的流程,涉及AudioService、AudioManager和AudioPolicy等相关组件。当音量键被按下,事件经过Activity和PhoneWindow处理,触发AudioService的音量控制。音量与流类型紧密相关,每种流类型有自己的音量设置。AudioService通过mStreamVolumeAlias数组处理流类型的映射关系,并使用VolumeStreamState类存储每个流类型的音量信息。在调整音量时,会检查是否需要变更情景模式,并将音量变化发送到底层实现。
摘要由CSDN通过智能技术生成

在分析Android音频系统时,习惯将其实现分为两个部分:数据流和策略。数据流描述了音频数据从数据源流向目的地的过程。而策略则是管理及控制数据流的路径与呈现的过程.AudioTrackAudioRecordAudioFlinger可以被划归到数据流的范畴去讨论。而AudioPolicy相关的内容则属于策略范畴。AudioService这个系统服务包含或使用了几乎所的音频相关的内容,AudioService2.3及以后版本中提供了AudioFocus机制用以结束多个音频应用混乱的交互现状。音频应用在播放音频的过程中需要合理的申请与释放AudioFocus,并根据AudioFocus所有权的变化来调整自己的播放行为.

AudioService继承自IAudioService.StubIAudioService.Stub类很明显是通过IAudioService.aidl自动生成的。AudioService位于Bn端。AudioManager拥有AudioServiceBp端,是AudioService在客户端的一个代理。几乎所有客户端对AudioManager进行的请求,最终都会交由AudioService实现。AudioService的功能实现依赖AudioSystem类,AudioSystem无法实例化,它是java层到native层的代理。AudioService将通过它与AudioPolicyService以及AudioFlinger进行交互.

音量键被按下后,Android输入系统将该事件一路派发给Activity,如果无人截获并消费这个事件,承载当前Activity的显示的PhoneWindow类的onKeyDown()onKeyUp()函数将会将其处理,从而开始了通过音量键调整音量的处理流程.

 

Android中,音量的控制与流类型是密不可分的,每种流类型都独立地拥有自己的音量设置,绝大部分情况下互不干扰,例如音乐音量、通话音量就是相互独立的。所以说,离开流类型谈音量是没有意义的。在Android中,音量这个概念一定是描述的某一种流类型的音量。

这里传入了mVolumeControlStreamType,那么这个变量的值是从哪里来的呢?做过多媒体应用程序的读者应该知道,Activity类中有一个函数名为setVolumeControlStream(int streamType)

AudioManagerhandleKeyDown()的实现很简单,在一个switch中,它调用了AudioServiceadjustSuggestedStreamVolume(),所以直接看一下AudioService

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值