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 [email protected]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);
}

  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 MSrv_Control_common::setHdmiOutMute(const BOOL bOnOff)
{
    if(MDrv_NT68411_Exist())
    {
        if(bOnOff == FALSE)
        {
            MDrv_NT68411_Write(NT68411_SUBCMD_HDMI_MUTE, HDMI_MUTE_OFF);
        }
        else
        {
            MDrv_NT68411_Write(NT68411_SUBCMD_HDMI_MUTE, HDMI_MUTE_ON);
        }
    }
    return TRUE;
}

原文地址:https://www.cnblogs.com/blogs-of-lxl/p/12015868.html

时间: 2024-11-06 07:33:31

Android:Mstar平台 HDMI OUT 静音流程的相关文章

unity3d-配置Android环境,打包发布Apk流程详解

31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android环境,打包发布安卓流程 一:SDK与JDK下载地址:http://pan.baidu.com/s/1mhVaXHe下载完成后,解压文件 SDK文件 二.安装 JDK 运行安装程序jdk-7u67-windows-x64 Java-JDK 分别点击下一步进行安装. 安装中 在安装过程中先后会出现两次选

Android 4.4 Kitkat Phone工作流程浅析(六)__InCallActivity显示更新流程

本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. 前置文章: <Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划> <Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析> <Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程

Android 4.4 Kitkat Phone工作流程浅析(十一)__PSensor工作流程浅析

本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. 前置文章: <Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划> <Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析> <Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析> <Android 4.4 Kitkat Phone工作流程浅析(四)__RI

Android 4.4 Kitkat Phone工作流程浅析(八)__Phone状态分析

本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. 前置文章: <Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划> <Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析> <Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程

Android 7.0 Power 按键处理流程

Android 7.0  Power 按键处理流程 Power按键的处理逻辑由PhoneWindowManager来完成,本文只关注PhoneWindowManager中与Power键相关的内容,其他系统按键的处理类似也是在PhoneWindowManager中处理的.理解了power按键的处理再看其他系统按键的逻辑会容易的多也简单的多. 一.Power按键的上报 Power按键的上报流程与其余的按键处理流程一致,在按下power按键后驱动上报按键经InputManagerService处理按键

Android 4.4 Kitkat Phone工作流程浅析(九)__状态通知流程分析

本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. 前置文章: <Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划> <Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析> <Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程

Android 4.4 Kitkat Phone工作流程浅析(十)__&quot;通话显示&quot;查询流程

本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. 前置文章: <Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划> <Android 4.4 Kitkat Phone工作流程浅析(二)__UI结构分析> <Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程

mstar 平台I2C 配置

芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换. 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置:// 如LED,屏的电源,背光的开关,功放的静音等等. 除了控制设置之外,还需要和外部设置传输数据.pin 作为GPIO 设置为IN时,是获取外设的高低来判断外设的状态,最常用的一些source 通道的detect,及一些wakeup 功能.pin 作为SAR 口,获取ADC值: // 如按键板,参照“mstar平台SAR口使用”pin 作为UART

基于微信硬件公众平台的智能控制开发流程

一.微信硬件公众平台整体架构 上一篇<物联网架构场景技术分析>已经探讨和分析了物联网架构的演进,基于微信硬件公众平台的智能控制方案即属于文中的第三种架构--基于统一后台服务的物联架构.其中的架构如下: 各部分的角色和分工如下: 1.微信硬件公众号平台服务器,是物联网的基础和核心部分,其负责外设设备ID的认证,类似公安部给每个公民一个身份证一样,保证每个外设都有一个合法并且唯一的ID.目前微信平台的设备ID由两部分组成,一部分是厂商运维的公众号(即手机微信关注的公众号)的原始ID,称为设备类型,