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 引用本论文 ...
随机推荐
- 并发编程.md
操作系统基础 人机矛盾: CPU利用率低 磁带存储+批处理:降低数据的读取时间,提高CPU的利用率 多道操作系统------在一个任务遇到IO的时候主动让出CPU,给其他任务使用 由操作系统完成 切换 ...
- 在Linux命令行中操作PDF
pdftk 命令提供了许多处理 PDF 的命令行操作,包括合并页面.加密文件.添加水印.压缩文件,甚至还有修复 PDF. 虽然 PDF 通常被认为是相当稳定的文件,但在 Linux 和其他系统上你可以 ...
- The 2019 Asia Nanchang First Round Online Programming Contest The Nth Item
The Nth Item 思路: 先用特征根法求出通向公式,然后通向公式中出现了\(\sqrt{17}\),这个可以用二次剩余求出来,然后可以O(\(log(n)\))求出. 但是还不够,我们先对\( ...
- Python读excel——xlrd
Python读excel——xlrd Python读取Excel表格,相比xlwt来说,xlrd提供的接口比较多,但过程也有几个比较麻烦的问题,比如读取日期.读合并单元格内容.下面先看看基本的操作: ...
- HDU-1237- 简单计算器--栈的基本应用
简单计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不 ...
- 前端笔记-bom
BOM对象 BOM即浏览器对象模型,它与dom不同的是可以操作浏览器窗口,使用它的接口我们可以改变窗口,状态栏,文本,及其他与除页面以外其他动作,使得js可以和我们浏览器进行沟通 窗口 即window ...
- logging 为全局的日志工具对象添加日志记录器
def log_file(LEVEL_NAME): # 设置日志的记录等级,常见的有四种,大小关系如下,DEBUG < INFO < WARNING <ERROR # 一旦设置级别, ...
- js对iframe内外(父子)页面进行操作
dom对象推荐阅读 怎么对iframe进行操作,1.在iframe里面控制iframe外面的js代码.2.在父框架对子iframe进行操作. 获取iframe里的内容 主要的两个API就是conten ...
- 2019HDU多校第九场 Rikka with Quicksort —— 数学推导&&分段打表
题意 设 $$g_m(n)=\begin{cases}& g_m(i) = 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ...
- 使用jQuery快速高效制作网页交互特效--初始jQuery
一. jQuery基本概念介绍 1.1 什么是jQuery一个javascript库,把常用方法写到一个js文件中,需要的时候直接调用即可学习jQuery就是学习一些方法 ...