#include "stdafx.h" #include "y2k_time.h" #include "capture.h" #include "Event.h" #include "iaudiorenderinterface.h" #include "EventCode.h" #include "../mod_snapshot/Event.h" #include "mod_mediacontroller.h" #include "../mod_interactivecontrol/Event.h" #include "../mod_recorder/Event.h" #include "../mod_ScannerSet/ScannerSet_client_g.h" #include "../mod_ScannerSet/ScannerSet_def_g.h" using namespace ScannerSet; static void __audio_render_log(void* user_data, const char* fmt, va_list arg) { int n = _vscprintf(fmt, arg); if (n >= MAX_PATH) { char* buf = (char*)malloc((size_t)(n + 1)); _vsnprintf(buf, n + 1, fmt, arg); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", buf); free(buf); } else{ char strlog[MAX_PATH] = {0}; _vsnprintf(strlog, MAX_PATH, fmt, arg); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", strlog); } } CMediaControllerEntity::CMediaControllerEntity() : m_capture(NULL), m_salesaudio_capture(NULL), m_lCaptureEnvCount(0), m_nCameraErrorCode(Error_Succeed), m_lCaptureEnvOptCount(0), m_lCaptureOptCount(0), m_iEnvEmptyTimes(0), m_iOptEmptyTimes(0), m_bSendCameraError(false), m_nEnvCameraRestartNum(0), m_nOptCameraRestartNum(0), m_nCameraCount(2), m_pSelfcheckClient(NULL), strFrontCam("$"), strRearCam("$"), strEnvCam("$"), strUSBCam("$"), m_bCustomerwareBegin(false), m_pAudioRenderObj(NULL), m_bRecordPCM(false), m_bIsRemoteRecord(false), m_bHasStartSpeakerRender(false), m_strAudioPriority(""), m_bDeskToPadFlag(true) { m_bNeedPost = false; m_VideoCapType = 1; m_bSpeakerCap = true; m_strEnvCam = "$"; m_strOptCam = "$"; m_strHandfreeIn = "$"; m_strHandfreeOut = "$"; m_pMediaControllerChannel = NULL; m_bConnectedAssist = FALSE; m_iCamTimeout = CAMERA_TIMEOUT; m_iCamOnMode = 0; m_iDelayTime = RVC_MAX_DELAY_TIME; } void CMediaControllerEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName) { if (_stricmp(pszKey, SYSVAR_CALLTYPE) == 0) { if(pszValue[0] == CALLTYPE_NORMAL) { m_nSysCallType = 0; } else if(pszValue[0] == CALLTYPE_MOBILE) { m_nSysCallType = 1; } else { m_nSysCallType = -1; } } else if (_stricmp(pszKey, SYSVAR_CALLSTATE) == 0) { CSimpleStringA strState; GetFunction()->GetSysVar("UIState", strState); if ('C' == pszValue[0]) { if (1 == m_iCamOnMode) { if (!m_bStartCamera) { StartCameraAndSetSysVar(); if (m_bStartCamera) { OnCameraStarted(); } } else { if (strState.GetLength() > 0 && strState[0] == 'M') { if (Error_Succeed != GetFunction()->KillTimer(3)) { LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_KILLTIMER_ERROR, "Call State is Connecting, and UIState is M, KillTimer 3 failed."); } } } } } else if ('O' == pszValue[0]){ if (1 == m_iCamOnMode) { if (strState.GetLength() > 0 && strState[0] == 'M') { if (m_bStartCamera) { if (Error_Succeed != GetFunction()->SetTimer(3, this, m_iDelayTime * 1000)) { LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_SETTIMER_ERROR, "Call State is OffLine, and UIState is M, SetTimer 3 failed."); } } } } } } } void CMediaControllerEntity::OnPreStart(CAutoArray strArgs,CSmartPointer pTransactionContext) { m_eDeviceType = eStand2sType; g_eDeviceType = eStand2sType; //is Pad Version m_eDeviceType = RvcGetDeviceType(); g_eDeviceType = m_eDeviceType; CSmartPointer Func = GetFunction(); CSimpleStringA strValue; Func->RegistSysVarEvent(SYSVAR_CALLTYPE, this); Func->GetSysVar(SYSVAR_CALLTYPE, strValue); if (strValue[0] == CALLTYPE_NORMAL) { m_nSysCallType = 0; } else if (strValue[0] == CALLTYPE_MOBILE) { m_nSysCallType = 1; } else { assert(0); } if (GetFunction()->RegistSysVarEvent("SessionID", this) != Error_Succeed){ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", "SessionID"); } if (GetFunction()->RegistSysVarEvent(SYSVAR_CALLSTATE, this) != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", SYSVAR_CALLSTATE); } int i = 0; m_arrListener.Init(16); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, MOD_EVENT_SNAPSHOT_START_CAPTURE_ENV); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, MOD_EVENT_SNAPSHOT_START_CAPTURE_OPT); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, MOD_EVENT_SNAPSHOT_START_CAPTURE_ENVOPT); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS,NULL,false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_CUSTOMERAWARE_BEGIN, NULL, false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_CUSTOMERAWARE_END, NULL, false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_RECORDFAILED,NULL,false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RECORDFAILED,NULL,false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTREMOTERECORD,NULL,false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPREMOTERECORD,NULL,false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORD,NULL,false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPRECORD,NULL,false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORDPREVIEW,NULL,false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_SALESRECORDER_STARTED_SUCCESS, NULL, false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_BEGIN_HANDLE_BUSINESS, NULL, false); GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_END_HANDLE_BUSINESS, NULL, false); pTransactionContext->SendAnswer(Error_Succeed); } void CMediaControllerEntity::OnStarted() { m_bStartCamera = FALSE; m_bExternControlCam = FALSE; m_nSysCallType =0; m_xIdlePre = m_xKernelPre = m_xUserPre = 0; ErrorCodeEnum Error = Error_Succeed; //MessageBoxA(0,0,0,0); m_pMediaControllerChannel = new ChannelMediaControllerClient(this); if (Error_Succeed == ConnectAssistChannel()) { m_bConnectedAssist = TRUE; } m_pSelfcheckClient = new SelfChekerClient(this); Error = m_pSelfcheckClient->Connect(); if (Error != Error_Succeed){ m_pSelfcheckClient->SafeDelete(); m_pSelfcheckClient = NULL; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SelfcheckClient connect fail!"); } if (Error_Succeed == GetMediaConfig()) { //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get video capture frame type (%d) success.", m_VideoCapType); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_strEnvCam = %s, m_strOptCam = %s.", m_strEnvCam.GetData(), m_strOptCam.GetData()); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cam timeout time is %d.", m_iCamTimeout); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CamOnMode is %d, and max delay time is %d.", m_iCamOnMode, m_iDelayTime); } if (Error_Succeed == GetSalesRecordAudioParam()) { //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get sales record audio param success, record local PCM flag is %s.", m_bRecordPCM ? "true" : "false"); } audiorender_callback_t t_callback = { 0 }; t_callback.debug = &__audio_render_log; t_callback.user_data = this; m_pAudioRenderObj = CreateIAudioRenderObj(&t_callback); if (NULL == m_pAudioRenderObj){ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create audio render failed."); } memset(&conf,0,sizeof(capture_config_t)); memset(&m_sales_audio_conf, 0, sizeof(rvc_audio_capture_config_t)); Error = (ErrorCodeEnum)capture_lib_init(&m_iAudioInCount, &m_iAudioOutCount, m_strAudioIn, m_strAudioOut); if (Error == Error_Succeed) { Error = LoadConfig(&conf); conf.video_cap_type = m_VideoCapType; //video capture type 0 RGB24, 1 YUY2 if (Error!=Error_Succeed) { if((Error == Error_OptCamera)||(Error == Error_EnvCamera)) { if (Error == Error_EnvCamera) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Load EnvCamera Config failed!"); SetCameraSysVar(CAMERA_ENV_ERROR); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_ENV_ERROR"); m_nCameraErrorCode = Error_EnvCamera; GetFunction()->SetUserDefineState(USER_MEDIA_ENVERRROR); } else if (Error == Error_OptCamera) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Load OptCamera Config failed!"); SetCameraSysVar(CAMERA_OPT_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_OPT_ERROR"); m_nCameraErrorCode = Error_OptCamera; GetFunction()->SetUserDefineState(USER_MEDIA_OPTERROR); } } else { if (Error == Error_AllCamera) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Load all camera Config failed!"); SetCameraSysVar(CAMERA_BOTH_ERROR); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_BOTH_ERROR"); m_nCameraErrorCode = Error_AllCamera; GetFunction()->SetUserDefineState(USER_MEDIA_ALLERROR); } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Load Config failed!"); } } } else{ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("capture_lib_init failed!"); } //PAD版获取客户感知状态 CSimpleStringA strCustomerAware; if (Error != Error_AllCamera) { CSmartPointer Func = GetFunction(); if (Func->RegistSysVarEvent("CustomerHandle", this) != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sys var %s failed!", "CustomerHandle"); } else{ Func->GetSysVar("CustomerHandle", strCustomerAware); } } //启动摄像头 if ((Error!=Error_AllCamera)&&(strCustomerAware.GetLength()>0)&&(strCustomerAware[0] != 'N')&&(1 != m_iCamOnMode)) { Error = StartCamera(); if (Error == Error_Succeed) { m_bStartCamera = TRUE; SetCameraSysVar(CAMERA_NO_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_NO_ERROR"); m_nCameraErrorCode = Error_Succeed; GetFunction()->SetUserDefineState(USER_MEDIA_IDLE); } else { if((Error == Error_EnvCamera)||(Error == Error_OptCamera)) { m_bStartCamera = TRUE; if (Error == Error_EnvCamera) { SetCameraSysVar(CAMERA_ENV_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_ENV_ERROR"); m_nCameraErrorCode = Error_EnvCamera; GetFunction()->SetUserDefineState(USER_MEDIA_ENVERRROR); Error = Error_Succeed; } else if (Error == Error_OptCamera) { SetCameraSysVar(CAMERA_OPT_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("StartCamera = Error_OptCamera"); m_nCameraErrorCode = Error_OptCamera; GetFunction()->SetUserDefineState(USER_MEDIA_OPTERROR); Error = Error_Succeed; } } else if(Error == Error_AllCamera) { SetCameraSysVar(CAMERA_BOTH_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_BOTH_ERROR"); m_nCameraErrorCode = Error_AllCamera; m_bStartCamera = FALSE; GetFunction()->SetUserDefineState(USER_MEDIA_ALLERROR); } else { SetCameraSysVar(Error); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to Other Error"); m_nCameraErrorCode = Error; m_bStartCamera = FALSE; } } if (m_bStartCamera) { CSimpleStringA strSessionId; CSmartPointer Func = GetFunction(); Func->GetSysVar("SessionID", strSessionId); LogEvent(Severity_Middle, EVENT_MOD_BEGIN_RECORD, strSessionId); OnCameraStarted(); } } LogEvent(Severity_Middle, LOG_EVT_MOD_MEDIACONTROLLER_STARTED_SUCCESS, "mediacontroller entity started successfully."); } DeviceTypeEnum CMediaControllerEntity::RvcGetDeviceType() { DeviceTypeEnum eType = eStand2sType; CSmartPointer spFunction = GetFunction(); CSystemStaticInfo stStaticinfo; spFunction->GetSystemStaticInfo(stStaticinfo); if (_stricmp(stStaticinfo.strMachineType, "RVC.Stand1SPlus") == 0) { eType = eStand1SPlusType; } else if (_stricmp(stStaticinfo.strMachineType, "RVC.PAD") == 0) { if (_stricmp(stStaticinfo.strSite, "CMB.FLB") == 0) { eType = eMobilePadType; } } else if (_stricmp(stStaticinfo.strMachineType, "RPM.Stand1S") == 0) { eType = eRpm1sType; } else if (stricmp(stStaticinfo.strMachineType, "RVC.CardStore") == 0 || stricmp(stStaticinfo.strMachineType, "RVC.CardPrinter") == 0) { eType = eCardStore; } else { eType = eStand2sType; } if (eType >= 0 && eType < sizeof(Device_Type_Table) / sizeof(char*)) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device type is %s.", Device_Type_Table[eType]); } return eType; } DeviceTypeEnum CMediaControllerEntity::RvcDeviceType() { return m_eDeviceType; } void CMediaControllerEntity::SetCameraSysVar(int n) { if (n==0){ SetCameraSysVar(CAMERA_OPT_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_OPT_ERROR"); } else if (n==1){ SetCameraSysVar(CAMERA_ENV_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_ENV_ERROR"); } else if (n==-1){ SetCameraSysVar(CAMERA_BOTH_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_BOTH_ERROR"); } else if (n==3){ SetCameraSysVar(CAMERA_NO_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_NO_ERROR"); } } ErrorCodeEnum CMediaControllerEntity::GetSalesRecordAudioParam() { CSmartPointer spConfig; SpIniMappingTable table; int iPlayType = 0; ErrorCodeEnum Error = GetFunction()->OpenConfig(Config_CenterSetting, spConfig); if (Error == Error_Succeed){ table.AddEntryBoolean("SalesRecorder", "IsRecordPCM", m_bRecordPCM, false); table.AddEntryInt("LocalMediaPlay", "PlayType", iPlayType, 0); Error= table.Load(spConfig); } if (0 != iPlayType){ m_bSpeakerCap = false; } return Error; } void CMediaControllerEntity::UpdateMediaConfig() { if (m_strEnvCam.GetLength() > 1) { conf.strVideoEnv = m_strEnvCam; LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_AUTO_MODIFY_ENV, CSimpleStringA::Format("use center setting env camera [%s].", m_strEnvCam.GetData()).GetData()); } if (m_strOptCam.GetLength() > 1) { conf.strVideoOpt = m_strOptCam; LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_AUTO_MODIFY_OPT, CSimpleStringA::Format("use center setting opt camera [%s].", m_strOptCam.GetData()).GetData()); } if (m_strHandfreeIn.GetLength() > 1) { conf.strAudioIn = m_strHandfreeIn; } if (m_strHandfreeOut.GetLength() > 1) { conf.strAudioOut = m_strHandfreeOut; } } ErrorCodeEnum CMediaControllerEntity::AutoCorrectAudioConfig() { ErrorCodeEnum Error = Error_Param; if (eStand2sType != m_eDeviceType) { if (2 == m_iAudioInCount && 2 == m_iAudioOutCount) { if (NULL == strstr(m_strAudioIn.GetData(), conf.strAudioIn.GetData()) || NULL == strstr(m_strAudioOut.GetData(), conf.strAudioOut.GetData())) { conf.strAudioIn = m_strAudioIn; conf.strAudioOut = m_strAudioOut; LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_AUDIO_CONFIG_AUTO_CORRECT, CSimpleStringA::Format("auto correct audio in(%s), audio out(%s).", conf.strAudioIn.GetData(), conf.strAudioOut.GetData()).GetData()); } Error = Error_Succeed; } } return Error; } ErrorCodeEnum CMediaControllerEntity::GetMediaConfig() { ErrorCodeEnum Error = Error_Succeed; CSmartPointer spConfig; SpIniMappingTable table; CSimpleStringA strEnv; CSimpleStringA strOpt; CSimpleStringA strHandfreeIn; CSimpleStringA strHandfreeOut; int itimeout = CAMERA_TIMEOUT; int iAudioLibType = 0; int iCamOnMode = 0; int iDelayTime = RVC_MAX_DELAY_TIME; int iRecordMode = 0; Error = GetFunction()->OpenConfig(Config_CenterSetting, spConfig); if (Error == Error_Succeed) { table.AddEntryString("MediaController", "EnvCam", strEnv, "$"); table.AddEntryString("MediaController", "OptCam", strOpt, "$"); table.AddEntryInt("MediaController", "CamTimeOut", itimeout, CAMERA_TIMEOUT); table.AddEntryString("SipPhone", "HandfreeIn", strHandfreeIn, "$"); table.AddEntryString("SipPhone", "HandfreeOut", strHandfreeOut, "$"); table.AddEntryInt("MediaController", "AudioLibType", iAudioLibType, 0); table.AddEntryInt("MediaController", "CamOnMode", iCamOnMode, 0); table.AddEntryInt("MediaController", "MaxDelayTime", iDelayTime, RVC_MAX_DELAY_TIME); table.AddEntryInt("InteractiveControl", "RecordMode", iRecordMode, 0); Error= table.Load(spConfig); } if (Error_Succeed != Error){ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get entity config from config failed!"); } else{ if (strEnv.GetLength() > 1){ m_strEnvCam = strEnv; } if (strOpt.GetLength() > 1){ m_strOptCam = strOpt; } if (itimeout >= CAMERA_MIN_TIMEOUT && itimeout <= CAMERA_TIMEOUT) { m_iCamTimeout = itimeout; } if (strHandfreeIn.GetLength() > 1) { m_strHandfreeIn = strHandfreeIn; } if (strHandfreeOut.GetLength() > 1) { m_strHandfreeOut = strHandfreeOut; } if (1 == iCamOnMode && 1 == iRecordMode) { m_iCamOnMode = 1; } if (iDelayTime > 0) { m_iDelayTime = iDelayTime; } } return Error; } ErrorCodeEnum CMediaControllerEntity::SetEnvCameraOnSysVar(const CSimpleStringA strOnState) { ErrorCodeEnum Error = Error_Succeed; CSmartPointer spFunction = this->GetFunction(); Error = spFunction->SetSysVar(SYSVAR_ENVCAMERAON, strOnState.GetData()); return Error; } ErrorCodeEnum CMediaControllerEntity::SetCameraSysVar(const CSimpleStringA &newVal) { CSmartPointer spFunction = this->GetFunction(); CSimpleStringA val = newVal; if('B' == val[0]){ LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_MEDIACONTROLLER_CONFIG_ALLERROR, "all config cameras error"); } if (eStand2sType == m_eDeviceType) { return spFunction->SetSysVar(SYSVAR_CAMERASTATE, (LPCTSTR)newVal); } switch (val[0]) { case 'E': { if (!strstr((LPCTSTR)strFrontCam,";")) { val = val.Append((LPCTSTR)strFrontCam); } else { val = val.Append((LPCTSTR)strFrontCam.SubString(0,strFrontCam.IndexOf(";"))); } } break; case 'O': if (!strstr((LPCTSTR)strRearCam,";")) { val = val.Append((LPCTSTR)strRearCam); } else { val = val.Append((LPCTSTR)strRearCam.SubString(0,strRearCam.IndexOf(";"))); } break; case 'B': val = val.Append("内置前、后"); break; case 'N': case 'I': default: break; } return spFunction->SetSysVar(SYSVAR_CAMERASTATE, (LPCTSTR)val); } void CMediaControllerEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer pTransactionContext) { CSmartPointer spFunction = GetFunction(); for (int i = 0; i < m_arrListener.GetCount(); ++i) { spFunction->UnsubscribeLog(m_arrListener[i]); } spFunction->UnregistSysVarEvent(SYSVAR_CALLTYPE); spFunction->UnregistSysVarEvent(SYSVAR_CALLSTATE); if (m_capture) { capture_stop(m_capture); capture_destroy(m_capture); m_capture = NULL; } if (m_salesaudio_capture){ salesrecord_audio_capture_stop(m_salesaudio_capture); salesaudio_capture_destroy(m_salesaudio_capture); m_salesaudio_capture = NULL; } if (NULL != m_pAudioRenderObj){ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("destroy audio render obj,and it's addr is 0x%08x.", m_pAudioRenderObj); DestroyIAudioRenderObj(m_pAudioRenderObj); } capture_lib_term(); pTransactionContext->SendAnswer(Error_Succeed); } void CMediaControllerEntity::OnTimeout(DWORD dwTimerID) { if (dwTimerID == 1) { if (!m_capture) { return; } if (!m_bStartCamera) { return; } OnTimeCameraStatusCheck(); } else if (2 == dwTimerID) { if (FALSE == m_bConnectedAssist) { if (Error_Succeed == ConnectAssistChannel()) { m_bConnectedAssist = TRUE; } } if (TRUE == m_bConnectedAssist) { GetFunction()->KillTimer(2); } } else if (3 == dwTimerID) { if (m_bStartCamera) { CSimpleStringA strCallState(""); if (Error_Succeed == GetFunction()->GetSysVar(SYSVAR_CALLSTATE, strCallState)) { if (strCallState.Compare("O") == 0) { OnCameraStopped(); if (m_capture) { GetFunction()->KillTimer(1); capture_stop(m_capture); capture_destroy(m_capture); m_capture = NULL; } m_bStartCamera = FALSE; if (Error_Succeed != GetFunction()->KillTimer(3)) { LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_KILLTIMER_ERROR, "Stop Camera, KillTimer 3 failed."); } } } } } } void CMediaControllerEntity::OnTimeCameraStatusCheck() { int env_n = -1, opt_n = -1; unsigned int nLastEnvTime = 0, nLastOptTime = 0; bool bEnvTimeout = false; bool bOptTimeout = false; BOOL bIsPadType = FALSE; if (eMobilePadType == m_eDeviceType){ bIsPadType = TRUE; } capture_detect_camera_bug(m_capture, &env_n, &opt_n, bIsPadType); capture_get_last_frametime(m_capture, &nLastEnvTime, &nLastOptTime, bIsPadType); if (env_n == 0) { if (m_iEnvEmptyTimes < CAMERA_BUG_THRESHOLD){ m_iEnvEmptyTimes++; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get env camera picture fail,Times=%d",m_iEnvEmptyTimes); } } else if (env_n == -1){ m_iEnvEmptyTimes = CAMERA_BUG_THRESHOLD; } else { if (m_iEnvEmptyTimes == CAMERA_BUG_THRESHOLD){ } m_iEnvEmptyTimes = 0; } //env图像是否超时 if(nLastEnvTime > 0) { if(((y2k_time_now()-nLastEnvTime) > m_iCamTimeout)&&!bEnvTimeout) { bEnvTimeout = true; } else if (((y2k_time_now()-nLastEnvTime) < m_iCamTimeout)&&bEnvTimeout) { bEnvTimeout = false; } } //env是否30S没有图像或者图像20秒没有更新 if(((m_iEnvEmptyTimes == CAMERA_BUG_THRESHOLD)||bEnvTimeout)&&(m_nCameraErrorCode!=Error_EnvCamera)&&(m_nCameraErrorCode!=Error_AllCamera)) { char strMessage[MAX_PATH*2] = {0}; get_camera_exception_message(strMessage, MAX_PATH*2, conf.strVideoEnv, "Env camera bug detected!"); char strInfo[MAX_PATH*2] = {0}; if (NULL != m_capture && NULL != m_capture->env_video) { _snprintf(strInfo, MAX_PATH * 2, "%s and cpu usage is %f, and current time = %u, env last capture time = %u, video queue LastEnvTime = %u.", strMessage, GetSystemCpuUsage(), y2k_time_now(), m_capture->env_video->ulastcaptime, nLastEnvTime); } else { _snprintf(strInfo, MAX_PATH * 2, "%s and cpu usage is %f.", strMessage, GetSystemCpuUsage()); } LogWarn(Severity_Middle, Error_Hardware, ERROR_MOD_MEDIACONTROLLER_ENVCAMERA_BUG, strInfo); if (eStand2sType != m_eDeviceType){ if (m_bNeedPost){ LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_MEDIACONTROLLER_CONFIG_ALLERROR, "device type is pad, camera error for can't get video from it."); m_bNeedPost = false; } } if ((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType)||(eDesk1SType == m_eDeviceType)||(eDesk2SIntegratedType == m_eDeviceType)) { m_nCameraErrorCode = Error_AllCamera; ChangeSysvar(Error_EnvCamera); if (!m_bIsRemoteRecord) { RealSelfCheck(); } return; } else{ if (m_nCameraErrorCode == Error_Succeed){ m_nCameraErrorCode = Error_EnvCamera; ChangeSysvar(m_nCameraErrorCode); } else if (m_nCameraErrorCode == Error_OptCamera){ m_nCameraErrorCode = Error_AllCamera; ChangeSysvar(m_nCameraErrorCode); if (!m_bIsRemoteRecord) { RealSelfCheck(); } return; } } } else if((m_iEnvEmptyTimes != CAMERA_BUG_THRESHOLD)&&!bEnvTimeout&&((m_nCameraErrorCode == Error_EnvCamera)||(m_nCameraErrorCode == Error_AllCamera))) { if ((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType)||(eDesk1SType == m_eDeviceType)||(eDesk2SIntegratedType == m_eDeviceType)) { m_nCameraErrorCode = Error_Succeed; ChangeSysvar(m_nCameraErrorCode); } else{ if (m_nCameraErrorCode == Error_EnvCamera){ m_nCameraErrorCode = Error_Succeed; ChangeSysvar(m_nCameraErrorCode); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("changeSysvar to No_Error"); } else if (m_nCameraErrorCode == Error_AllCamera){ m_nCameraErrorCode = Error_OptCamera; ChangeSysvar(m_nCameraErrorCode); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("changeSysvar to Opt_Error"); } } } //opt是否没有图像 if (eStand2sType == m_eDeviceType) { if (opt_n == 0) { if (m_iOptEmptyTimes < CAMERA_BUG_THRESHOLD) { m_iOptEmptyTimes++; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get opt camera picture fail, Times=%d",m_iOptEmptyTimes); } } else if (opt_n == -1) { m_iOptEmptyTimes = CAMERA_BUG_THRESHOLD; } else { if (m_iOptEmptyTimes == CAMERA_BUG_THRESHOLD) { //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("opt camera get right!"); } m_iOptEmptyTimes = 0; } } //opt图像是否超时 if((nLastOptTime > 0)&&(eStand2sType == m_eDeviceType)) { if(((y2k_time_now()-nLastOptTime) > m_iCamTimeout)&&!bOptTimeout) { bOptTimeout = true; } else if (((y2k_time_now()-nLastOptTime) < m_iCamTimeout)&&bOptTimeout) { bOptTimeout = false; //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("change opt camera from bOptTimeout to OK"); } } //opt是否100S没有图像或者图像20秒没有更新 if(((m_iOptEmptyTimes == CAMERA_BUG_THRESHOLD)||bOptTimeout)&&(m_nCameraErrorCode!=Error_OptCamera)&&(m_nCameraErrorCode!=Error_AllCamera)&&(eStand2sType == m_eDeviceType)) { char strMessage[MAX_PATH*2] = {0}; get_camera_exception_message(strMessage, MAX_PATH*2, conf.strVideoOpt, "Opt camera bug detected!"); char strInfo[MAX_PATH*2] = {0}; if (NULL != m_capture && NULL != m_capture->opt_video) { _snprintf(strInfo, MAX_PATH * 2, "%s and cpu usage is %f, and current time = %u, opt last capture time = %u, video queue LastOptTime = %u.", strMessage, GetSystemCpuUsage(), y2k_time_now(), m_capture->opt_video->ulastcaptime, nLastOptTime); } else { _snprintf(strInfo, MAX_PATH * 2, "%s and cpu usage is %f.", strMessage, GetSystemCpuUsage()); } LogWarn(Severity_Middle, Error_Hardware, ERROR_MOD_MEDIACONTROLLER_OPECAMERA_BUG, strInfo); if (m_nCameraErrorCode == Error_Succeed) { m_nCameraErrorCode = Error_OptCamera; ChangeSysvar(m_nCameraErrorCode); } else if (m_nCameraErrorCode == Error_EnvCamera) { m_nCameraErrorCode = Error_AllCamera; ChangeSysvar(m_nCameraErrorCode); if (!m_bIsRemoteRecord) { RealSelfCheck(); } return; } } else if((m_iOptEmptyTimes != CAMERA_BUG_THRESHOLD)&&!bOptTimeout&&((m_nCameraErrorCode == Error_OptCamera)||(m_nCameraErrorCode == Error_AllCamera))&&(eStand2sType == m_eDeviceType)) { if (m_nCameraErrorCode == Error_OptCamera) { m_nCameraErrorCode = Error_Succeed; ChangeSysvar(m_nCameraErrorCode); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("changeSysvar to No_Error"); } else if (m_nCameraErrorCode == Error_AllCamera) { m_nCameraErrorCode = Error_EnvCamera; ChangeSysvar(m_nCameraErrorCode); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("changeSysvar to Env_Error"); } } //重启摄像头 if((m_nCameraErrorCode == Error_EnvCamera)&&(m_nEnvCameraRestartNumRealCheck(req,ans,Timeout); if (Error!=Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("RealSelfcheck fail!"); } else { LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_REAL_SELF_CHECK, "media controller entity auto restart."); } } return Error; } void CMediaControllerEntity::SendCameraBright() { if (m_nSysCallType == 0) { ChannelService_Send_Info Info; Info.compress = false; Info.encrypt = false; Info.type = ACM_TYPE_DEVICE; Info.id = 0; Info.sub_type = ACM_CAMERA_BRIGHT; Info.data.Alloc(sizeof(int)); SpBuffer buf; buf.OpenWrite(); int nValue = 0; bool rslt = true; nValue = capture_get_brightness(m_capture,m_nCameraErrorCode); if (nValue >= 0) { buf & nValue; Info.data = buf.ToBlob(); m_pMediaControllerChannel->Send(Info); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send cur camera bright value Fail!"); } } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cur call type cannot send pkt"); } } ErrorCodeEnum CMediaControllerEntity::StartCameras() { ErrorCodeEnum Error = Error_Succeed; if (FALSE == m_bStartCamera){ Error = StartCamera(); if (Error_Succeed == Error){ SetCameraSysVar(CAMERA_NO_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_NO_ERROR"); m_bStartCamera = TRUE; } } else{ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("camera already start."); } return Error; } ErrorCodeEnum CMediaControllerEntity::StopCameras() { if (m_capture){ GetFunction()->KillTimer(1); capture_stop(m_capture); capture_destroy(m_capture); m_capture = NULL; } m_bStartCamera = FALSE; return Error_Succeed; } ErrorCodeEnum CMediaControllerEntity::StopCamerasAndRecord() { LogEvent(Severity_Middle, EVENT_MOD_PAUSE_RECORD, "pause record."); ErrorCodeEnum CamRet = StopCameras(); return CamRet; } ErrorCodeEnum CMediaControllerEntity::StartCamerasAndRecord() { ErrorCodeEnum CamRet = StartCameras(); LogEvent(Severity_Middle, EVENT_MOD_CONTINUE_RECORD, "continue record."); return CamRet; } ErrorCodeEnum CMediaControllerEntity::LoadRunConfig(CSimpleStringA& frontcam, CSimpleStringA& rearcam) { CSmartPointer spFunction = GetFunction(); CSmartPointer spConfig; ErrorCodeEnum Error = spFunction->OpenConfig(Config_Run, spConfig); if (Error == Error_Succeed) { SpIniMappingTable table; table.AddEntryString("Video", "FrontCamera", frontcam, "$"); table.AddEntryString("Video", "RearCamera", rearcam, "$"); Error = table.Load(spConfig); if (Error != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[dbg] failed to load run config."); } } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[dbg] failed to open run config."); } return Error; } ErrorCodeEnum CMediaControllerEntity::CheckConfigCameraName(capture_config_t *conf) { ErrorCodeEnum Error = Error_Succeed; int EnvConfigNameError = 0; //0:环境摄像头配置名能成功打开 -1:环境摄像头配置名不能打开 1:未配置环境摄像头名字 int OptConfigNameError = 0; //0:操作摄像头配置名能成功打开 -1:操作摄像头配置名不能打开 1:未配置操作摄像头名字 //check env device if (conf->strVideoEnv.GetLength() > 1) { // is not "$" conf->video_env_dev = capture_get_video_device_id(conf->strVideoEnv.GetData()); if (conf->video_env_dev == -1) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("find strVideoEnv:%s(-1)",(LPCTSTR)conf->strVideoEnv); EnvConfigNameError = -1; } } else { conf->video_env_dev = -1; EnvConfigNameError = 1; } //check opt device if (conf->strVideoOpt.GetLength() > 1) { // is not "$" conf->video_opt_dev = capture_get_video_device_id(conf->strVideoOpt.GetData()); if (conf->video_opt_dev == -1) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("find strVideoOpt:%s(-1)",(LPCTSTR)conf->strVideoOpt); OptConfigNameError = -1; } } else { conf->video_opt_dev = -1; OptConfigNameError = 1; } //环境摄像头配置名不能打开 if (EnvConfigNameError == -1){ //操作摄像头配置名不能打开,此时表明摄像头都不可用 if(OptConfigNameError == -1){ Error = Error_AllCamera; } //未配置操作摄像头名字or操作摄像头配置名能打开,此时表明只有操作摄像头OK else{ Error = Error_EnvCamera; } } //环境摄像头配置名能打开 else if (EnvConfigNameError == 0){ //操作摄像头配置名不能打开,此时表明只有环境摄像头OK if (OptConfigNameError == -1){ Error = Error_OptCamera; } //环境摄像头配置名能打开,未配置操作摄像头名字,此时也认为摄像头都OK(无操作摄像头场景) } //环境摄像头未配置 else { //操作摄像头配置名不能打开,此时表明只有操作摄像头OK if(OptConfigNameError == -1){ Error = Error_OptCamera; } //操作摄像头未配置,此时表明摄像头都不可用 else if (OptConfigNameError == 1){ Error = Error_AllCamera; } //操作摄像头名字能打开,此时也认为摄像头都OK(无环境摄像头场景) } return Error; } bool CMediaControllerEntity::IsNamedDeviceHasInserted(const char* strDeviceName) { LOG_FUNCTION(); bool bRet = false; if (NULL == strDeviceName){ return bRet; } if (capture_get_audio_device_id(true , strDeviceName) >= 0){ if (capture_get_audio_device_id(false, strDeviceName) >= 0){ bRet = true; } } return bRet; } bool CMediaControllerEntity::IsMatchSpecifyedAudioDevice(CSimpleStringA strAudioIn, CSimpleStringA strAudioOut) { bool bRet = false; if (m_strAudioPriority.GetLength() > 0){ CAutoArray strArr = m_strAudioPriority.Split('|'); int iCount = strArr.GetCount(); for (int i = 0; i < iCount; i++){ if (strAudioIn.IndexOf(strArr[i].GetData()) >= 0){ if (strAudioOut.IndexOf(strArr[i].GetData()) >= 0){ bRet = true; break; } } } } return bRet; } int CMediaControllerEntity::UpdateAudioDeviceConfig(capture_config_t *conf) { int iCode = -1; if (m_strAudioPriority.GetLength() > 0){ CAutoArray strArr = m_strAudioPriority.Split('|'); int iCount = strArr.GetCount(); for (int i = 0; i < iCount; i++){ if (IsNamedDeviceHasInserted(strArr[i].GetData())){ conf->strAudioOut = strArr[i]; conf->strAudioIn = strArr[i]; //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("success reset audio in device to %s.", strArr[i].GetData()); iCode = 0; break; } } } return iCode; } bool CMediaControllerEntity::CheckAudioDeviceConfigure(capture_config_t *conf) { bool bRet = false; if (NULL == conf){ return bRet; } if (capture_get_audio_device_id(true, conf->strAudioIn) >= 0){ if (capture_get_audio_device_id(false, conf->strAudioOut) >= 0){ bRet = true; } } return bRet; } ErrorCodeEnum CMediaControllerEntity::GetSalesAudioConfig(rvc_audio_capture_config_t *conf, bool bRemoteRecord) { CSmartPointer spFunction = GetFunction(); CSmartPointer spConfig; SpIniMappingTable table; ErrorCodeEnum Error = spFunction->OpenConfig(Config_Root, spConfig); if (Error == Error_Succeed) { CSimpleStringA strAudioInDevice; table.AddEntryString("Audio", "sales_record_in_dev", strAudioInDevice, "$"); Error = table.Load(spConfig); if (Error == Error_Succeed) { conf->audio_capture_period = CAPTURE_FRAME_TIME; conf->audio_capture_samplerate = CAPTURE_CLOCK; conf->strAudioIn = this->conf.strAudioIn; conf->strAudioOut = this->conf.strAudioOut; if (strAudioInDevice.GetLength() > 0) { conf->strAudioIn = strAudioInDevice; } } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load sales audio device config failed!"); } } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("open sales audio device config failed!"); } if (Error_Succeed != Error) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get sales audio device info failed, now get from default value."); conf->strAudioIn = this->conf.strAudioIn; conf->audio_capture_period = CAPTURE_FRAME_TIME; conf->audio_capture_samplerate = CAPTURE_CLOCK; Error = Error_Succeed; } if (true == bRemoteRecord) { conf->audio_capture_samplerate = CAPTURE_CLOCK; } return Error; } static CSimpleStringA generateCameraInfosJson(CSimpleStringA strEnv, CSimpleStringA strOpt, int iEnv, int iOpt, int iMtu) { return CSimpleStringA::Format("{\"EnvCamera\":\"%s\",\"OptCamera\":\"%s\",\"EnvRotate\":\"%d\",\"OptRotate\":\"%d\",\"mtu\":\"%d\"}", strEnv.GetData(), strOpt.GetData(), iEnv, iOpt, iMtu); } ErrorCodeEnum CMediaControllerEntity::LoadConfig(capture_config_t *conf) { CSmartPointer spFunction = GetFunction(); CSmartPointer spConfig; SpIniMappingTable table; ErrorCodeEnum Error = spFunction->OpenConfig(Config_Root, spConfig); if (Error == Error_Succeed) { int imtu = 0; table.AddEntryString("Audio", "handfree_in_dev", conf->strAudioIn, "$"); table.AddEntryString("Audio", "handfree_out_dev", conf->strAudioOut, "$"); table.AddEntryString("Video", "EnvCamera", conf->strVideoEnv, "$"); table.AddEntryString("Video", "OptCamera", conf->strVideoOpt, "$"); table.AddEntryInt("Video", "EnvRotate", conf->video_env_rotate, 0); table.AddEntryInt("Video", "OptRotate", conf->video_opt_rotate, 0); table.AddEntryInt("Video", "mtu", imtu, 0); Error = table.Load(spConfig); if (Error == Error_Succeed) { //进行Camera路径名自纠正后再检查 if (m_strEnvCam.GetLength() > 1 || m_strOptCam.GetLength() > 1 || m_strHandfreeIn.GetLength() > 1 || m_strHandfreeOut.GetLength() > 1){ UpdateMediaConfig(); } AutoCorrectAudioConfig(); LogWarn(Severity_Low, Error_Debug, ERROR_MOD_MEDIACONTROLLER_ENV_CAMERA_INFO, conf->strVideoEnv.GetData()); LogWarn(Severity_Low, Error_Debug, ERROR_MOD_MEDIACONTROLLER_OPT_CAMERA_INFO, conf->strVideoOpt.GetData()); LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_CAMERA_INFOS, generateCameraInfosJson(conf->strVideoEnv, conf->strVideoOpt, conf->video_env_rotate, conf->video_opt_rotate, imtu).GetData()); Error = CheckConfigCameraName(conf); if (Error == Error_EnvCamera || Error == Error_AllCamera){ char strMessage[MAX_PATH*2] = {0}; get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoEnv ,"env camera start error,please check config file or device."); LogWarn(Severity_Middle,Error_DevMedia,ERROR_MOD_MEDIACONTROLLER_ENVCAM_INITFAIL,strMessage); } else if (Error == Error_OptCamera){ char strMessage[MAX_PATH*2] = {0}; get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoOpt, "operation camera start error,please check config file or device."); LogWarn(Severity_Middle,Error_DevMedia,ERROR_MOD_MEDIACONTROLLER_OPTCAM_INITFAIL, strMessage); } } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load config failed!"); } } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("open config failed!"); } return Error; } void CMediaControllerEntity::OnExternalCameraSwitchFailed(const char* pszFailedMsg) { // 广播给业务系统 //ExternalCameraSwitchFailed evt; //evt.failedmsg = CSimpleStringA2W(pszFailedMsg); //SpSendBroadcast(GetFunction(), SP_MSG_OF(ExternalCameraSwitchFailed), SP_MSG_SIG_OF(ExternalCameraSwitchFailed), evt); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[dbg] ExternalCameraSwitchFailed broadcast sent!"); CSmartPointer Func = GetFunction(); CSimpleStringA strValue; Func->GetSysVar("DesktopType", strValue); if (strValue == CSimpleStringA("U")) { #ifdef RVC_OS_WIN MessageBoxA(NULL, pszFailedMsg, NULL, MB_SYSTEMMODAL); #else #endif // RVC_OS_WIN } } void CMediaControllerEntity::OnLog( const CAutoArray &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext& pLinkInfo) { switch (dwUserCode) { case MOD_EVENT_SNAPSHOT_START_CAPTURE_ENVOPT: { //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv MOD_EVENT_SNAPSHOT_START_CAPTURE_ENVOPT"); InterlockedCompareExchange(&m_lCaptureEnvOptCount, 3, 0); } break; case MOD_EVENT_SNAPSHOT_START_CAPTURE_ENV: { //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv MOD_EVENT_SNAPSHOT_START_CAPTURE_ENV"); InterlockedCompareExchange(&m_lCaptureEnvCount, 1, 0); } break; case MOD_EVENT_SNAPSHOT_START_CAPTURE_OPT: { //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv MOD_EVENT_SNAPSHOT_START_CAPTURE_OPT"); InterlockedCompareExchange(&m_lCaptureOptCount, 1, 0); } break; case LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS: { //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS"); Sleep(800); if (m_pMediaControllerChannel != NULL){ m_pMediaControllerChannel->GetFunction()->CloseSession(); m_pMediaControllerChannel->SafeDelete(); m_pMediaControllerChannel = NULL; //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Close AssistChannel Session "); m_bConnectedAssist = FALSE; } if (Error_Succeed == ConnectAssistChannel()){ m_bConnectedAssist = TRUE; } else { GetFunction()->SetTimer(2, this, 3350); } } break; case EVENT_MOD_CUSTOMERAWARE_BEGIN: { m_bCustomerwareBegin = true; if (1 != m_iCamOnMode) { if (!m_bStartCamera && !m_bExternControlCam) { if (eDesk2SIntegratedType != m_eDeviceType) { StartCameraAndSetSysVar(); } else { CSimpleStringA strOccupy; if (Error_Succeed == GetFunction()->GetSysVar(SYSVAR_CAMERAOCCUPY, strOccupy)) { if (strOccupy.IsNullOrEmpty()) { StartCameraAndSetSysVar(); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera is Occupying by Entity[%s].", strOccupy.GetData()); } } } if (m_bStartCamera) { LogEvent(Severity_Middle, EVENT_MOD_BEGIN_RECORD, pszMessage); OnCameraStarted(); } } } } break; case LOG_EVT_BEGIN_HANDLE_BUSINESS: if (1 == m_iCamOnMode){ if (!m_bStartCamera){ StartCameraAndSetSysVar(); if (m_bStartCamera) { OnCameraStarted(); } } else { if (Error_Succeed != GetFunction()->KillTimer(3)) { LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_KILLTIMER_ERROR, "begin handle business, and camera is already on, KillTimer 3 failed."); } } } break; case LOG_EVT_END_HANDLE_BUSINESS: if (1 == m_iCamOnMode) { if (m_bStartCamera) { if (Error_Succeed != GetFunction()->SetTimer(3, this, m_iDelayTime * 1000)) { LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_SETTIMER_ERROR, "end handle business, SetTimer 3 failed."); } } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("end handle business, and camera is not on."); } } break; case EVENT_MOD_CUSTOMERAWARE_END: { m_bCustomerwareBegin = false; if (1 != m_iCamOnMode) { if (m_bStartCamera && !m_bExternControlCam) { if (m_capture) { OnCameraStopped(); LogEvent(Severity_Middle, EVENT_MOD_END_RECORD, pszMessage); GetFunction()->KillTimer(1); capture_stop(m_capture); capture_destroy(m_capture); m_capture = NULL; } m_bStartCamera = FALSE; m_bNeedPost = true; } } } break; case LOG_EVT_RECORDFAILED: { GetFunction()->KillTimer(1); LogEvent(Severity_Middle, EVENT_MOD_END_RECORD, NULL); char FaildFlag = pszMessage[0]; if (FaildFlag == '0') { GetFunction()->SetTimer(1, this, 5000); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("本地录音录像失败,已停止!"); } else //if (FaildFlag == '1') { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("本地录音录像设备故障,尝试恢复中(预计10s内),请稍等"); if (false == m_bIsRemoteRecord) { m_nCameraErrorCode = Error_AllCamera; } //RealSelfCheck(); // 录音录像失败,强行kill实体 } } break; case LOG_EVT_UI_RECORDFAILED: { OnExternalCameraSwitchFailed(pszMessage); GetFunction()->KillTimer(1); if (m_bIsRemoteRecord){ LogEvent(Severity_Middle, LOG_EVT_UI_STOPREMOTERECORD, NULL); } else{ LogEvent(Severity_Middle, LOG_EVT_UI_STOPRECORD, NULL); } GetFunction()->SetTimer(1, this, 5000); } break; case LOG_EVT_MOD_SALESRECORDER_STARTED_SUCCESS: m_bIsRemoteRecord = false; break; case LOG_EVT_UI_STARTREMOTERECORD: { m_bIsRemoteRecord = true; HandleRemoteRecord(pszMessage); } break; case LOG_EVT_UI_STOPREMOTERECORD: { m_bIsRemoteRecord = false; if (Error_Succeed == StopSalesRecordAudioCapture()){ } if (true == m_bHasStartSpeakerRender){ StopSpeakerAudioRender(); } } break; default: DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unknown event."); break; } } void CMediaControllerEntity::OnSelfTest(EntityTestEnum eTestType,CSmartPointer pTransactionContext) { if (Test_ShakeHand == eTestType) { if (m_nCameraErrorCode == Error_AllCamera) { pTransactionContext->SendAnswer(Error_DevMedia); } else { pTransactionContext->SendAnswer(Error_Succeed); } } } //获取当前使用摄像头,30分钟轮休一次 int CMediaControllerEntity::GetActiveCamera() { SYSTEMTIME st; GetLocalTime(&st); if (st.wMinute<=CAMERA_CHANGE_TIMER){ return ENVCAMERA; } else{ return OPTCAMERA; } } ErrorCodeEnum CMediaControllerEntity::ChangeSysvar(ErrorCodeEnum op) { switch (op) { case Error_Succeed: DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to No_Error"); SetCameraSysVar(CAMERA_NO_ERROR); GetFunction()->SetUserDefineState(USER_MEDIA_IDLE); break; case Error_EnvCamera: DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to Env_Error"); SetCameraSysVar(CAMERA_ENV_ERROR); GetFunction()->SetUserDefineState(USER_MEDIA_ENVERRROR); capture_clearsnapshotvideo(m_capture,ENVCAMERA); break; case Error_OptCamera: DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to Opt_Error"); SetCameraSysVar(CAMERA_OPT_ERROR); GetFunction()->SetUserDefineState(USER_MEDIA_OPTERROR); capture_clearsnapshotvideo(m_capture,OPTCAMERA); break; case Error_AllCamera: DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to Both_Error"); SetCameraSysVar(CAMERA_BOTH_ERROR); GetFunction()->SetUserDefineState(USER_MEDIA_ALLERROR); capture_clearsnapshotvideo(m_capture,AlLCAMERA); break; default: break; } return Error_Succeed; } //开始销售双录音频采集函数 ErrorCodeEnum CMediaControllerEntity::StartSalesRecordAudioCapture(bool bRemoteRecord, eRvcPCMTransType eType, void* pData) { ErrorCodeEnum Error = Error_Succeed; if (NULL == m_salesaudio_capture){ memset(&m_sales_audio_conf, 0, sizeof(m_sales_audio_conf)); GetSalesAudioConfig(&m_sales_audio_conf, bRemoteRecord); Error = (ErrorCodeEnum)salesaudio_capture_create(&m_sales_audio_conf, &m_salesaudio_capture); if (Error_Succeed == Error){ Error = SetSalesRecordAudioCaptureTransActionData(eType, pData); } } if (Error_Succeed == Error){ Error = salesrecord_audio_capture_start(m_salesaudio_capture); if (Error_Succeed != Error){ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sales record audio capture start failed for param error."); } } return Error; } //停止销售双录音频采集函数 ErrorCodeEnum CMediaControllerEntity::StopSalesRecordAudioCapture() { salesrecord_audio_capture_stop(m_salesaudio_capture); salesaudio_capture_destroy(m_salesaudio_capture); m_salesaudio_capture = NULL; return Error_Succeed; } ErrorCodeEnum CMediaControllerEntity::StartCamera() { if (m_capture == NULL) { ErrorCodeEnum Error = Error_Succeed; conf.ref_env_capture_count = &m_lCaptureEnvCount; conf.ref_opt_capture_count = &m_lCaptureOptCount; conf.ref_envopt_capture_count = &m_lCaptureEnvOptCount; Error = (ErrorCodeEnum)capture_create(&conf, &m_capture); if (Error == Error_Succeed) { Error = capture_start(m_capture); if (Error != Error_Succeed) { if((Error == Error_AudioIN)||(Error == Error_AudioOut)) { return Error; } else if (Error == Error_AllCamera) { capture_stop(m_capture); capture_destroy(m_capture); m_capture = NULL; return Error; } else { SetAutoBright(Error); GetFunction()->SetTimer(1, this, 5000); if((Error == Error_OptCamera)&&((ePadtype == m_eDeviceType)||(eStand1SPlusType == m_eDeviceType))) { return Error_Succeed; } else { return Error; } } } else { SetAutoBright(Error); GetFunction()->SetTimer(1, this, 5000); return Error_Succeed; } } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create capture failed! 0x%08x", Error); m_capture = NULL; return Error_Unexpect; } return Error; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_capture == NULL"); return Error_Unexpect; } } void CMediaControllerEntity::StartCameraAndSetSysVar() { ErrorCodeEnum Error = StartCamera(); if (Error == Error_Succeed){ SetCameraSysVar(CAMERA_NO_ERROR); m_bStartCamera = TRUE; m_bNeedPost = true; } else{ if (Error == Error_EnvCamera){ SetCameraSysVar(CAMERA_ENV_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_ENV_ERROR"); m_bStartCamera = TRUE; } else if (Error == Error_OptCamera){ SetCameraSysVar(CAMERA_OPT_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_OPT_ERROR"); m_bStartCamera = TRUE; } else if (Error == Error_AllCamera){ SetCameraSysVar(CAMERA_BOTH_ERROR); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_BOTH_ERROR"); m_nCameraErrorCode = Error_AllCamera; m_bStartCamera = FALSE; GetFunction()->SetUserDefineState(USER_MEDIA_ALLERROR); } else{ SetCameraSysVar(Error); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to Other Error"); m_nCameraErrorCode = Error; m_bStartCamera = FALSE; } } } ErrorCodeEnum CMediaControllerEntity::ReStartCamera(int nCamera) { if (m_capture != NULL) { if((StopCamera(m_capture,nCamera)==-1)){ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReStartCamera %d,stop camera fail!", nCamera); } Sleep(2000); ErrorCodeEnum Error = Error_Succeed; Error = capture_create(&conf, m_capture,nCamera); if (Error == Error_Succeed) { Error = capture_start(m_capture,nCamera); if (Error != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReStartCamera %d,capture_start fail!", nCamera); capture_destroy(m_capture,nCamera); return Error; } else { return Error_Succeed; } } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReStartCamera %d,capture_create fail!", nCamera); capture_destroy(m_capture,nCamera); return Error; } } else { return Error_Unexpect; } } CServerSessionBase *CMediaControllerEntity::OnNewSession(const char* pszRemoteEntityName, const char * pszClass) { return new MediaServiceSession(this); } ErrorCodeEnum CMediaControllerEntity::ExternStartCamera() { CSimpleStringA strSessionId; CSmartPointer Func = GetFunction(); Func->GetSysVar("SessionID", strSessionId); if (!m_bStartCamera){ StartCameraAndSetSysVar(); if (m_bStartCamera) { LogEvent(Severity_Middle, EVENT_MOD_BEGIN_RECORD, strSessionId); OnCameraStarted(); } } m_bExternControlCam = FALSE; return Error_Succeed; } ErrorCodeEnum CMediaControllerEntity::ExternStopCamera() { if (m_capture) { OnCameraStopped(); LogEvent(Severity_Middle, EVENT_MOD_END_RECORD,NULL); GetFunction()->KillTimer(1); capture_stop(m_capture); capture_destroy(m_capture); m_capture = NULL; } m_bStartCamera = FALSE; m_bExternControlCam = TRUE; return Error_Succeed; } ErrorCodeEnum CMediaControllerEntity::SaveInnerCamera() { if (strFrontCam.GetLength() <= 1) { return Error_Resource; } if (strstr((LPCTSTR)conf.strVideoEnv,(LPCTSTR)strFrontCam)==NULL) { CSimpleStringA tmp = strRearCam; strRearCam = strFrontCam; strFrontCam = tmp; } //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[dbg] strFrontCam: %s, strRearCam: %s", (LPCSTR)strFrontCam, (LPCSTR)strRearCam); CSmartPointer spFunction = GetFunction(); CSmartPointer spConfig; ErrorCodeEnum Error = spFunction->OpenConfig(Config_Run, spConfig); if (Error == Error_Succeed) { SpIniMappingTable table; table.AddEntryString("Video", "FrontCamera", strFrontCam, "$"); table.AddEntryString("Video", "RearCamera", strRearCam, "$"); Error = table.Save(spConfig); if (Error != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[dbg] failed to save run config."); } } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[dbg] failed to open run config."); } return Error; } ErrorCodeEnum CMediaControllerEntity::GetHSPCameras(CAutoArray &HSPCameras) { enum CapTypeEnum { CAMTYPE_UNKNOWN = 0, CAMTYPE_ENV, CAMTYPE_OPT, CAMTYPE_EWS, CAMTYPE_HSPS, CAMTYPE_CIRCLE, CAMTYPE_MAX }; auto rc = Error_Succeed; auto pScannerSetClient = new ScannerService_ClientBase(this); if (pScannerSetClient->Connect() != Error_Succeed){ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("连接ScannerSet实体失败"); pScannerSetClient->SafeDelete(); pScannerSetClient = NULL; rc = Error_DevConnFailed; } else { ScannerService_GetOnlineCameras_Req req = {}; ScannerService_GetOnlineCameras_Ans ans = {}; rc = (*pScannerSetClient)(EntityResource::getLink().upgradeLink())->GetOnlineCameras(req, ans, 10000); if (rc != Error_Succeed){ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ScannerSet 调用 GetOnlineCameras 失败: 0x%x", rc); } else{ //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ScannerSet invokes GetOnlineCameras suc."); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Count: %d", ans.devCount); if (ans.devCount > 0) { for (int i = 0; i < ans.devFriendlyNames.GetCount(); ++i) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[%d]%s(%d)", i, (LPCTSTR)ans.devFriendlyNames[i], ans.devType[i]); CapTypeEnum devType = (CapTypeEnum)ans.devType[i]; if (devType == CAMTYPE_HSPS) { HSPCameras.Append(ans.devFriendlyNames, i, 1); } } } } pScannerSetClient->GetFunction()->CloseSession(); pScannerSetClient->SafeDelete(); pScannerSetClient = NULL; } return rc; } ErrorCodeEnum CMediaControllerEntity::HandleSalesRecordPCMAudio(bool bRemoteRecord, const char *pszMessage, audio_frame* pFrame) { ErrorCodeEnum Error = Error_Succeed; char strSwiftName[MAX_PATH] = {0}; if (NULL != pszMessage){ size_t ulen = strlen(pszMessage); char *tmp = new char[ulen+1]; memset(tmp, 0, ulen + 1); memcpy(tmp, pszMessage, ulen); char *result[16] = {0}; auto arr1 = CSimpleStringA2W(tmp).Split('@'); auto arr2 = CAutoArray(arr1.GetCount()); for (int i = 0; i < arr1.GetCount(); ++i){ arr2[i] = CSimpleStringW2A(arr1[i]); result[i] = const_cast(arr2[i].GetData()); } if (arr1.GetCount() > 4){ _snprintf(strSwiftName, MAX_PATH, "%s", result[4]); } delete tmp; tmp = NULL; } char strMicroName[MAX_PATH] = {0}; CSimpleStringA strTempDir; if (Error_Succeed == GetFunction()->GetPath("Temp", strTempDir)){ _snprintf(strMicroName, MAX_PATH, "%s\\local_micro_%s.pcm", strTempDir.GetData(), strSwiftName); } else{ _snprintf(strMicroName, MAX_PATH, "local_micro_%s.pcm", strSwiftName); } FILE *pRecord = fopen(strMicroName, "wb+"); if (NULL != pRecord){ if (Error_Succeed == StartSalesRecordAudioCapture(bRemoteRecord, eSingleWriteLocal, pRecord)){ } } else{ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("fopen %s failed.",strMicroName); } if (true == bRemoteRecord){ char strSpeakerName[MAX_PATH] = {0}; if ("" != strTempDir){ _snprintf(strSpeakerName, MAX_PATH, "%s\\remote_speaker_%s.pcm", strTempDir.GetData(), strSwiftName); } else{ _snprintf(strSpeakerName, MAX_PATH, "remote_speaker_%s.pcm", strSwiftName); } StartSpeakerAudioRender(0, pFrame, strSpeakerName); } return Error; } void CMediaControllerEntity::HandleRemoteRecord(const char *pszMessage) { audio_frame frame; frame.bitspersample = 16; frame.format = 1; frame.framesize = 320; frame.nchannels = 1; frame.samplespersec = 8000; if (true == m_bRecordPCM){ HandleSalesRecordPCMAudio(true, pszMessage, &frame); } else{ if (Error_Succeed == StartSalesRecordAudioCapture(true)){ } StartSpeakerAudioRender(0, &frame, NULL); } } ErrorCodeEnum CMediaControllerEntity::StartSpeakerAudioRender(int iQueue, audio_frame* pFrame, const char* strName) { auto rc = Error_Succeed; if (m_bSpeakerCap){ DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start speak audio render."); if (NULL != m_pAudioRenderObj){ if(0 == m_pAudioRenderObj->StartRender(0, pFrame, strName)){ m_bHasStartSpeakerRender = true; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start speak audio render success."); } } } return rc; } ErrorCodeEnum CMediaControllerEntity::StopSpeakerAudioRender() { auto rc = Error_Succeed; if (m_bSpeakerCap){ if (NULL != m_pAudioRenderObj){ m_pAudioRenderObj->StopRender(); m_bHasStartSpeakerRender = false; } } return rc; } ErrorCodeEnum CMediaControllerEntity::SetSalesRecordAudioCaptureTransActionData(eRvcPCMTransType eType, void* pData) { auto rc = Error_Param; if (NULL != m_salesaudio_capture){ if (NULL != m_salesaudio_capture->rvc_audio){ m_salesaudio_capture->rvc_audio->eType = eType; m_salesaudio_capture->rvc_audio->pdata = pData; rc = Error_Succeed; } } return rc; } ErrorCodeEnum CMediaControllerEntity::ConnectAssistChannel() { if (NULL == m_pMediaControllerChannel) { m_pMediaControllerChannel = new ChannelMediaControllerClient(this); } ErrorCodeEnum Error = m_pMediaControllerChannel->Connect(); if (Error != Error_Succeed) { m_pMediaControllerChannel->SafeDelete(); m_pMediaControllerChannel = NULL; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ChannelMediaControllerClient connect fail!"); return Error; } if (Error_Succeed == Error) { ChannelService_BeginState_Sub Sub; Error = (*m_pMediaControllerChannel)(EntityResource::getLink().upgradeLink())->BeginState(Sub); if (Error != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("BeginState biz channel failed!"); m_pMediaControllerChannel->GetFunction()->CloseSession(); m_pMediaControllerChannel->SafeDelete(); m_pMediaControllerChannel = NULL; return Error; } } if (Error_Succeed == Error) { ChannelService_BeginRecv_Sub Sub; Sub.type = ACM_TYPE_DEVICE; Error = (*m_pMediaControllerChannel)(EntityResource::getLink().upgradeLink())->BeginRecv(Sub); if (Error != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Begin BeginRecv ACM_TYPE_DEVICE failed!"); m_pMediaControllerChannel->GetFunction()->CloseSession(); m_pMediaControllerChannel->SafeDelete(); m_pMediaControllerChannel = NULL; return Error; } } return Error; } ErrorCodeEnum CMediaControllerEntity::GetAudioDevices(int& iAudioCount, CSimpleStringA& strAudioDev, int iAudioType) { ErrorCodeEnum Error = Error_Succeed; if (0 == iAudioType) { iAudioCount = capture_get_audio_device_list(0, strAudioDev); } else { iAudioCount = capture_get_audio_device_list(1, strAudioDev); } return Error; } ErrorCodeEnum CMediaControllerEntity::GetVideoDevices(int& iVideoCount, CSimpleStringA& strVideoDev) { ErrorCodeEnum Error = Error_Succeed; iVideoCount = capture_get_video_device_list(strVideoDev); return Error; } double CMediaControllerEntity::GetSystemCpuUsage() { double ratio = 0; #define _WIN32_WINNT 0x0601 FILETIME idleTime,kernelTime,userTime; BOOL ret = GetSystemTimes(&idleTime,&kernelTime,&userTime); if (ret == 0){ return 80.0; } __int64 xIdle,xKernel,xUser; xIdle = idleTime.dwHighDateTime; xIdle <<= 32; xIdle |= idleTime.dwLowDateTime; xKernel = kernelTime.dwHighDateTime; xKernel <<= 32; xKernel |= kernelTime.dwLowDateTime; xUser = userTime.dwHighDateTime; xUser <<= 32; xUser |= userTime.dwLowDateTime; if (m_xIdlePre != 0) { __int64 xI,xK,xU; xI = xIdle - m_xIdlePre; xK = xKernel - m_xKernelPre; xU = xUser - m_xUserPre; if ((xK +xU) != 0) ratio = (xK - xI + xU) * 100 / (xK + xU); } m_xIdlePre = xIdle; m_xKernelPre = xKernel; m_xUserPre = xUser; return ratio; } void CMediaControllerEntity::OnCameraStarted() { LogEvent(Severity_Middle, LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED, "camera started."); } void CMediaControllerEntity::OnCameraStopped() { LogEvent(Severity_Middle, LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED, "camera stopped."); } SelfChekerClient::SelfChekerClient( CMediaControllerEntity *pEntity ) : SelfCheckerService_ClientBase(pEntity) { } ChannelMediaControllerClient::ChannelMediaControllerClient( CMediaControllerEntity *pEntity ) : ChannelService_ClientBase(pEntity) { } void ChannelMediaControllerClient::OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer pData) { if (Error == Error_Succeed) { CMediaControllerEntity *pEntity = static_cast(m_pEntityBase); if (Msg.state == eChannelState_Idle) { if (pEntity->m_bStartCamera) { if (pEntity->SetAutoBright(pEntity->m_nCameraErrorCode)==false) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetAutoBright Fail!"); } } } else if (Msg.state == eChannelState_Connected) { if (pEntity->m_bStartCamera) { pEntity->SendCameraBright(); } } } } void ChannelMediaControllerClient::OnMessage( ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer pData ) { LOG_FUNCTION(); if (Error == Error_Succeed) { CMediaControllerEntity *pEntity = static_cast(m_pEntityBase); pEntity->OnReceivePkt(Msg.sub_type, (const char*)Msg.data.m_pData, Msg.data.m_iLength); } } void MediaServiceSession::Handle_GetVideoDeviceName(SpReqAnsContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); CSimpleStringA frontcam = m_pEntity->strFrontCam; CSimpleStringA rearcam = m_pEntity->strRearCam; if (frontcam.GetLength() > 1 && rearcam.GetLength() > 1) { ctx->Ans.frontcam = frontcam; if (strstr((LPCTSTR)frontcam,";")) { ctx->Ans.frontcam = frontcam.SubString(0, frontcam.IndexOf(";")); } ctx->Ans.rearcam = rearcam; if (strstr((LPCTSTR)rearcam,";")) { ctx->Ans.rearcam = rearcam.SubString(0, rearcam.IndexOf(";")); } } ctx->Answer(Error_Succeed); } void MediaServiceSession::Handle_StartCamera(SpOnewayCallContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); m_pEntity->ExternStartCamera(); } void MediaServiceSession::Handle_StopCamera(SpOnewayCallContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); m_pEntity->ExternStopCamera(); } void MediaServiceSession::Handle_StartEnvCamera(SpReqAnsContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); ctx->Answer(Error_Succeed); } void MediaServiceSession::Handle_StopEnvCamera(SpOnewayCallContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); } void MediaServiceSession::Handle_StartSpeakerRender(SpOnewayCallContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); } void MediaServiceSession::Handle_StopSpeakerRender(SpOnewayCallContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); if (true == m_pEntity->m_bHasStartSpeakerRender){ m_pEntity->StopSpeakerAudioRender(); } } void MediaServiceSession::Handle_ManipulateMediaDevice(SpReqAnsContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); ErrorCodeEnum Error = Error_NotImpl; ctx->Ans.retCode = (int)Error; ctx->Answer(Error_Succeed); } void MediaServiceSession::Handle_GetAudioDevices(SpReqAnsContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); ErrorCodeEnum Error = Error_NotImpl; Error = m_pEntity->GetAudioDevices(ctx->Ans.deviceCount, ctx->Ans.strNames, ctx->Req.audioType); ctx->Ans.retCode = (int)Error; ctx->Answer(Error_Succeed); } void MediaServiceSession::Handle_GetVideoDevices(SpReqAnsContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); ErrorCodeEnum Error = Error_NotImpl; Error = m_pEntity->GetVideoDevices(ctx->Ans.deviceCount, ctx->Ans.strNames); ctx->Ans.retCode = (int)Error; ctx->Answer(Error_Succeed); } void MediaServiceSession::Handle_GetCameraInfos(SpReqAnsContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); ErrorCodeEnum Error = Error_Succeed; ctx->Ans.strEnvCamera = m_pEntity->conf.strVideoEnv; ctx->Ans.strOptCamera = m_pEntity->conf.strVideoOpt; ctx->Ans.retCode = (int)Error; ctx->Answer(Error_Succeed); } void MediaServiceSession::Handle_ManipulateCameras(SpReqAnsContext::Pointer ctx) { DbgToBeidou(ctx->link, __FUNCTION__)(); ErrorCodeEnum Error = Error_NotImpl; DeviceTypeEnum eType = m_pEntity->RvcDeviceType(); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("rvc Device Type is %s, and cmdType is %d.", Device_Type_Table[eType], ctx->Req.cmdType); if (ctx->Req.cmdType == 0) { Error = m_pEntity->StopCamerasAndRecord(); Sleep(50); } else { Sleep(100); Error = m_pEntity->StartCamerasAndRecord(); } ctx->Ans.retCode = (int)Error; ctx->Answer(Error_Succeed); } SP_BEGIN_ENTITY_MAP() SP_ENTITY(CMediaControllerEntity) SP_END_ENTITY_MAP()