|
|
1. TVMW目录为TV中间件实现代码,代码目录:
|
|
|
vendor/mwvendor/modules/tvmw
|
|
|
├── adapter
|
|
|
│ ├── tv_instruct.h
|
|
|
│ └── tv_cus_instruct.h //编译客制化目录时会将custom/customer_reference/instruct/tv_cus_instruct.h复制至此
|
|
|
├── api
|
|
|
│ ├── cplusplus //C++ API 编译客制化目录时会将custom/customer_reference/cppapi复制至此
|
|
|
│ └── java //Java API 编译客制化目录时会将custom/customer_reference/java复制至此
|
|
|
├── common
|
|
|
├── custom //客制化相关代码、 公版mwvendor ini文件和客户ini文件
|
|
|
│ ├── customer_reference // 客户项目定制化代码参考;
|
|
|
│ ├── mwvendor // huanglong公版定制化代码;
|
|
|
│ └── xxx // 客户参考customer_reference添加客户自己的项目定制化目录和代码;
|
|
|
├── debug
|
|
|
│ ├── aqdebug
|
|
|
│ └── tvdebug
|
|
|
├── external //git库不track此目录,此目录编译时创建,将custom目录下的mwvendor或custom_reference目录下的差异化实现的代码
|
|
|
│ (即不包括客制化的C++或Java接口)复制到本目录,编译入libimtvservice.so动态库
|
|
|
├── framework //framework层,主要用于封装或集成各驱动模块的UAPI接口和数据结构,供logic层调用
|
|
|
├── include
|
|
|
├── logic //logic层,主要包含了module_api、player、picture、audio、system等业务逻辑,
|
|
|
│ module_api目录为logic层封装给C++、Java API调用的模块接口封装层
|
|
|
├── scripts
|
|
|
└── tvservice
|
|
|
│
|
|
|
└── cfg.mak // 定义TVMW_CUSTOM选择客户机型编译目录.
|
|
|
注: tvmw/cfg.mak中TVMW_CUSTOM选择客户机型编译目录,如:
|
|
|
TVMW_CUSTOM := custom/mwvendor //编译 公版代码 + custom/mwvendor 目录代码;
|
|
|
TVMW_CUSTOM := custom/customer_reference //编译 公版代码 + custom/customer_reference 目录代码;
|
|
|
TVMW_CUSTOM := custom/xxxx //编译 公版代码 + custom/xxxx 目录代码.
|
|
|
|
|
|
2.客户修适配TV中间件规则:
|
|
|
1>. 客户客制化代码全部放在custom/customer_reference目录下,客户不要直接修改huanglong公版的所有文件;
|
|
|
2>. 客户所有实现代码可都在客制化目录custom/customer_reference下实现,编译时会将客制化目录下对应代码文件复制至公版相应目录下,并编译进行相应动态库;
|
|
|
3>. 客户版本升级,可直接拷贝项目定制化目录,而不用关心huanglong发布版本修改具体内容,方便维护和升级;
|
|
|
4>. 如果客户确实存在客制化目录下无法实现的功能,请反馈给huanglong TVMW部门;
|
|
|
5>. 客制化详细可参考发布包中"TVMW3.0 客制化 开发指南 .pdf"文档.
|
|
|
|
|
|
2. 定制化参考customer_reference目录介绍:
|
|
|
customer_reference:
|
|
|
├── source : 客户功能实现目录,可多个cpp和h文件,可多个目录,文件名无要求;
|
|
|
├── include : 客户功能实现头文件,也可为空,直接放在source目录中;
|
|
|
├── cppapi : C++接口客户功能添加,文件名为CusEx.cpp/CusEx.h/ICusEx.h,文件名不要修改,如客户使用JAVA接口,不需要C++接口,可不需要此目录;
|
|
|
├── java : 客户功能JAVA接口实现,文件名为CusExImpl.java/CusEx.java,不要修改;
|
|
|
├── instruct : 客户功能invoke指令ID定义,文件为tv_cus_intruct.h,不要修改;
|
|
|
└── ini : 客户项目ini文件,可参考huanglong公版tvmw\custom\mwvendor\ini下对应ini文件再修改与硬件或数据库默认值相关的定制化配置.
|
|
|
注:
|
|
|
1>. 如客户扩展功能使用JAVA接口,不需要C++接口,可不需要cppapi目录, java代码直接invoke方式调用实现;
|
|
|
参考CusExImpl.java中cus_set_xxx实现"MwtvManager.getInstance().excuteCommandSet(CMD_ID_EX_CUS_SET_XXX, val)".
|
|
|
2>. 如客户扩展功能需C++接口,cppapi、instruct目录下文件名不要修改,可在对应TODO部分添加客户功能实现代码;
|
|
|
3>. 每次版本升级,注意对比huanglong公版tvmw\custom\mwvendor\ini下对应ini文件同步升级.
|
|
|
|
|
|
2. 客户中间件功能实现参考customer_reference/source/tv_cus_set.cpp中init代码部分:
|
|
|
static td_s32 init(IDispatch * dispatch)
|
|
|
{
|
|
|
LOGI("customer cus module init");
|
|
|
|
|
|
#if 1 //数据库客制化,创建新数据库,添加数据节点,参考tv_cus_dat.cpp中实现
|
|
|
cus_db_init();
|
|
|
#endif
|
|
|
|
|
|
#if 1 //公版已存在数据库数据定义,但格式与客户不一样,客户定制私有数据查询和更新
|
|
|
MW_DBO_CB_S sDboCallBack;
|
|
|
sDboCallBack.pfnDbUpdateCb = cus_db_update_cb;
|
|
|
sDboCallBack.pfnDbQueryCb = cus_db_query_cb;
|
|
|
sDboCallBack.pfnDbQueryManyCb = cus_db_query_many_cb;
|
|
|
MwDBOFact::getDBO()->registerOpCb(&sDboCallBack);
|
|
|
#endif
|
|
|
|
|
|
#if 1 //图像模式设置,除公版已经定义的图像模式中各项设置外,客户有私有数据设置
|
|
|
MW_CUS_PICMODE_CB pfnCusPicModeCb = cus_picturemode_additional;
|
|
|
MwPicture::instance()->registerCusPicModeCB(pfnCusPicModeCb);
|
|
|
#endif
|
|
|
|
|
|
#if 1 //声音模式设置,除公版已经定义的声音模式中各项设置外,客户有私有数据设置
|
|
|
MW_CUS_SOUNDMODE_CB pfnCusSoundModeCb = cus_soundmode_additional;
|
|
|
MwAudio::instance()->registerCusSoundModeCB(pfnCusSoundModeCb);
|
|
|
#endif
|
|
|
|
|
|
td_u32 i;
|
|
|
#if 1 //定制添加invoke指令调用功能实现,客户需封装C++或JAVA接口
|
|
|
for (i = 0; i < sizeof(g_astCusAddModuleLocalAtomicInfo)/sizeof(LocalAtomicInfo); i++)
|
|
|
{
|
|
|
dispatch->insertInterface(g_astCusAddModuleLocalAtomicInfo[i].id, g_astCusAddModuleLocalAtomicInfo[i].pfn);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
#if 1 //定制替换公版已经定义的invoke指令调用功能实现
|
|
|
for (i = 0; i < sizeof(g_astCusRepalceModuleLocalAtomicInfo)/sizeof(LocalAtomicInfo); i++)
|
|
|
{
|
|
|
dispatch->replaceInterface(g_astCusRepalceModuleLocalAtomicInfo[i].id, g_astCusRepalceModuleLocalAtomicInfo[i].pfn);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
#if 1 //控制驱动pq模块客户化功能回调,例如替换invoke指令功能SetBackLight,此处替换MW内部所有非invoke调用背光设置实现
|
|
|
MW_PQCTRL_CB_S stPqCtrlCb;
|
|
|
memset(&stPqCtrlCb, 0, sizeof(MW_PQCTRL_CB_S));
|
|
|
stPqCtrlCb.pfnSetBackLightCb = cus_SetBackLight;
|
|
|
stPqCtrlCb.pfnSetDemoCb = cus_SetDemo;
|
|
|
//stPqCtrlCb.pfnGetBackLightCb = cus_GetBackLight;
|
|
|
MwPQCtrl::instance()->registerOpCb(&stPqCtrlCb);
|
|
|
#endif
|
|
|
|
|
|
#if 1 //客户定制EDID和HDCP KEY
|
|
|
cus_get_hdcp_key(&g_stCusHdcpEdid);
|
|
|
cus_get_edid(&g_stCusHdcpEdid);
|
|
|
MwVideoPlay::updateHdcpEdid(&g_stCusHdcpEdid);
|
|
|
#endif
|
|
|
|
|
|
#if 1 //客户定制比例模式的overscan裁剪和输出窗口计算算法
|
|
|
MW_CONFIG_CALLBACK_S stAspectCb;
|
|
|
stAspectCb.enConfigType = MW_DISPLAY_CONFIG_ASPECT;
|
|
|
stAspectCb.unCfgCallback.stAspectCb.pfnAspectCropCb = cus_aspect_crop_cb;
|
|
|
stAspectCb.unCfgCallback.stAspectCb.pfnAspectDispCb = cus_aspect_disp_cb;
|
|
|
MwVideoPlay::registerCfgCb(&stAspectCb);
|
|
|
#endif
|
|
|
|
|
|
#if 1 //保存TVMW音频参数到EMMC裸分区/EEPROM/文件系统中文件,用于不能从MW数据库设置音频参数场景
|
|
|
MW_CONFIG_SND_CALLBACK_S stConfigCb;
|
|
|
stConfigCb.enConfigType = MW_SOUND_CONFIG_PRECIVOL;
|
|
|
stConfigCb.unCfgCallback.stPreciVolCb.pfnPreciVolCb = cus_precivol_cb;
|
|
|
MwAudioPlay::registerCfgCb(&stConfigCb);
|
|
|
|
|
|
stConfigCb.enConfigType = MW_SOUND_CONFIG_PRESCALE;
|
|
|
stConfigCb.unCfgCallback.stPrescaleCb.pfnPrescaleCb = cus_prescale_cb;
|
|
|
MwAudioPlay::registerCfgCb(&stConfigCb);
|
|
|
#endif
|
|
|
|
|
|
#if 1 //注册回调在端子各种播放场景下(creat/destroy/start/stop/设置音频和PQ参数)定制客户设置
|
|
|
MwSourceManager::instance()->registerListener(new cusTvListener);
|
|
|
#endif
|
|
|
|
|
|
//TODO: 其它客户化设置 start
|
|
|
// 例如 1. 客户重新刷新数据库数据为客户私有数据;
|
|
|
// 2. 客户新功放初始化控制;
|
|
|
// ......
|
|
|
//
|
|
|
// 其它客户化设置 end
|
|
|
|
|
|
return TD_SUCCESS;
|
|
|
}
|
|
|
|
|
|
注 : 客户需要定制化某部分功能,可打开"#if 1",并修改对应功能实现(参考TODO:部分),如不需要,请 "#if 0"屏蔽此扩展功能.
|