您现在的位置是:首页 > 正文

mstar android 怎么连接电脑,Android:Mstar平台 HDMI OUT 静音流程

2024-02-01 01:43:04阅读 4

一、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<:mutex> lock(gPowerHalMutex);if(getInputHal()) {

Return ret = gInputHal->setHdmiOutAudioMute(onOff);if (!ret.isOk()) {

ALOGE("Failed to SetHdmiOutAudioMute.");return false;

}returnret;

}

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的获取:

boolgetInputHal(){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 :

interfaceIMstarTvInput

extends android.hardware.tv.input@1.0::ITvInput {

@callflow(next="*")//EpgManager function(31/32)

...

setHdmiOutAudioMute(boolbEnable)

generates (boolresult);

...

}

2. 接口的定义 vendor\mstar\hardware\interfaces\tv\input\1.0\default\TvInput.h, TvInput 又继承于 IMstarTvInput :

struct TvInput : publicIMstarTvInput {

TvInput(mstar_tv_input_device_t*device);~TvInput();/*mstar tv interface*/...

Return setHdmiOutAudioMute(boolbEnable);

...

}

3. 具体的方法实现在 vendor\mstar\hardware\interfaces\tv\input\1.0\default\TvInput_TvManager.cpp

Return TvInput::setHdmiOutAudioMute(boolbEnable){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#include"tvmanager/TvManager.h"

using::mstar::hardware::tv::input::V1_0::ITvManagerType;

typedefstructmstar_TvManager_dev {

......bool (*setHdmiOutAudioMute)(boolbEnable);

......

}

5. 其方法实现在 vendor\mstar\hardware\tv_input\mstar_tv_input_TvManager.cpp

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

}

g_pTvManagerImpl 是通过 TvManager 转换所得:

void mstar_tv_input_TvManager::registerTvManagerInstance(sp &ptr) {

g_pTvManagerImpl=ptr;

}

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

class TvManager : virtual publicRefBase

{public:

TvManager();~TvManager();static spconnect();voidHIDLconnect();static voiddisconnect();

status_t setListener(const sp&listener);

...static bool setHdmiOutAudioMute(boolbEnable);

...

}

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

bool TvManager::setHdmiOutAudioMute(boolbOnOff)

{

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(boolbOnOff){

TVOS_API_ESTIMATE_START()

TVOS_API_ESTIMATE_START(LOCK)

Mutex::Autolocklock(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()returnret;

}

2. 最终方法实现在vendor\mstar\supernova\projects\tvos\tvmanager\libtvmanagerservice\TvManagerService.cpp,后面便是通过I2C接口对HDMI控制器的操作。

BOOL MSrv_Control_common::setHdmiOutMute(constBOOL 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);

}

}returnTRUE;

}

网站文章

  • Docker优化下载镜像速度

    代码】Docker优化下载镜像速度。

    2024-02-01 01:42:59
  • 少女银四失足,偶得“阿里Java神级题库(25专题)”,金九稳了

    少女银四失足,偶得“阿里Java神级题库(25专题)”,金九稳了

    Java面试的时候你被提过哪些问题?网上有很多面经可以参考(各种博客),现在网上一个面经资源比较集中的就是牛客网的笔试面试讨论板块,但是也有一些大神会总结一些互联网大厂的面试题或者一些高频会考到的面试...

    2024-02-01 01:42:52
  • EPICS libCom库(5) -- myfreeList

    EPICS libCom库(5) -- myfreeList

    2024-02-01 01:42:36
  • Android侧滑删除-RecyclerView轻松实现高效的侧滑菜单

    Android侧滑删除-RecyclerView轻松实现高效的侧滑菜单

    效果: recycleview依赖 compile(&#39;com.android.support:recyclerview-v7:25.1.1&#39;) { force = true } 1、adapter类: Extension 是自定义类 public class RecOtherTypeAdapter extends RecyclerView.Adapter&lt;RecOt...

    2024-02-01 01:42:08
  • 闲聊31天重构-第0天:序言

    序言M:这是我在学习《Refactoring》的时候,由于理解能力不足,很多地方都看不太懂。这时候发现网友IT少年链接(C版本)。他翻译了一外国网友英文链接对Refactoring.com重构知识31天学习的总结。在这里我将先借用网友的案例,参考IT少年的翻译,编写重构番外篇。在理解大体知识后,再对原著《Refactoring》继续学习。感谢两位网友的技术分享。...

    2024-02-01 01:42:00
  • 一文透彻理解分布式微服务架构及相关组件

    一文透彻理解分布式微服务架构及相关组件

    本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节。要理解微服务,首先要先理解不是微服务的那些。通常跟微服务相对的是单体应用,即将所有功能都打包成在一个独立单元的应用程序。从单体应用到微服务并不是一蹴而就的,这是一个逐渐演变的过程。本文将以一个网上超市应用为例来说明这一过程。

    2024-02-01 01:41:18
  • java中创建进程和线程

    java中创建进程和线程

    Java并发编程:如何创建线程?   在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务。下面先讲述一下Java中的应用程序和进程相关的概念知...

    2024-02-01 01:41:12
  • 支付中的业务逻辑|支付幂等性 最新发布

    支付中的业务逻辑|支付幂等性 最新发布

    幂等性就是指“一个操作任意多次执行所产生的影响均与一次执行的影响相同。幂等性其实是一个数学上的概念,在计算机领域,幂等是指一个方法被多次重复执行的时候所期望的结果要和第一次执行期望的结果保持一致。

    2024-02-01 01:41:05
  • 覆盖率工具gcov,lcov实践

    覆盖率工具gcov,lcov使用记录 背景 本文记录的是gcov和lcov在统计一个分布式数据库的代码覆盖率过程中遇到的问题。 介绍 *gcov是一个测试代码覆盖率的工具,随着gcc一起发布,不需要进...

    2024-02-01 01:40:25
  • Java 进程 CPU 100% 问题排查

    Java 进程 CPU 100% 问题排查

    如果在时间片内,线程一直占有,则认为是 CPU 100% 。CPU 运行速度很快,即主频非常高,除非密集型耗费 CPU 的运算,其它类型任务一般都会在小于时间片的时间内结束。

    2024-02-01 01:40:19