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 = ; 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 < , "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 = ; i <= USER_ACTIVITY_EVENT_LAST; i++) {
gLastEventTime[i] = LLONG_MIN;
}
gPowerManagerServiceObj = NULL;
return ;
}
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 -;
}
} 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;
}
Android:Mstar平台 HDMI OUT 静音流程的更多相关文章
- Android 4.4 Kitkat Phone工作流程浅析(六)__InCallActivity显示更新流程
本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...
- Android 7.0 Power 按键处理流程
Android 7.0 Power 按键处理流程 Power按键的处理逻辑由PhoneWindowManager来完成,本文只关注PhoneWindowManager中与Power键相关的内容,其他 ...
- Android 4.4 Kitkat Phone工作流程浅析(八)__Phone状态分析
本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象.与Google原生AOSP有些许差异.请读者知悉. ...
- Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程
本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...
- unity3d-配置Android环境,打包发布Apk流程详解
31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android ...
- mstar 平台I2C 配置
芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换. 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置:// 如LED,屏的电源,背光的开关,功放的静音等等 ...
- 作业一:android开发平台的演变以及Android Studio设置
目录: ①. 从Eclipse到Android Studio ②. Android Studio的下载和安装 ③. 用户习惯设置以及快捷键 ④. SDK路径重新设置 ↓点此跳转到文 ...
- Android 开发平台的演变史
Android开发平台的发展(并不是很懂) Eclipse 首先是由IBM的一个项目小组花了两年时间开发完成的,当时主要解决IBM开发工具 Visual Age for Java 和 WebSpher ...
- 论文第5章:Android绘图平台的实现
面向移动设备的矢量绘图平台设计与实现 Design and Implementation of Mobile Device-oriented Vector Drawing Platform 引用本论文 ...
随机推荐
- MySql 安装及实用笔记
安装 更新 rpm 包 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm 安装MySql yum - ...
- Linux命令——getent
简介 getent命令帮助用户administrative databases中查找相关信息.administrative databases包括: passwd – can be used to c ...
- LESS简介与使用方法
less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. 一.传统写法与 less 写法对比 1. 传统 css 写法: .con ...
- HDU_2717_Catch That Cow
很短的 BFS 队列 HDU_2717_Catch That Cow #include<iostream> #include<algorithm> #include<cs ...
- css定位篇
1.浮动的特性: 1.浮动的元素脱标 2.浮动的元素互相贴靠 3.浮动的元素有“字围”效果 4.收缩的效果 前提是标准文档流,margin的垂直方向会出现塌陷问题. 如果盒子居中:margin:0 a ...
- 《ABCD组》实验十一 团队作业7:团队项目设计完善&编码
<ABCD组>实验十一 团队作业7:团队项目设计完善&编码 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在 ...
- H3C常见视图及命令
H3C常见视图及命令 H3C Comware的视图模式 1.用户视图:查看系统的硬件和系统的信息 2.系统视图(类似于Cisco的配置模式) 3.路由协议视图 4.接口视图 5.用户界面视图 各种视图 ...
- TCP服务端实现并发
socket 在 tcp 协议下通信 客户端 import socket # 创建客户端TCP协议通信 c = socket.socket() # 与指定服务端握手 c.connect(('127 ...
- 2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)
题目链接:https://codeforces.com/gym/101991/problem/G 题意:给出 n 个数,q 次询问区间[ li,ri ]之间有多少个 GCD = di 的连续子区间. ...
- Spring事务管理器
1.创建实体和接口 public class Bank { private Integer id; private String name; private String manay; public ...