java audiosystem_audiosystem 音量调节流程

本文详细解析了Java中使用AudioSystem调整音量的过程,从AudioManager的setStreamVolume方法开始,深入到AudioService、AudioPolicyService等多个层级,直至最终在AudioPolicyManager中计算并应用音量变化。
摘要由CSDN通过智能技术生成

首先上层java调用

XXXPlayer

AudioManager audiomanage = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

audiomanager就是我们定义的控制系统声音的对象,(如果context报错,可将其改成XXXPlayer.this)

audiomanager.SetStreamVolume(AA,BB,CC),是我们可以直接使用的AudioManager的成员函数,3个参数表示的意思:AA:有内置的常量,可以在AudioManager里面查到相关的定义,我们在此用 AudioManager.STREAM_MUSIC, BB:自己设置音量的值,CC:也是一些标示量,我在此设置为0;

1.AudioManager.java

public void setStreamVolume(int streamType, int index, int flags);上层接口

1)调用IAudioService service = getService(); 当程序开启时会获得service,调用此来获得

2.执行ServiceManager.java

public static IBinder getService(String name)获取audio服务

3.AudioService.java

public void setStreamVolume(int streamType, int index, int flags)//服务接口

1) private void setStreamVolumeInt(int streamType, int index, boolean force, boolean lastAudible)//服务函数

2)调用以下函数

sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME, streamType, SENDMSG_NOOP, 0, 0,streamState, 0)

//Post message to set system volume (it in turn will post a message

// to persist)

3)AudioHandler::setSystemVolume(VolumeStreamState streamState);//sendmsg(...)后执行函数

4)调用AudioHandler::setStreamVolumeIndex(int stream, int index)

5)AudioSystem.setStreamVolumeIndex(stream,index);//audioSystem接口

static int android_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, jobject thiz, jint stream, jint index)

1)调用AudioSystem::setStreamVolumeIndex

6.status_t AudioSystem::setStreamVolumeIndex(stream_type stream, int index)

1)获得服务 const sp& aps = AudioSystem::get_audio_policy_service();

2)调用aps->setStreamVolumeIndex(stream, index)

7.status_t AudioPolicyService::setStreamVolumeIndex(AudioSystem::stream_type stream, int index)

1)调用mpPolicyManager->setStreamVolumeIndex(stream, index)

status_t AudioPolicyManager::setStreamVolumeIndex(AudioSystem::stream_type stream, int index)

1)记录音量index: mStreams[stream].mIndexCur = index

2)compute and apply stream volume on all outputs:

checkAndSetVolume(stream, index, mOutputs.keyAt(i), mOutputs.valueAt(i)->device())

8.status_t AudioPolicyManager::checkAndSetVolume(int stream, int index, audio_io_handle_t output, uint32_t device, int delayMs, bool force)

1)计算音量:float volume = computeVolume(stream, index, output, device);

2)调用:mpClientInterface->setStreamVolume((AudioSystem::stream_type)stream, volume, output, delayMs);

9.status_t AudioPolicyService::setStreamVolume(AudioSystem::stream_type stream, float volume, audio_io_handle_t output, int delayMs)

调用mAudioCommandThread->volumeCommand((int)stream, volume, (int)output, delayMs);

10.status_t AudioPolicyService::AudioCommandThread::volumeCommand(int stream, float volume, int output, int delayMs) 调用insertCommand_l(command, delayMs);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值