Android 音量调节

frameworks/base/media/java/android/media/AudioService.java

public void adjustMasterVolume(int steps, int flags)

    public void setMasterVolume(int volume, int flags)

        private void doSetMasterVolume(float volume, int flags)

    private void doSetMasterVolume(float volume, int flags) {
        if (!AudioSystem.getMasterMute()) {
            int oldVolume = getMasterVolume();
            AudioSystem.setMasterVolume(volume);                                     //真正做事的
            //setMasterVolumePrivate(volume);                                        //第二种方案

            int newVolume = getMasterVolume();
            if (newVolume != oldVolume) {
                // Post a persist master volume msg
                sendMsg(mAudioHandler, MSG_PERSIST_MASTER_VOLUME, SENDMSG_REPLACE,  //发送消息,保存音量值,以便重启时设置
                        Math.round(volume * (float)1000.0), 0, null, PERSIST_DELAY);
            }    
            // Send the volume update regardless whether there was a change.
            sendMasterVolumeUpdate(flags, oldVolume, newVolume);                    // UI update and Broadcast Intent
        } else { // In case of mute, disable mute first.
            setMasterMute(false, flags, new Binder());
        }    
    }    
第一种方案

frameworks/base/media/java/android/media/AudioSystem.java

public static native int setMasterVolume(float value);

frameworks/av/media/libmedia/AudioSystem.cpp

status_t AudioSystem::setMasterVolume(float value)
{
    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
    if (af == 0) return PERMISSION_DENIED;
    af->setMasterVolume(value);
    return NO_ERROR;
}

status_t AudioFlinger::setMasterVolume(float value)
{   
    status_t ret = initCheck();
    if (ret != NO_ERROR) {
        return ret;
    }   
            
    // check calling permissions
    if (!settingsAllowed()) {
        return PERMISSION_DENIED;
    }
    
    float swmv = value;
    mA2DPHandle = -1;
    Mutex::Autolock _l(mLock);
        
    // when hw supports master volume, don't scale in sw mixer
    if (MVS_NONE != mMasterVolumeSupportLvl) {                    //MVS_SETONLY
        for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
            AutoMutex lock(mHardwareLock);
            audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
        
            mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
            if (NULL != dev->set_master_volume) {
                dev->set_master_volume(dev, value);        //硬件调节,但是一般只提供这个接口,但底层什么都不做。
            }
            mHardwareStatus = AUDIO_HW_IDLE;
        }
        
        swmv = 1.0;
    }   

    mMasterVolume   = value;
    mMasterVolumeSW = swmv;
    for (size_t i = 0; i < mPlaybackThreads.size(); i++)
        mPlaybackThreads.valueAt(i)->setMasterVolume(swmv);   //软件调节,这里swmv=1.0,相当于什么都不做。

    return NO_ERROR;
}

    enum master_volume_support {
        // MVS_NONE:
        // Audio HAL has no support for master volume, either setting or
        // getting.  All master volume control must be implemented in SW by the
        // AudioFlinger mixing core.
        MVS_NONE,

        // MVS_SETONLY:
        // Audio HAL has support for setting master volume, but not for getting
        // master volume (original HAL design did not include a getter).
        // AudioFlinger needs to keep track of the last set master volume in
        // addition to needing to set an initial, default, master volume at HAL
        // load time.
        MVS_SETONLY,

        // MVS_FULL:
        // Audio HAL has support both for setting and getting master volume.
        // AudioFlinger should send all set and get master volume requests
        // directly to the HAL.
        MVS_FULL,
    };   

第二种方案:

frameworks/base/media/java/android/media/AudioService.java

    private int setMasterVolumePrivate(float value) {
        if (DEBUG_VOL) {
            Log.d(TAG, "setMasterVolumeLetv(value=" + value + ")");
        }
        final int retValue = AudioSystem.setMasterVolume(value);         //这个函数其实什么都没做
        // Set all type of streams.
        final int numStreamTypes = AudioSystem.getNumStreamTypes();
        for (int i = numStreamTypes - 1; i >= 0; i--) {
            AudioSystem.setStreamVolumeIndex(i, (int) (value * MAX_MASTER_VOLUME), getDeviceForStream(i));  //真正做事的
        }

        return retValue;
    }

frameworks/base/media/java/android/media/AudioSystem.java

    public static native int setStreamVolumeIndex(int stream, int index, int device);

frameworks/av/media/libmedia/AudioSystem.cpp

status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream,
                                           int index,
                                           audio_devices_t device)
{   
    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
    if (aps == 0) return PERMISSION_DENIED;
    return aps->setStreamVolumeIndex(stream, index, device);
}   

frameworks/av/services/audioflinger/AudioPolicyService.cpp

status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
                                                  int index,
                                                  audio_devices_t device)
{   
    if (mpAudioPolicy == NULL) {
        return NO_INIT;
    }
    if (!settingsAllowed()) {
        return PERMISSION_DENIED;
    }
    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
        return BAD_VALUE;                  
    }
    
    if (mpAudioPolicy->set_stream_volume_index_for_device) {
        return mpAudioPolicy->set_stream_volume_index_for_device(mpAudioPolicy,
                                                                stream,
                                                                index,
                                                                device);
    } else {
        return mpAudioPolicy->set_stream_volume_index(mpAudioPolicy, stream, index);
    }
}


参考:

AudioManager音量控制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android操作系统提供了丰富的音量调节功能,使用户可以根据自己的需求和环境来调节设备的音量。 首先,用户可以通过音量按钮来快速调节设备的音量。通过按下设备的音量上下按钮,可以分别提高或降低音量。这种方式非常方便,用户可以根据需要快速调整音量大小。 除了音量按钮,用户还可以通过系统设置来进一步调节音量。用户可以打开“设置”应用,找到“声音”或“音量”选项。在该选项中,用户可以分别设置媒体、通知、来电、闹钟等不同的音量,并使用滑块来调整音量的大小。 另外,Android还提供了快捷菜单来调节音量。用户可以从屏幕顶部或底部向上或向下滑动,从而打开快捷菜单。在该菜单中,用户可以找到音量控制选项,并通过滑块来调整音量大小。这种方式比较便捷,用户可以在任何应用中快速调节音量,而无需进入设置。 最后,有些应用还提供了自定义音量调节功能。例如,音乐播放器应用通常会提供独立的音量控制,用户可以在应用内部调整音量,而不影响其他应用的音量设置。这种方式适用于一些需要专注调整音乐或媒体音量的场景。 总之,Android提供了多种方法来调节音量,包括通过音量按钮、系统设置、快捷菜单和应用自定义等方式。用户可以根据需要和偏好自由地调整设备的音量大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值