Audio调节音量流程
Audio音量调节是一级一级调节,而且分不同的流类型,如响铃,通话,多媒体等。不同的设备(蓝牙设备)的设置方法有所区别。
sdk的api,设置相应流的音量。不同的流index的范围不一样
//--->frameworks/base/media/java/android/media/AudioManager.java
public void setStreamVolume(int streamType, int index, int flags) {
IAudioService service = getService();
try {
service.setStreamVolume(streamType, index, flags,
getContext().getOpPackageName());
} catch (RemoteException e) {
Log.e(TAG, "Dead object in setStreamVolume", e);
}
}
java层Service实现,volume的调节的实现是用state模式来实现,可能需要原子性或不同的模式下调节音量的操作不同。
//--->frameworks/base/services/core/java/com/android/server/audio/AudioService.java
private void setStreamVolume(int streamType, int index, int flags,
String callingPackage,String caller, int uid) {
...(检查参数)
...(转换参数)
// 获取设备
final int device = getDeviceForStream(streamType);
...(特殊处理a2dp)
...(检查uid,实体按键调节音量需要判断当前用户?)
synchronized (mSafeMediaVolumeState) {
mPendingVolumeCommand = null;
oldIndex = streamState.getIndex(device);
index = rescaleIndex(index * 10, streamType, streamTypeAlias);
...(特殊处理a2dp)
...(特殊处理HDMI)
...(设置一些标志位,如标记一些不可调节音量的设备)
//检查当前是否可设置音量
if (!checkSafeMediaVolume(streamTypeAlias, index, device)) {
// 不可以则生成PendingCommand,等待合适的时机
mVolumeController.postDisplaySafeVolumeWarning(flags);
mPendingVolumeCommand = new StreamVolumeCommand(
streamType, index, flags, device);
} else {
// 设置音量
onSetStreamVolume(streamType, index, flags, device,
caller);
index = mStreamStates[streamType].getIndex(device);
}
}
// 发送更新音量信息
sendVolumeUpdate(streamType, oldIndex, index, flags);
}
private void onSetStreamVolume(int streamType, int index, int flags,
int device,String caller) {
final int stream = mStreamVolumeAlias[streamType];
// 设置音量
setStreamVolumeInt(stream, index, device, false, caller);
...(判断音量是否为0,调节模式(静音或响铃))
mStreamStates[stream].mute(index == 0);
}
private void setStreamVolumeInt(int streamType,int index,int device,
boolean force,String caller) {
VolumeStreamState streamState = mStreamStates[streamType];
if (streamState.setIndex(index, device, caller) || force) {
// Post me