Files
2026-08-24 10:03:24 +08:00

116 lines
2.6 KiB
C++

/*
* Copyright (c) 2014 Amlogic, Inc. All rights reserved.
*
* This source code is subject to the terms and conditions defined in the
* file 'LICENSE' which is part of this source code package.
*
* Description: c++ file
*/
#define LOG_MODULE_TAG "TV"
#define LOG_CLASS_TAG "CTvResman"
#include <cstddef>
#include "CTvLog.h"
#include "CTvResman.h"
CTvResman *CTvResman::mInstance;
CTvResman::CTvResman()
{
mOnPreemptRegistered = false;
mResmanFd = -1;
}
CTvResman::~CTvResman()
{
Resman_Release();
}
CTvResman *CTvResman::getInstance()
{
if (nullptr == mInstance) {
mInstance = new CTvResman();
}
return mInstance;
}
void CTvResman::onResPreemptCallback(void* param)
{
LOGE("%s :resmanage onpreemt.\n", __FUNCTION__);
CTvResman *mTvResman = (CTvResman*) param;
if (mTvResman->getResmanHandle() != -1) {
LOGD("%s :wait implement it\n", __FUNCTION__);
}
}
int CTvResman::getResmanHandle()
{
return mResmanFd;
}
bool CTvResman::Resman_Request(int app_type, int res_type, int timeout,const char *arg)
{
LOGD("%s:start request resource %d\n", __FUNCTION__, res_type);
if (mResmanFd == -1)
mResmanFd = resman_init("tvserver", app_type);
if (!mOnPreemptRegistered) {
resman_register(mResmanFd, onResPreemptCallback, this);
mOnPreemptRegistered = true;
}
if (!resman_acquire_para(mResmanFd, res_type, timeout, 0, arg)) {
LOGE("%s:res_acquire(handle=%d,res=%d) failed!!!\n",
__FUNCTION__,mResmanFd,res_type);
return false;
}
LOGD("%s:tvserver request resource (%d) done\n", __FUNCTION__, res_type);
return true;
}
int CTvResman::Resman_Query(void * res_status)
{
int ret;
if (mResmanFd == -1)
mResmanFd = resman_init("tvserver", RESMAN_APP_GST);
if (mResmanFd == -1)
return -1;
if (!mOnPreemptRegistered) {
resman_register(mResmanFd, onResPreemptCallback, this);
mOnPreemptRegistered = true;
}
ret = resman_query(mResmanFd, (struct resman_para *) res_status);
return ret;
}
void CTvResman::Resman_FreeRes(int res_type)
{
if (mResmanFd == -1)
return;
if (resman_release(mResmanFd, res_type)) {
LOGE("%s:Resman_FreeRes(handle=%d,res=%d) failed!!!\n",
__FUNCTION__,mResmanFd,res_type);
return;
}
}
void CTvResman::Resman_Release()
{
if (mResmanFd != -1) {
if (mOnPreemptRegistered) {
resman_unregister(mResmanFd);
mOnPreemptRegistered = false;
}
resman_close(mResmanFd);
mResmanFd = -1;
}
}