Android音量调节原理

本文详细阐述了Android系统音量调节的执行过程,从APP层的AudioManager调用到Framework层的AudioSystem,再到Native层的AudioPolicyManager.cpp和VolumeCurve.cpp。介绍了音量曲线的配置、UI音量值如何映射到底层db值的计算,以及AudioPolicyManager.cpp中的setStreamVolumeIndex方法。此外,还提及了其他音量设置方法,如adjustStreamVolume。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android系统音量调节机制执行过程

前言

做有关APK项目时用到了Android系统的音量调节相关的知识,于是去追了Android源码,下面来简单介绍下。

正文

在APP层调用的代码如下:

private AudioManager audioManager;
int index = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int device = AudioDeviceInfo.TYPE_BUILTIN_SPEAKER;
double decible = (double)audioManager.getStreamVolumeDb(AudioManager.STREAM_MUCIC, index, device);

AudioManager.java文件在Framework层,部分代码如下:

public float getStreamVolumeDb(@PublicStreamTypes int streamType, int index,
							@AudioDeviceInfo.AudioDeviceTypeOut int deviceType)
{
   
	if (!isPublicStreamType(streamType)) {
   
		throw new IllegalArgumentException("Invalid stream type " + streamType);
	}
	if (index > getStreamMaxVolume(streamType) || index < getStreamMinVolume(streamType)) {
   
		throw new IllegalArgumentException("Invalid stream volume index " + index);
	}
	if (!AudioDeviceInfo.isValidAudioDeviceTypeOut(deviceType)) {
   
		throw new IllegalArgumentException("Invalid audio output device type " + deviceType);
	}
	final float gain = AudioSystem.getStreamVolumeDB(streamType, index, AudioDeviceInfo.convertDeviceTypeToInternalDevice(deviceType));//此函数在AudioSystem.java
	if (gain <= VOLUME_MIN_DB) {
   
		return Float.NEGATIVE_INFINITY;
	} else {
   
		return gain;
	}
}

AudioSystem.java文件在Framework层,部分代码如下:

public static native float getStreamVolumeDB(int stream, int index, int device);//调用AudioPolicyManager类的getStreamVolumeDB方法

AudioPolicyManager.cpp类在Native层,部分代码如下:

float AudioPolicyManager::getStreamVolumeDB(audio_stream_type_t stream,
											int index, audio_devices_t device)
{
   
	return computeVolume(getVolumeCurves(stream), toVolumeSource(stream), index, {
   device});
}
...
float AudioPolicyManager::computeVolume(IVolumeCurves &cu
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值