Android:Mstar平台 HDMI OUT 靜音流程


一、framework層

  1. APP調用 AudioManager 的 adjustStreamVolume() 接口實現在: frameworks\base\services\core\java\com\android\server\audio\AudioService.java

    在判斷當前是系統靜音操作時,調用 HdmiOutAudioMute Native接口:

            if (isMuteAdjust) {
                boolean state;
                if (direction == AudioManager.ADJUST_TOGGLE_MUTE) {
                    state = !streamState.mIsMuted;
                } else {
                    state = direction == AudioManager.ADJUST_MUTE;
                }
                if (streamTypeAlias == AudioSystem.STREAM_MUSIC) {
                    setSystemAudioMute(state);
                    /*lxl 20191206 add patch begin*/
                    PowerManagerService.nativeSetHdmiOutAudioMute(state);
                    /*lxl 20191130 add patch end*/
                }
                for (int stream = 0; stream < mStreamStates.length; stream++) {
                    if (streamTypeAlias == mStreamVolumeAlias[stream]) {
                        if (!(readCameraSoundForced()
                                    && (mStreamStates[stream].getStreamType()
                                        == AudioSystem.STREAM_SYSTEM_ENFORCED))) {
                            mStreamStates[stream].mute(state);
                        }
                    }
                }
            }

  2. nativeSetHdmiOutAudioMute 接口聲明在: frameworks\base\services\core\java\com\android\server\power\PowerManagerService.java

public static native boolean nativeSetHdmiOutAudioMute(boolean onOff);

 

二、Native層

  1.frameworks\base\services\core\jni\com_android_server_power_PowerManagerService.cpp 中實現了 nativeSetHdmiOutAudioMute() 方法:

static jboolean nativeSetHdmiOutAudioMute(JNIEnv *env, jclass clazz, jboolean onOff){
    std::lock_guard<std::mutex> lock(gPowerHalMutex);
    if (getInputHal()) {
        Return<bool> ret = gInputHal->setHdmiOutAudioMute(onOff);
        if (!ret.isOk()) {
            ALOGE("Failed to SetHdmiOutAudioMute.");
            return false;
        }
        return ret;
    }
    ALOGE("Failed to SetHdmiOutAudioMute input hal is null.");
    return false;
}

  Native方法的聲明和注冊:

static const JNINativeMethod gPowerManagerServiceMethods[] = {
    /* name, signature, funcPtr */
  ......
    {"nativeSetHdmiOutAudioMute", "(Z)Z",
            (void*) nativeSetHdmiOutAudioMute },
  ......
}
int register_android_server_PowerManagerService(JNIEnv* env) {
    int res = jniRegisterNativeMethods(env, "com/android/server/power/PowerManagerService",
            gPowerManagerServiceMethods, NELEM(gPowerManagerServiceMethods));
    (void) res;  // Faked use when LOG_NDEBUG.
    LOG_FATAL_IF(res < 0, "Unable to register native methods.");

    // Callbacks

    jclass clazz;
    FIND_CLASS(clazz, "com/android/server/power/PowerManagerService");

    GET_METHOD_ID(gPowerManagerServiceClassInfo.userActivityFromNative, clazz,
            "userActivityFromNative", "(JII)V");

    // Initialize
    for (int i = 0; i <= USER_ACTIVITY_EVENT_LAST; i++) {
        gLastEventTime[i] = LLONG_MIN;
    }
    gPowerManagerServiceObj = NULL;
    return 0;
}

  2. 上面 gInputHal->setHdmiOutAudioMute(onOff); 調用是通過HIDL調用HAL層接口, Service的獲取:

bool getInputHal(){
    if (gInputHal == nullptr){
        gInputHal = IMstarTvInput::getService();
        if (gInputHal == nullptr) {
            ALOGD("Load input HAL service fail");
            return -1;
        }    
    }

    return gInputHal != nullptr;
}

 

三、HAL層

  1 HIDL接口定義 vendor\mstar\hardware\interfaces\tv\input\1.0\IMstarTvInput.hal,繼承於 TvInput :

interface IMstarTvInput
    extends android.hardware.tv.input@1.0::ITvInput {
     @callflow(next="*")
         //EpgManager function(31/32)
    ...
    setHdmiOutAudioMute(bool bEnable)
          generates (bool result);
    ...
}

  2. 接口的定義 vendor\mstar\hardware\interfaces\tv\input\1.0\default\TvInput.h, TvInput 又繼承於 IMstarTvInput :

struct TvInput : public IMstarTvInput {
    TvInput(mstar_tv_input_device_t* device);
    ~TvInput();
    /*mstar tv interface*/
...
    Return<bool> setHdmiOutAudioMute(bool bEnable);
...
}

  3. 具體的方法實現在 vendor\mstar\hardware\interfaces\tv\input\1.0\default\TvInput_TvManager.cpp

Return<bool> TvInput::setHdmiOutAudioMute(bool bEnable){
    return mDevice->TvManager_dev->setHdmiOutAudioMute(bEnable);
}

   系統靜音的方法實現便在另外文件:vendor\mstar\hardware\interfaces\tv\input\1.0\default\TvInput_AudioManager.cpp

  4. 其中 mDevice->TvManager_dev->setHdmiOutAudioMute() 方法的定義在:vendor\mstar\hardware\interfaces\tv\input\1.0\default\mstarTvInput_TvManager_dev.h

#ifndef MSTAR_TV_INPUT_TvManager_H
#define MSTAR_TV_INPUT_TvManager_H
#include <mstar/hardware/tv/input/1.0/ITvManagerType.h>
#include "tvmanager/TvManager.h"
using ::mstar::hardware::tv::input::V1_0::ITvManagerType;
typedef struct mstar_TvManager_dev {
    ......
    bool (*setHdmiOutAudioMute)(bool bEnable);
    ......
}

  5. 其方法實現在 vendor\mstar\hardware\tv_input\mstar_tv_input_TvManager.cpp

bool mstar_tv_input_TvManager::setHdmiOutAudioMute(bool bEnable){
    return g_pTvManagerImpl->setHdmiOutAudioMute(bEnable);
}

   g_pTvManagerImpl 是通過 TvManager 轉換所得:

void mstar_tv_input_TvManager::registerTvManagerInstance(sp<TvManager> &ptr) {
    g_pTvManagerImpl=ptr;
}

  6. TvManager 的接口定義在 vendor\mstar\common\libraries\tvapi\hidl_wrapper\tvmanager\TvManager.h

class TvManager : virtual public RefBase
{
public:
    TvManager();
    ~TvManager();

    static sp<TvManager> connect();
    void HIDLconnect();
    static void disconnect();

    status_t setListener(const sp<TvManagerListener>& listener);

    ...
    static bool setHdmiOutAudioMute(bool bEnable);
    ...

}

  7. 方法實現在 vendor\mstar\supernova\projects\tvos\tvmanager\libtvmanager\TvManager.cpp:

bool TvManager::setHdmiOutAudioMute(bool bOnOff)
{
    ALOGV("TvManager setHdmiOutAudioMute\n");
    return getITvManager()->setHdmiOutAudioMute(bOnOff);
}

  后面就跳躍到 mstar 的 supernova 層。

 

四、Supernova層

  1. TvManager 的 setHdmiOutAudioMute 實現在 vendor\mstar\supernova\projects\tvos\tvmanager\libtvmanagerservice\

bool TvManagerService::Client::setHdmiOutAudioMute(bool bOnOff){
    TVOS_API_ESTIMATE_START()
    TVOS_API_ESTIMATE_START(LOCK)
    Mutex::Autolock lock(m_FuncLock);
    TVOS_API_ESTIMATE_END(LOCK)
    ALOGV("TvManagerService::Client::setHdmiOutAudioMute\n");
    
    bool ret = FALSE;

    ret = MSrv_Control::GetInstance()->setHdmiOutAudioMute(bOnOff);

    TVOS_API_ESTIMATE_END()
    return ret;
}

  2. 最終方法實現在vendor\mstar\supernova\projects\tvos\tvmanager\libtvmanagerservice\TvManagerService.cpp,后面便是通過I2C接口對HDMI控制器的操作。

bool TvManagerService::Client::setHdmiOutAudioMute(bool bOnOff){
    TVOS_API_ESTIMATE_START()
    TVOS_API_ESTIMATE_START(LOCK)
    Mutex::Autolock lock(m_FuncLock);
    TVOS_API_ESTIMATE_END(LOCK)
    ALOGV("TvManagerService::Client::setHdmiOutAudioMute\n");
    
    bool ret = FALSE;

    ret = MSrv_Control::GetInstance()->setHdmiOutAudioMute(bOnOff);

    TVOS_API_ESTIMATE_END()
    return ret;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM