mod_mediacontroller.cpp 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "SpIni.h"
  4. #include "y2k_time.h"
  5. #include "capture.h"
  6. #include "Event.h"
  7. #include "../../Other/libaudiorender/iaudiorenderinterface.h"
  8. #include "../include/EventCode.h"
  9. #include "../mod_snapshot/Event.h"
  10. // id:0x208
  11. #include "../mod_assistantchannel/AssistantChannel_client_g.h"
  12. using namespace AssistantChannel;
  13. #include "../mod_assistantchannel/chan_protocol.h"
  14. #include "../mod_selfchecker/SelfChecker_client_g.h"
  15. #include "../mod_selfchecker/SelfChecker_def_g.h"
  16. #include "../include/ModuleMix.h"
  17. #include "MediaController_server_g.h"
  18. #include "MediaController_msg_g.h"
  19. #include "ExternalCameraMsg.h"
  20. using namespace MediaController;
  21. using namespace SelfChecker;
  22. #include "../mod_ScannerSet/ScannerSet_client_g.h"
  23. #include "../mod_ScannerSet/ScannerSet_def_g.h"
  24. using namespace ScannerSet;
  25. #include "../mod_CameraConfigManage/CameraConfigManage_client_g.h"
  26. #include "../mod_CameraConfigManage/CameraConfigManage_def_g.h"
  27. using namespace CameraConfigManage;
  28. #define LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE 0x50500001 //协助通道重启
  29. #define AUTOMATCH_CAMERA_ENV "ENV_"
  30. #define AUTOMATCH_CAMERA_OPT "OPT_"
  31. struct CCameraBrightValue
  32. {
  33. int nValue;
  34. void Serialize(SpBuffer &Buf)
  35. {
  36. Buf & nValue;
  37. }
  38. };
  39. class CMediaControllerEntity;
  40. class SelfChekerClient:public SelfCheckerService_ClientBase
  41. {
  42. public:
  43. SelfChekerClient(CMediaControllerEntity*pEntity);
  44. };
  45. class ChannelMediaControllerClient : public ChannelService_ClientBase
  46. {
  47. public:
  48. ChannelMediaControllerClient(CMediaControllerEntity *pEntity);
  49. virtual void OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer<IReleasable> pData);
  50. virtual void OnMessage(ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer<IReleasable> pData);
  51. };
  52. class MediaServiceSession : public MediaService_ServerSessionBase
  53. {
  54. public:
  55. MediaServiceSession(CMediaControllerEntity *pEntity) : m_pEntity(pEntity){}
  56. virtual void Handle_GetVideoDeviceName(SpReqAnsContext<MediaService_GetVideoDeviceName_Req, MediaService_GetVideoDeviceName_Ans>::Pointer ctx);
  57. virtual void Handle_StartCamera(SpOnewayCallContext<MediaService_StartCamera_Info>::Pointer ctx);
  58. virtual void Handle_StopCamera(SpOnewayCallContext<MediaService_StopCamera_Info>::Pointer ctx);
  59. virtual void Handle_StartEnvCamera(SpReqAnsContext<MediaService_StartEnvCamera_Req, MediaService_StartEnvCamera_Ans>::Pointer ctx);
  60. virtual void Handle_StopEnvCamera(SpOnewayCallContext<MediaService_StopEnvCamera_Info>::Pointer ctx);
  61. //add by clp 20200319
  62. virtual void Handle_StartSpeakerRender(SpOnewayCallContext<MediaService_StartSpeakerRender_Info>::Pointer ctx);
  63. virtual void Handle_StopSpeakerRender(SpOnewayCallContext<MediaService_StopSpeakerRender_Info>::Pointer ctx);
  64. private:
  65. CMediaControllerEntity *m_pEntity;
  66. };
  67. static void __audiomgrlog(void* user_data, const char* fmt, va_list arg)
  68. {
  69. vDbg(fmt, arg);
  70. }
  71. class CMediaControllerEntity : public CEntityBase, public ILogListener, public ITimerListener,public ISysVarListener
  72. {
  73. public:
  74. CMediaControllerEntity() : m_capture(NULL),m_salesaudio_capture(NULL), m_lCaptureEnvCount(0),m_nCameraErrorCode(Error_Succeed),
  75. m_lCaptureEnvOptCount(0), m_lCaptureOptCount(0), m_iEnvEmptyTimes(0), m_iOptEmptyTimes(0),m_bSendCameraError(false),
  76. m_nEnvCameraRestartNum(0),m_nOptCameraRestartNum(0), m_nCameraCount(2),m_pSelfcheckClient(NULL),
  77. strFrontCam("$"), strRearCam("$"), strEnvCam("$"), strUSBCam("$"), strEwsCam("$"), m_bCustomerwareBegin(false),
  78. m_pAudioRenderObj(NULL), m_bRecordPCM(false),m_bIsRemoteRecord(false),m_bHasStartSpeakerRender(false){
  79. #ifdef RVC_OS_LINUX
  80. m_env_mutex = PTHREAD_MUTEX_INITIALIZER;
  81. m_opt_mutex = PTHREAD_MUTEX_INITIALIZER;
  82. m_envopt_mutex = PTHREAD_MUTEX_INITIALIZER;
  83. m_pAudioCap = NULL;
  84. #endif
  85. }
  86. virtual ~CMediaControllerEntity() {}
  87. virtual const char *GetEntityName() const { return "MediaController"; }
  88. virtual bool IsService()const{return true;}
  89. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
  90. {
  91. if (_stricmp(pszKey, SYSVAR_CALLTYPE) == 0)
  92. {
  93. Dbg("sys call type from: %c to %c", pszOldValue[0], pszValue[0]);
  94. if(pszValue[0] == CALLTYPE_NORMAL)
  95. {
  96. m_nSysCallType = 0;
  97. }
  98. else if(pszValue[0] == CALLTYPE_MOBILE)
  99. {
  100. m_nSysCallType = 1;
  101. }
  102. else
  103. {
  104. m_nSysCallType = -1;
  105. }
  106. }
  107. }
  108. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  109. {
  110. m_eDeviceType = eStand2sType;
  111. g_eDeviceType = eStand2sType;
  112. m_bStartCamera = FALSE;
  113. m_bExternControlCam = FALSE;
  114. m_nSysCallType =0;
  115. LOG_FUNCTION();
  116. ErrorCodeEnum Error;
  117. //MessageBoxA(0,0,0,0);
  118. m_pMediaControllerChannel = new ChannelMediaControllerClient(this);
  119. Error = m_pMediaControllerChannel->Connect();
  120. if (Error != Error_Succeed)
  121. {
  122. m_pMediaControllerChannel->SafeDelete();
  123. Dbg("ChannelMediaControllerClient connect fail!");
  124. pTransactionContext->SendAnswer(Error);
  125. return;
  126. }
  127. else
  128. {
  129. Dbg("ChannelMediaControllerClient connect success!");
  130. }
  131. {
  132. CSmartPointer<IEntityFunction> Func = GetFunction();
  133. CSimpleStringA strValue;
  134. Func->RegistSysVarEvent(SYSVAR_CALLTYPE, this);
  135. Func->GetSysVar(SYSVAR_CALLTYPE, strValue);
  136. if (strValue[0] == CALLTYPE_NORMAL)
  137. {
  138. m_nSysCallType = 0;
  139. }
  140. else if (strValue[0] == CALLTYPE_MOBILE)
  141. {
  142. m_nSysCallType = 1;
  143. }
  144. else
  145. {
  146. assert(0);
  147. }
  148. }
  149. {
  150. ChannelService_BeginState_Sub Sub;
  151. Error = m_pMediaControllerChannel->BeginState(Sub);
  152. if (Error != Error_Succeed)
  153. {
  154. LOG_TRACE("BeginState biz channel failed!");
  155. m_pMediaControllerChannel->GetFunction()->CloseSession();
  156. m_pMediaControllerChannel = NULL;
  157. pTransactionContext->SendAnswer(Error);
  158. return;
  159. }
  160. else
  161. {
  162. Dbg("BeginState biz channel success!");
  163. }
  164. }
  165. {
  166. ChannelService_BeginRecv_Sub Sub;
  167. Sub.type = ACM_TYPE_DEVICE;
  168. Error = m_pMediaControllerChannel->BeginRecv(Sub);
  169. if (Error != Error_Succeed)
  170. {
  171. Dbg("Begin BeginRecv ACM_TYPE_DEVICE failed!");
  172. m_pMediaControllerChannel->GetFunction()->CloseSession();
  173. m_pMediaControllerChannel = NULL;
  174. pTransactionContext->SendAnswer(Error);
  175. return;
  176. }
  177. else
  178. {
  179. Dbg("Begin BeginRecv ACM_TYPE_DEVICE success!");
  180. }
  181. }
  182. #ifdef RVC_OS_LINUX
  183. {
  184. audiomgr_callback_t t_callback = { 0 };
  185. t_callback.debug = &__audiomgrlog;
  186. Dbg("sizeof audiomgr_callback_t == %d.", sizeof(audiomgr_callback_t));
  187. Dbg("sizeof calss IAudioMgr == %d.", sizeof(IAudioMgr));
  188. m_pAudioCap = CreateAudioMgrObj(&t_callback);
  189. if (0 == m_pAudioCap->audio_mgr_initialize()) {
  190. Dbg("Audio Manager Initialize success!");
  191. }
  192. else {
  193. Dbg("Audio Manager Initialize failed!");
  194. return;
  195. }
  196. }
  197. #endif
  198. //is Pad Version
  199. m_eDeviceType = RvcGetDeviceType();
  200. g_eDeviceType = m_eDeviceType;
  201. if (Error_Succeed == GetSalesRecordAudioParam()){
  202. Dbg("get sales record audio param success, and sales audio capture sample rate is %d, record local PCM flag is %s.", m_nSalesAudioSmpPsec, m_bRecordPCM ? "true":"false");
  203. }
  204. // only register once!! edit by ly 2017/03/21
  205. if (GetFunction()->RegistSysVarEvent("SessionID", this) != Error_Succeed){
  206. LOG_TRACE("register sysvar %s failed!", "SessionID");
  207. }
  208. memset(&conf,0,sizeof(capture_config_t));
  209. memset(&m_sales_audio_conf, 0, sizeof(rvc_audio_capture_config_t));
  210. Error = (ErrorCodeEnum)capture_lib_init();
  211. if (Error == Error_Succeed)
  212. {
  213. #ifdef RVC_OS_LINUX
  214. RvcGetAudioDevice();
  215. #endif
  216. Error = LoadConfig(&conf);
  217. if (Error!=Error_Succeed)
  218. {
  219. if((Error == Error_OptCamera)||(Error == Error_EnvCamera))
  220. {
  221. if (Error == Error_EnvCamera)
  222. {
  223. LOG_TRACE("Load EnvCamera Config failed!");
  224. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_ENV_ERROR);
  225. SetCameraSysVar(CAMERA_ENV_ERROR);
  226. Dbg("Camera State to CAMERA_ENV_ERROR");
  227. m_nCameraErrorCode = Error_EnvCamera;
  228. GetFunction()->SetUserDefineState(USER_MEDIA_ENVERRROR);
  229. }
  230. else if (Error == Error_OptCamera)
  231. {
  232. LOG_TRACE("Load OptCamera Config failed!");
  233. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_OPT_ERROR);
  234. SetCameraSysVar(CAMERA_OPT_ERROR);
  235. Dbg("Camera State to CAMERA_OPT_ERROR");
  236. m_nCameraErrorCode = Error_OptCamera;
  237. GetFunction()->SetUserDefineState(USER_MEDIA_OPTERROR);
  238. }
  239. }
  240. else
  241. {
  242. if (Error == Error_AllCamera)
  243. {
  244. LOG_TRACE("Load all camera Config failed!");
  245. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_BOTH_ERROR);
  246. SetCameraSysVar(CAMERA_BOTH_ERROR);
  247. Dbg("Camera State to CAMERA_BOTH_ERROR");
  248. m_nCameraErrorCode = Error_AllCamera;
  249. GetFunction()->SetUserDefineState(USER_MEDIA_ALLERROR);
  250. }
  251. LOG_TRACE("Load Config failed!");
  252. }
  253. }
  254. if ((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType))
  255. {
  256. CAutoArray<CSimpleStringA> hspCams;
  257. auto rc = GetHSPCameras(hspCams);
  258. Dbg("[GetHSPCameras]: (0x%x,%d)", rc, hspCams.GetCount());
  259. /************************************************************************/
  260. /* read runcfg & 暂存strVideoEnv add by ly 20160531 */
  261. /************************************************************************/
  262. if (eDesk2SType == m_eDeviceType)
  263. {
  264. strFrontCam = conf.strVideoEnv;
  265. strRearCam = "$";
  266. // 将内置摄像头写入到运行时配置
  267. SaveInnerCamera();
  268. }
  269. else
  270. {
  271. ErrorCodeEnum ErrCod = LoadRunConfig(strFrontCam, strRearCam);
  272. if (ErrCod == Error_Succeed) {
  273. Dbg("[dbg] Error=0x%x while LoadRunConfig.", ErrCod);
  274. if (strFrontCam.GetLength() <= 1 || strFrontCam != conf.strVideoEnv) {
  275. strFrontCam = conf.strVideoEnv;
  276. if (conf.strVideoOpt.GetLength() <= 1) {
  277. m_nCameraCount = videocap_optdev_fetch(strFrontCam,strEwsCam,hspCams,strRearCam);
  278. }
  279. else { // 如果root.ini中已配置
  280. strRearCam = conf.strVideoOpt;
  281. }
  282. // 将内置摄像头写入到运行时配置
  283. SaveInnerCamera();
  284. }
  285. }
  286. else {
  287. strFrontCam = conf.strVideoEnv;
  288. if (conf.strVideoOpt.GetLength() <= 1) {
  289. m_nCameraCount = videocap_optdev_fetch(strFrontCam,strEwsCam,hspCams,strRearCam);
  290. }
  291. else { // 如果root.ini中已配置
  292. strRearCam = conf.strVideoOpt;
  293. }
  294. // 将内置摄像头写入到运行时配置
  295. SaveInnerCamera();
  296. }
  297. }
  298. // 尝试获取外接摄像头
  299. m_nCameraCount = videocap_outerdev_fetch(strFrontCam,strRearCam,strEwsCam,hspCams,strUSBCam);
  300. Dbg("[dbg] strUSBCam=%s",(LPCTSTR)strUSBCam);
  301. strEnvCam = conf.strVideoEnv;
  302. }
  303. }
  304. else
  305. {
  306. LOG_TRACE("capture_lib_init failed!");
  307. }
  308. //PAD版获取客户感知状态
  309. CSimpleStringA strCustomerAware;
  310. if (Error != Error_AllCamera)
  311. {
  312. CSmartPointer<IEntityFunction> Func = GetFunction();
  313. if (Func->RegistSysVarEvent("CustomerHandle", this) != Error_Succeed)
  314. {
  315. LOG_TRACE("register sys var %s failed!", "CustomerHandle");
  316. }
  317. else
  318. {
  319. Func->GetSysVar("CustomerHandle", strCustomerAware);
  320. //Dbg("CustomerHandle = %c",strCustomerAware[0]);
  321. Dbg("CustomerHandle = %s",(LPCTSTR)strCustomerAware);
  322. }
  323. }
  324. //启动摄像头
  325. if ((Error!=Error_AllCamera)&&(strCustomerAware.GetLength()>0)&&(strCustomerAware[0] != 'N'))
  326. {
  327. Error = StartCamera();
  328. if (Error == Error_Succeed)
  329. {
  330. m_bStartCamera = TRUE;
  331. CSimpleStringA strSessionId;
  332. CSmartPointer<IEntityFunction> Func = GetFunction();
  333. Func->GetSysVar("SessionID", strSessionId);
  334. LogEvent(Severity_Middle, EVENT_MOD_BEGIN_RECORD,strSessionId);
  335. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_NO_ERROR);
  336. SetCameraSysVar(CAMERA_NO_ERROR);
  337. Dbg("Camera State to CAMERA_NO_ERROR");
  338. m_nCameraErrorCode = Error_Succeed;
  339. GetFunction()->SetUserDefineState(USER_MEDIA_IDLE);
  340. }
  341. else
  342. {
  343. if((Error == Error_EnvCamera)||(Error == Error_OptCamera))
  344. {
  345. CSimpleStringA strSessionId;
  346. CSmartPointer<IEntityFunction> Func = GetFunction();
  347. Func->GetSysVar("SessionID", strSessionId);
  348. LogEvent(Severity_Middle, EVENT_MOD_BEGIN_RECORD,strSessionId);
  349. m_bStartCamera = TRUE;
  350. if (Error == Error_EnvCamera)
  351. {
  352. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_ENV_ERROR);
  353. SetCameraSysVar(CAMERA_ENV_ERROR);
  354. Dbg("Camera State to CAMERA_ENV_ERROR");
  355. m_nCameraErrorCode = Error_EnvCamera;
  356. GetFunction()->SetUserDefineState(USER_MEDIA_ENVERRROR);
  357. Error = Error_Succeed;
  358. }
  359. else if (Error == Error_OptCamera)
  360. {
  361. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_OPT_ERROR);
  362. SetCameraSysVar(CAMERA_OPT_ERROR);
  363. Dbg("StartCamera = Error_OptCamera");
  364. m_nCameraErrorCode = Error_OptCamera;
  365. GetFunction()->SetUserDefineState(USER_MEDIA_OPTERROR);
  366. Error = Error_Succeed;
  367. }
  368. }
  369. else if(Error == Error_AllCamera)
  370. {
  371. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_BOTH_ERROR);
  372. SetCameraSysVar(CAMERA_BOTH_ERROR);
  373. Dbg("Camera State to CAMERA_BOTH_ERROR");
  374. m_nCameraErrorCode = Error_AllCamera;
  375. m_bStartCamera = FALSE;
  376. GetFunction()->SetUserDefineState(USER_MEDIA_ALLERROR);
  377. }
  378. else
  379. {
  380. SetCameraSysVar(Error);
  381. Dbg("Camera State to Other Error");
  382. m_nCameraErrorCode = Error;
  383. m_bStartCamera = FALSE;
  384. RealSelfCheck(); //add by chenlp 20210907
  385. }
  386. }
  387. }
  388. if(Error != Error_AllCamera) // edit by ly 20160329
  389. {
  390. int i = 0;
  391. if ((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType)||(eDesk1SType == m_eDeviceType)||(eDesk2SIntegratedType == m_eDeviceType))
  392. {
  393. m_arrListener.Init(18);
  394. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, MOD_EVENT_SNAPSHOT_START_CAPTURE_ENV);
  395. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, MOD_EVENT_SNAPSHOT_START_CAPTURE_OPT);
  396. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, MOD_EVENT_SNAPSHOT_START_CAPTURE_ENVOPT);
  397. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE,NULL,false);
  398. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_CUSTOMERAWARE_BEGIN, NULL, false);
  399. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_CUSTOMERAWARE_END, NULL, false);
  400. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_USB_CAMER_INPUT,NULL,false);
  401. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_USB_CAMER_OUTPUT,NULL,false);
  402. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_USB_CAMERA_NOT_ONLY,NULL,false);
  403. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_RECORDFAILED,NULL,false);
  404. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RECORDFAILED,NULL,false);
  405. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_BEGIN_CAMERA_CONFIG,NULL,false);
  406. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_END_CAMERA_CONFIG,NULL,false);
  407. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTREMOTERECORD,NULL,false);
  408. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPREMOTERECORD,NULL,false);
  409. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORD,NULL,false);
  410. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPRECORD,NULL,false);
  411. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORDPREVIEW,NULL,false);
  412. //GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_START_CONTINURECORD,NULL,false);
  413. //GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_STOP_CONTINURECORD,NULL,false);
  414. }
  415. else
  416. {
  417. m_arrListener.Init(13);
  418. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, MOD_EVENT_SNAPSHOT_START_CAPTURE_ENV);
  419. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, MOD_EVENT_SNAPSHOT_START_CAPTURE_OPT);
  420. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, MOD_EVENT_SNAPSHOT_START_CAPTURE_ENVOPT);
  421. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE,NULL,false);
  422. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_CUSTOMERAWARE_BEGIN, NULL, false);
  423. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_CUSTOMERAWARE_END, NULL, false);
  424. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_RECORDFAILED,NULL,false);
  425. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RECORDFAILED,NULL,false);
  426. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTREMOTERECORD,NULL,false);
  427. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPREMOTERECORD,NULL,false);
  428. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORD,NULL,false);
  429. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPRECORD,NULL,false);
  430. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORDPREVIEW,NULL,false);
  431. }
  432. }
  433. pTransactionContext->SendAnswer(Error);
  434. }
  435. // add by ly at 20160801
  436. virtual void OnStarted()
  437. {
  438. m_pSelfcheckClient = new SelfChekerClient(this);
  439. ErrorCodeEnum Error = m_pSelfcheckClient->Connect();
  440. if (Error != Error_Succeed)
  441. {
  442. m_pSelfcheckClient->SafeDelete();
  443. m_pSelfcheckClient = NULL;
  444. Dbg("SelfcheckClient connect fail!");
  445. //pTransactionContext->SendAnswer(Error);
  446. //return;
  447. }
  448. else
  449. {
  450. Dbg("SelfcheckClient connect success!");
  451. }
  452. #ifdef RVC_OS_WIN
  453. m_pAudioRenderObj = CreateIAudioRenderObj();
  454. if (NULL != m_pAudioRenderObj) {
  455. Dbg("create audio render success, and addr is 0x%08x.", m_pAudioRenderObj);
  456. }
  457. else {
  458. Dbg("create audio render failed.");
  459. }
  460. #else
  461. #endif // RVC_OS_WIN
  462. }
  463. #if defined(RVC_OS_LINUX)
  464. ErrorCodeEnum RvcGetAudioDevice()
  465. {
  466. ErrorCodeEnum Error = Error_Param;
  467. if (NULL != m_pAudioCap){
  468. int icountmic = m_pAudioCap->audio_get_device_count(true);
  469. Dbg("audio input device(%d):", icountmic);
  470. int i = 0;
  471. for (; i < icountmic; i++) {
  472. char strname[MAX_PATH] = { 0 };
  473. m_pAudioCap->audio_get_device_name(strname, MAX_PATH, true, i);
  474. Dbg("%d = %s", i, strname);
  475. }
  476. int icountspeaker = m_pAudioCap->audio_get_device_count(false);
  477. Dbg("audio output device(%d):", icountspeaker);
  478. for (i = 0; i < icountspeaker; i++) {
  479. char strname[MAX_PATH] = { 0 };
  480. m_pAudioCap->audio_get_device_name(strname, MAX_PATH, false, i);
  481. Dbg("%d = %s", i, strname);
  482. }
  483. Error = Error_Succeed;
  484. }
  485. return Error;
  486. }
  487. #endif
  488. DeviceTypeEnum RvcGetDeviceType()
  489. {
  490. DeviceTypeEnum eType = eStand2sType;
  491. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  492. CSystemStaticInfo stStaticinfo;
  493. spFunction->GetSystemStaticInfo(stStaticinfo);
  494. if (stricmp(stStaticinfo.strMachineType, "RVC.PAD") == 0) {
  495. if (stricmp(stStaticinfo.strSite, "CMB.FLB") == 0) {
  496. eType = eMobilePadType;
  497. }
  498. else {
  499. eType = ePadtype;
  500. }
  501. }
  502. else if (stricmp(stStaticinfo.strMachineType, "RVC.Desk2S") == 0) {
  503. eType = eDesk2SType;
  504. WORD nMajor = stStaticinfo.MachineVersion.GetMajor();
  505. WORD nMinor = stStaticinfo.MachineVersion.GetMinor();
  506. Dbg("MachineVersion is %d.%d", nMajor, nMinor);
  507. if (2 == nMajor) {
  508. eType = eDesk2SIntegratedType;
  509. }
  510. }
  511. else if (stricmp(stStaticinfo.strMachineType, "RPM.Stand1S") == 0) {
  512. eType = eRpm1sType;
  513. }
  514. else if (stricmp(stStaticinfo.strMachineType, "RVC.Desk1S") == 0) {
  515. eType = eDesk1SType;
  516. }
  517. else {
  518. eType = eStand2sType;
  519. }
  520. if (eType >= 0 && eType < sizeof(Device_Type_Table) / sizeof(char*)) {
  521. LOG_TRACE("device type is %s.", Device_Type_Table[eType]);
  522. }
  523. return eType;
  524. }
  525. void SetCameraSysVar(int n)
  526. {
  527. if (n==0)
  528. {
  529. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_OPT_ERROR);
  530. SetCameraSysVar(CAMERA_OPT_ERROR);
  531. Dbg("Camera State to CAMERA_OPT_ERROR");
  532. }
  533. else if (n==1)
  534. {
  535. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_ENV_ERROR);
  536. SetCameraSysVar(CAMERA_ENV_ERROR);
  537. Dbg("Camera State to CAMERA_ENV_ERROR");
  538. }
  539. else if (n==-1)
  540. {
  541. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_BOTH_ERROR);
  542. SetCameraSysVar(CAMERA_BOTH_ERROR);
  543. Dbg("Camera State to CAMERA_BOTH_ERROR");
  544. }
  545. else if (n==3)
  546. {
  547. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_NO_ERROR);
  548. SetCameraSysVar(CAMERA_NO_ERROR);
  549. Dbg("Camera State to CAMERA_NO_ERROR");
  550. }
  551. }
  552. ErrorCodeEnum GetSalesRecordAudioParam()
  553. {
  554. CSmartPointer<IConfigInfo> spConfig;
  555. SpIniMappingTable table;
  556. ErrorCodeEnum Error = GetFunction()->OpenConfig(Config_CenterSetting, spConfig);
  557. if (Error == Error_Succeed)
  558. {
  559. table.AddEntryInt("SalesRecorder", "AudioSampleRate", m_nSalesAudioSmpPsec, 8);
  560. table.AddEntryBoolean("SalesRecorder", "IsRecordPCM", m_bRecordPCM, false);
  561. Error= table.Load(spConfig);
  562. }
  563. if (m_nSalesAudioSmpPsec != 8 && m_nSalesAudioSmpPsec != 16)
  564. {
  565. m_nSalesAudioSmpPsec = 8;
  566. }
  567. m_nSalesAudioSmpPsec *= 1000;
  568. #ifdef RVC_OS_WIN
  569. #else
  570. m_nSalesAudioSmpPsec = 44100;
  571. #endif
  572. return Error;
  573. }
  574. ErrorCodeEnum SetEnvCameraOnSysVar(const CSimpleStringA strOnState)
  575. {
  576. ErrorCodeEnum Error = Error_Succeed;
  577. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  578. Error = spFunction->SetSysVar(SYSVAR_ENVCAMERAON, strOnState.GetData());
  579. return Error;
  580. }
  581. // add by ly at 20161018
  582. ErrorCodeEnum SetCameraSysVar(const CSimpleStringA &newVal)
  583. {
  584. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  585. CSimpleStringA val = newVal;
  586. if ('B' == val[0]) {
  587. LogError(Severity_High, Error_Hardware, ERROR_MOD_MEDIACONTROLLER_CONFIG_ALLERROR, "all config cameras error.");
  588. }
  589. if (eStand2sType == m_eDeviceType)
  590. {
  591. return spFunction->SetSysVar(SYSVAR_CAMERASTATE, (LPCTSTR)newVal);
  592. }
  593. switch (val[0])
  594. {
  595. case 'E':
  596. // comment by ly@2019/03/19
  597. //if(strstr((LPCTSTR)conf.strVideoEnv,(LPCTSTR)strUSBCam))
  598. //{
  599. // // 当前正在使用外接摄像头
  600. // val = val.Append("外接");
  601. //}
  602. //else
  603. {
  604. if (!strstr((LPCTSTR)strFrontCam,";"))
  605. {
  606. val = val.Append((LPCTSTR)strFrontCam);
  607. }
  608. else
  609. {
  610. val = val.Append((LPCTSTR)strFrontCam.SubString(0,strFrontCam.IndexOf(";")));
  611. }
  612. }
  613. break;
  614. case 'O':
  615. if (!strstr((LPCTSTR)strRearCam,";"))
  616. {
  617. val = val.Append((LPCTSTR)strRearCam);
  618. }
  619. else
  620. {
  621. val = val.Append((LPCTSTR)strRearCam.SubString(0,strRearCam.IndexOf(";")));
  622. }
  623. break;
  624. // comment by ly@2019/03/19
  625. //case 'U':
  626. // val = val.Append("外接");
  627. // break;
  628. case 'B':
  629. val = val.Append("内置前、后");
  630. break;
  631. case 'N':
  632. case 'I':
  633. default:
  634. break;
  635. }
  636. return spFunction->SetSysVar(SYSVAR_CAMERASTATE, (LPCTSTR)val);
  637. }
  638. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  639. {
  640. LOG_FUNCTION();
  641. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  642. for (int i = 0; i < m_arrListener.GetCount(); ++i)
  643. {
  644. spFunction->UnsubscribeLog(m_arrListener[i]);
  645. }
  646. spFunction->UnregistSysVarEvent(SYSVAR_CALLTYPE);
  647. if (m_capture) {
  648. capture_stop(m_capture);
  649. capture_destroy(m_capture);
  650. m_capture = NULL;
  651. }
  652. if (m_salesaudio_capture){
  653. salesrecord_audio_capture_stop(m_salesaudio_capture);
  654. salesaudio_capture_destroy(m_salesaudio_capture);
  655. m_salesaudio_capture = NULL;
  656. }
  657. #ifdef RVC_OS_WIN
  658. if (NULL != m_pAudioRenderObj) {
  659. Dbg("destroy audio render obj,and it's addr is 0x%08x.", m_pAudioRenderObj);
  660. DestroyIAudioRenderObj(m_pAudioRenderObj);
  661. }
  662. #else
  663. if (NULL != m_pAudioCap){
  664. m_pAudioCap->audio_mgr_terminate();
  665. DestroyIAudioMgrObj(m_pAudioCap);
  666. m_pAudioCap = NULL;
  667. }
  668. #endif // RVC_OS_WIN
  669. capture_lib_term();
  670. pTransactionContext->SendAnswer(Error_Succeed);
  671. }
  672. virtual void OnTimeout(DWORD dwTimerID)
  673. {
  674. //Dbg("OnTimeout");
  675. int env_n, opt_n;
  676. DWORD nLastEnvTime,nLastOptTime;
  677. bool bEnvTimeout = false;
  678. bool bOptTimeout = false;
  679. if (!m_capture)
  680. {
  681. Dbg("m_capture =Null");
  682. return;
  683. }
  684. if (!m_bStartCamera)
  685. {
  686. Dbg("m_bStartCamera =false");
  687. return;
  688. }
  689. BOOL bIsPadType = FALSE;
  690. if ((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType)||(eDesk1SType == m_eDeviceType)||(eDesk2SIntegratedType == m_eDeviceType))
  691. {
  692. bIsPadType = TRUE;
  693. }
  694. capture_detect_camera_bug(m_capture, &env_n, &opt_n,bIsPadType);
  695. capture_get_last_frametime(m_capture,&nLastEnvTime,&nLastOptTime,bIsPadType);
  696. if (env_n == 0)
  697. {
  698. if (m_iEnvEmptyTimes < CAMERA_BUG_THRESHOLD)
  699. {
  700. m_iEnvEmptyTimes++;
  701. Dbg("get env camera picture fail,Times=%d",m_iEnvEmptyTimes);
  702. }
  703. }
  704. else if (env_n == -1)
  705. {
  706. m_iEnvEmptyTimes = CAMERA_BUG_THRESHOLD;
  707. }
  708. else
  709. {
  710. if (m_iEnvEmptyTimes == CAMERA_BUG_THRESHOLD)
  711. {
  712. Dbg("env camera get right!");
  713. }
  714. m_iEnvEmptyTimes = 0;
  715. }
  716. //env图像是否超时
  717. if(nLastEnvTime > 0)
  718. {
  719. //Dbg("now=%d,nLastEnvTime=%d",y2k_time_now(),nLastEnvTime);
  720. if(((y2k_time_now()-nLastEnvTime) > CAMERA_TIMEOUT)&&!bEnvTimeout)
  721. {
  722. bEnvTimeout = true;
  723. Dbg("bEnvTimeout");
  724. }
  725. else if (((y2k_time_now()-nLastEnvTime) < CAMERA_TIMEOUT)&&bEnvTimeout)
  726. {
  727. bEnvTimeout = false;
  728. Dbg("change env camera from bEnvTimeout to OK");
  729. }
  730. }
  731. //env是否30S没有图像或者图像20秒没有更新
  732. if(((m_iEnvEmptyTimes == CAMERA_BUG_THRESHOLD)||bEnvTimeout)&&(m_nCameraErrorCode!=Error_EnvCamera)&&(m_nCameraErrorCode!=Error_AllCamera))
  733. {
  734. char strMessage[MAX_PATH*2] = {0};
  735. get_camera_exception_message(strMessage, MAX_PATH*2, conf.strVideoEnv, "Env camera bug detected!");
  736. LogWarn(Severity_Middle, Error_Hardware, ERROR_MOD_MEDIACONTROLLER_ENVCAMERA_BUG, strMessage);
  737. if ((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType)||(eDesk1SType == m_eDeviceType)||(eDesk2SIntegratedType == m_eDeviceType))
  738. {
  739. // comment by ly@2019/03/19
  740. //if(!strstr((LPCTSTR)conf.strVideoEnv,(LPCTSTR)strUSBCam)) // 如果不是外接摄像头
  741. {
  742. m_nCameraErrorCode = Error_AllCamera;
  743. /*ChangeSysvar(m_nCameraErrorCode);*/
  744. ChangeSysvar(Error_EnvCamera);
  745. RealSelfCheck();
  746. return;
  747. }
  748. }
  749. else
  750. {
  751. if (m_nCameraErrorCode == Error_Succeed)
  752. {
  753. m_nCameraErrorCode = Error_EnvCamera;
  754. ChangeSysvar(m_nCameraErrorCode);
  755. }
  756. else if (m_nCameraErrorCode == Error_OptCamera)
  757. {
  758. m_nCameraErrorCode = Error_AllCamera;
  759. ChangeSysvar(m_nCameraErrorCode);
  760. RealSelfCheck();
  761. return;
  762. }
  763. }
  764. }
  765. else if((m_iEnvEmptyTimes != CAMERA_BUG_THRESHOLD)&&!bEnvTimeout&&((m_nCameraErrorCode == Error_EnvCamera)||(m_nCameraErrorCode == Error_AllCamera)))
  766. {
  767. if ((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType)||(eDesk1SType == m_eDeviceType)||(eDesk2SIntegratedType == m_eDeviceType))
  768. {
  769. m_nCameraErrorCode = Error_Succeed;
  770. ChangeSysvar(m_nCameraErrorCode);
  771. }
  772. else
  773. {
  774. if (m_nCameraErrorCode == Error_EnvCamera)
  775. {
  776. m_nCameraErrorCode = Error_Succeed;
  777. ChangeSysvar(m_nCameraErrorCode);
  778. Dbg("changeSysvar to No_Error");
  779. }
  780. else if (m_nCameraErrorCode == Error_AllCamera)
  781. {
  782. m_nCameraErrorCode = Error_OptCamera;
  783. ChangeSysvar(m_nCameraErrorCode);
  784. Dbg("changeSysvar to Opt_Error");
  785. }
  786. }
  787. }
  788. //opt是否没有图像
  789. if (eStand2sType == m_eDeviceType)
  790. {
  791. if (opt_n == 0)
  792. {
  793. if (m_iOptEmptyTimes < CAMERA_BUG_THRESHOLD)
  794. {
  795. m_iOptEmptyTimes++;
  796. Dbg("get opt camera picture fail,Times=%d",m_iOptEmptyTimes);
  797. }
  798. }
  799. else if (opt_n == -1)
  800. {
  801. m_iOptEmptyTimes = CAMERA_BUG_THRESHOLD;
  802. }
  803. else
  804. {
  805. if (m_iOptEmptyTimes == CAMERA_BUG_THRESHOLD)
  806. {
  807. Dbg("opt camera get right!");
  808. }
  809. m_iOptEmptyTimes = 0;
  810. }
  811. }
  812. //opt图像是否超时
  813. if((nLastOptTime > 0)&&(eStand2sType == m_eDeviceType))
  814. {
  815. if(((y2k_time_now()-nLastOptTime) > CAMERA_TIMEOUT)&&!bOptTimeout)
  816. {
  817. bOptTimeout = true;
  818. Dbg("bOptTimeout");
  819. }
  820. else if (((y2k_time_now()-nLastOptTime) < CAMERA_TIMEOUT)&&bOptTimeout)
  821. {
  822. bOptTimeout = false;
  823. Dbg("change opt camera from bOptTimeout to OK");
  824. }
  825. }
  826. //opt是否100S没有图像或者图像20秒没有更新
  827. if(((m_iOptEmptyTimes == CAMERA_BUG_THRESHOLD) ||bOptTimeout)&&(m_nCameraErrorCode!=Error_OptCamera)&&(m_nCameraErrorCode!=Error_AllCamera)&&(eStand2sType == m_eDeviceType))
  828. {
  829. char strMessage[MAX_PATH*2] = {0};
  830. get_camera_exception_message(strMessage, MAX_PATH*2, conf.strVideoOpt, "Opt camera bug detected!");
  831. LogWarn(Severity_Middle, Error_Hardware, ERROR_MOD_MEDIACONTROLLER_OPECAMERA_BUG, strMessage);
  832. if (m_nCameraErrorCode == Error_Succeed)
  833. {
  834. m_nCameraErrorCode = Error_OptCamera;
  835. ChangeSysvar(m_nCameraErrorCode);
  836. }
  837. else if (m_nCameraErrorCode == Error_EnvCamera)
  838. {
  839. m_nCameraErrorCode = Error_AllCamera;
  840. ChangeSysvar(m_nCameraErrorCode);
  841. RealSelfCheck();
  842. return;
  843. }
  844. }
  845. else if((m_iOptEmptyTimes != CAMERA_BUG_THRESHOLD)&&!bOptTimeout&&((m_nCameraErrorCode == Error_OptCamera)||(m_nCameraErrorCode == Error_AllCamera))&&(eStand2sType == m_eDeviceType))
  846. {
  847. if (m_nCameraErrorCode == Error_OptCamera)
  848. {
  849. m_nCameraErrorCode = Error_Succeed;
  850. ChangeSysvar(m_nCameraErrorCode);
  851. Dbg("changeSysvar to No_Error");
  852. }
  853. else if (m_nCameraErrorCode == Error_AllCamera)
  854. {
  855. m_nCameraErrorCode = Error_EnvCamera;
  856. ChangeSysvar(m_nCameraErrorCode);
  857. Dbg("changeSysvar to Env_Error");
  858. }
  859. }
  860. //重启摄像头
  861. if((m_nCameraErrorCode == Error_EnvCamera)&&(m_nEnvCameraRestartNum<CAMERA_RESTARTNUM))
  862. {
  863. if (ReStartCamera(ENVCAMERA) != Error_Succeed)
  864. {
  865. m_nEnvCameraRestartNum++;
  866. }
  867. else
  868. {
  869. m_nEnvCameraRestartNum = 0;
  870. m_nCameraErrorCode = Error_Succeed;
  871. ChangeSysvar(m_nCameraErrorCode);
  872. m_iEnvEmptyTimes = 0;
  873. bEnvTimeout = false;
  874. }
  875. }
  876. else if((m_nCameraErrorCode == Error_OptCamera)&&(m_nOptCameraRestartNum<CAMERA_RESTARTNUM)&&(eStand2sType == m_eDeviceType))
  877. {
  878. if (ReStartCamera(OPTCAMERA) != Error_Succeed)
  879. m_nOptCameraRestartNum++;
  880. else
  881. {
  882. m_nOptCameraRestartNum = 0;
  883. m_nCameraErrorCode = Error_Succeed;
  884. ChangeSysvar(m_nCameraErrorCode);
  885. m_iOptEmptyTimes = 0;
  886. bOptTimeout = false;
  887. }
  888. }
  889. else if (m_nCameraErrorCode == Error_AllCamera)
  890. {
  891. if (m_nEnvCameraRestartNum<CAMERA_RESTARTNUM)
  892. {
  893. if (ReStartCamera(ENVCAMERA) != Error_Succeed)
  894. m_nEnvCameraRestartNum++;
  895. else
  896. {
  897. m_nEnvCameraRestartNum = 0;
  898. m_nCameraErrorCode = Error_OptCamera;
  899. ChangeSysvar(m_nCameraErrorCode);
  900. m_iEnvEmptyTimes = 0;
  901. bEnvTimeout = false;
  902. }
  903. }
  904. if((m_nOptCameraRestartNum<CAMERA_RESTARTNUM)&&(eStand2sType == m_eDeviceType))
  905. {
  906. if (ReStartCamera(OPTCAMERA) != Error_Succeed)
  907. m_nOptCameraRestartNum++;
  908. else
  909. {
  910. m_nOptCameraRestartNum = 0;
  911. m_iOptEmptyTimes = 0;
  912. bOptTimeout = false;
  913. if (m_nCameraErrorCode == Error_AllCamera)
  914. {
  915. m_nCameraErrorCode = Error_EnvCamera;
  916. ChangeSysvar(m_nCameraErrorCode);
  917. }
  918. else
  919. {
  920. m_nCameraErrorCode = Error_Succeed;
  921. ChangeSysvar(m_nCameraErrorCode);
  922. }
  923. }
  924. }
  925. }
  926. }
  927. bool SetAutoBright(ErrorCodeEnum nCode)
  928. {
  929. return capture_set_autobrightness(m_capture,nCode);
  930. }
  931. //camera gain adjust
  932. void OnReceivePkt(int sub_type, const char *buffer, int size)
  933. {
  934. if (sub_type == ACM_SET_CAMERABRIGHT)
  935. {
  936. if (m_bStartCamera)
  937. {
  938. if (eStand2sType == m_eDeviceType)
  939. {
  940. //vamera bright adj
  941. CCameraBrightValue num;
  942. SpBuffer buf;
  943. buf.OpenRead(buffer,size);
  944. num.Serialize(buf);
  945. Dbg("recv ACM_SET_CAMERABRIGHT = %d",num.nValue);
  946. if (capture_adj_brightness(m_capture,num.nValue,m_nCameraErrorCode) == true)
  947. {
  948. Dbg("ACM_SET_CAMERABRIGHT success!");
  949. SendCameraBright();
  950. }
  951. else
  952. {
  953. Dbg("ACM_SET_CAMERABRIGHT fail!");
  954. }
  955. }
  956. else
  957. {
  958. Dbg("pad type cannot adj brightness");
  959. }
  960. }
  961. else
  962. {
  963. Dbg("the camera not start!");
  964. }
  965. }
  966. }
  967. ErrorCodeEnum RealSelfCheck()
  968. {
  969. ErrorCodeEnum Error = Error_Succeed;
  970. if (m_pSelfcheckClient)
  971. {
  972. SelfCheckerService_RealCheck_Req req;
  973. req.name = GetEntityName();
  974. SelfCheckerService_RealCheck_Ans ans;
  975. DWORD Timeout = 500;
  976. Error = m_pSelfcheckClient->RealCheck(req,ans,Timeout);
  977. if (Error!=Error_Succeed)
  978. {
  979. Dbg("RealSelfcheck fail!");
  980. }
  981. else
  982. {
  983. Dbg("RealSelfcheck");
  984. }
  985. }
  986. return Error;
  987. }
  988. void SendCameraBright()
  989. {
  990. if (m_nSysCallType == 0)
  991. {
  992. ChannelService_Send_Info Info;
  993. Info.compress = false;
  994. Info.encrypt = false;
  995. Info.type = ACM_TYPE_DEVICE;
  996. Info.id = 0;
  997. Info.sub_type = ACM_CAMERA_BRIGHT;
  998. Info.data.Alloc(sizeof(int));
  999. SpBuffer buf;
  1000. buf.OpenWrite();
  1001. int nValue = 0;
  1002. bool rslt = true;
  1003. nValue = capture_get_brightness(m_capture,m_nCameraErrorCode);
  1004. if (nValue >= 0)
  1005. {
  1006. buf & nValue;
  1007. Info.data = buf.ToBlob();
  1008. m_pMediaControllerChannel->Send(Info);
  1009. Dbg("send cur camera bright value = %d",nValue);
  1010. }
  1011. else
  1012. {
  1013. Dbg("send cur camera bright value Fail!");
  1014. }
  1015. }
  1016. else
  1017. {
  1018. Dbg("cur call type cannot send pkt");
  1019. }
  1020. }
  1021. ErrorCodeEnum StartEnvCamera()
  1022. {
  1023. LOG_FUNCTION();
  1024. ErrorCodeEnum Error = Error_Succeed;
  1025. if (FALSE == m_bStartCamera){
  1026. Error = StartCamera();
  1027. if (Error_Succeed == Error){
  1028. SetCameraSysVar(CAMERA_NO_ERROR);
  1029. Dbg("Camera State to CAMERA_NO_ERROR");
  1030. m_bStartCamera = TRUE;
  1031. }
  1032. }
  1033. else{
  1034. Dbg("camera already start.");
  1035. }
  1036. return Error;
  1037. }
  1038. ErrorCodeEnum StopEnvCamera()
  1039. {
  1040. LOG_FUNCTION();
  1041. if (m_capture){
  1042. GetFunction()->KillTimer(1);
  1043. capture_stop(m_capture);
  1044. capture_destroy(m_capture);
  1045. m_capture = NULL;
  1046. }
  1047. m_bStartCamera = FALSE;
  1048. return Error_Succeed;
  1049. }
  1050. bool m_bSendCameraError;
  1051. int m_iEnvEmptyTimes;
  1052. int m_iOptEmptyTimes;
  1053. int m_nEnvCameraRestartNum;
  1054. int m_nOptCameraRestartNum;
  1055. private:
  1056. ErrorCodeEnum LoadRunConfig(CSimpleStringA& frontcam, CSimpleStringA& rearcam)
  1057. {
  1058. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  1059. CSmartPointer<IConfigInfo> spConfig;
  1060. ErrorCodeEnum Error = spFunction->OpenConfig(Config_Run, spConfig);
  1061. if (Error == Error_Succeed) {
  1062. SpIniMappingTable table;
  1063. table.AddEntryString("Video", "FrontCamera", frontcam, "$");
  1064. table.AddEntryString("Video", "RearCamera", rearcam, "$");
  1065. Error = table.Load(spConfig);
  1066. if (Error != Error_Succeed)
  1067. {
  1068. LOG_TRACE("[dbg] failed to load run config.");
  1069. }
  1070. }
  1071. else {
  1072. LOG_TRACE("[dbg] failed to open run config.");
  1073. }
  1074. return Error;
  1075. }
  1076. ErrorCodeEnum CheckConfigCameraName(capture_config_t *conf){
  1077. ErrorCodeEnum Error = Error_Succeed;
  1078. int EnvConfigNameError = 0; //0:环境摄像头配置名能成功打开 -1:环境摄像头配置名不能打开 1:未配置环境摄像头名字
  1079. int OptConfigNameError = 0; //0:操作摄像头配置名能成功打开 -1:操作摄像头配置名不能打开 1:未配置操作摄像头名字
  1080. //check env device
  1081. if (conf->strVideoEnv.GetLength() > 1)
  1082. { // is not "$"
  1083. conf->video_env_dev = capture_get_video_device_id(conf->strVideoEnv.GetData());
  1084. if (conf->video_env_dev == -1)
  1085. {
  1086. Dbg("find strVideoEnv:%s(-1)",(LPCTSTR)conf->strVideoEnv);
  1087. EnvConfigNameError = -1;
  1088. }
  1089. } else
  1090. {
  1091. conf->video_env_dev = -1;
  1092. EnvConfigNameError = 1;
  1093. }
  1094. //check opt device
  1095. if (conf->strVideoOpt.GetLength() > 1)
  1096. { // is not "$"
  1097. conf->video_opt_dev = capture_get_video_device_id(conf->strVideoOpt.GetData());
  1098. if (conf->video_opt_dev == -1)
  1099. {
  1100. Dbg("find strVideoOpt:%s(-1)",(LPCTSTR)conf->strVideoOpt);
  1101. OptConfigNameError = -1;
  1102. }
  1103. }
  1104. else
  1105. {
  1106. conf->video_opt_dev = -1;
  1107. OptConfigNameError = 1;
  1108. }
  1109. //环境摄像头配置名不能打开
  1110. if (EnvConfigNameError == -1){
  1111. //操作摄像头配置名不能打开,此时表明摄像头都不可用
  1112. if(OptConfigNameError == -1){
  1113. Error = Error_AllCamera;
  1114. }
  1115. //未配置操作摄像头名字or操作摄像头配置名能打开,此时表明只有操作摄像头OK
  1116. else{
  1117. Error = Error_EnvCamera;
  1118. }
  1119. }
  1120. //环境摄像头配置名能打开
  1121. else if (EnvConfigNameError == 0){
  1122. //操作摄像头配置名不能打开,此时表明只有环境摄像头OK
  1123. if (OptConfigNameError == -1){
  1124. Error = Error_OptCamera;
  1125. }
  1126. //环境摄像头配置名能打开,未配置操作摄像头名字,此时也认为摄像头都OK(无操作摄像头场景)
  1127. }
  1128. //环境摄像头未配置
  1129. else {
  1130. //操作摄像头配置名不能打开,此时表明只有操作摄像头OK
  1131. if(OptConfigNameError == -1){
  1132. Error = Error_OptCamera;
  1133. }
  1134. //操作摄像头未配置,此时表明摄像头都不可用
  1135. else if (OptConfigNameError == 1){
  1136. Error = Error_AllCamera;
  1137. }
  1138. //操作摄像头名字能打开,此时也认为摄像头都OK(无环境摄像头场景)
  1139. }
  1140. return Error;
  1141. }
  1142. ErrorCodeEnum GetSalesAudioConfig(rvc_audio_capture_config_t *conf, bool bRemoteRecord)
  1143. {
  1144. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  1145. CSmartPointer<IConfigInfo> spConfig;
  1146. SpIniMappingTable table;
  1147. ErrorCodeEnum Error = spFunction->OpenConfig(Config_Root, spConfig);
  1148. if (Error == Error_Succeed) {
  1149. CSimpleStringA strAudioInDevice;
  1150. table.AddEntryString("Audio", "sales_record_in_dev", conf->strAudioIn, "$");
  1151. table.AddEntryString("Audio", "handfree_in_dev", strAudioInDevice, "$");
  1152. table.AddEntryString("Audio", "handfree_out_dev", conf->strAudioOut, "$");
  1153. Error = table.Load(spConfig);
  1154. if (Error == Error_Succeed){
  1155. conf->audio_capture_period = CAPTURE_FRAME_TIME;
  1156. conf->audio_capture_samplerate = m_nSalesAudioSmpPsec;
  1157. if (conf->strAudioIn==""){
  1158. conf->strAudioIn = strAudioInDevice;
  1159. }
  1160. }
  1161. else {
  1162. LOG_TRACE("load sales audio device config failed!");
  1163. }
  1164. }
  1165. else {
  1166. LOG_TRACE("open sales audio device config failed!");
  1167. }
  1168. if (Error_Succeed != Error){
  1169. Dbg("get sales audio device info failed, now get from default value.");
  1170. m_sales_audio_conf.strAudioIn = this->conf.strAudioIn;
  1171. m_sales_audio_conf.audio_capture_period = CAPTURE_FRAME_TIME;
  1172. m_sales_audio_conf.audio_capture_samplerate = CAPTURE_CLOCK;
  1173. Error = Error_Succeed;
  1174. }
  1175. conf->audio_capture_samplerate = CAPTURE_CLOCK*2;
  1176. if (true == bRemoteRecord){
  1177. if (CAPTURE_CLOCK*2 == m_sales_audio_conf.audio_capture_samplerate){
  1178. m_sales_audio_conf.audio_capture_samplerate = CAPTURE_CLOCK;
  1179. Dbg("remote record, change audio sample rate to from %d to %d.", CAPTURE_CLOCK*2, m_sales_audio_conf.audio_capture_samplerate);
  1180. }
  1181. }
  1182. return Error;
  1183. }
  1184. ErrorCodeEnum AutoGetVideoDeviceName(capture_config_t* conf)
  1185. {
  1186. ErrorCodeEnum Error = Error_Unexpect;
  1187. int icount = rvc_videocap_get_device_count();
  1188. int ifound = 0;
  1189. bool benv = false;
  1190. bool bopt = false;
  1191. for (int i = 0; i < 64 && ifound < icount; ++i) {
  1192. char strfullname[2 * MAX_PATH] = { 0 };
  1193. if (0 == rvc_videocap_get_device_fullpathname(i, strfullname, 2 * MAX_PATH)) {
  1194. ifound++;
  1195. if (NULL != strstr(strfullname, AUTOMATCH_CAMERA_ENV)) {
  1196. conf->strVideoEnv = strfullname;
  1197. benv = true;
  1198. }
  1199. if (NULL != strstr(strfullname, AUTOMATCH_CAMERA_OPT)) {
  1200. conf->strVideoOpt = strfullname;
  1201. bopt = true;
  1202. }
  1203. if (benv && bopt){
  1204. Error = Error_Succeed;
  1205. break;
  1206. }
  1207. }
  1208. }
  1209. return Error;
  1210. }
  1211. ErrorCodeEnum LoadConfig(capture_config_t *conf)
  1212. {
  1213. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  1214. CSmartPointer<IConfigInfo> spConfig;
  1215. SpIniMappingTable table;
  1216. strEwsCam = "$";
  1217. ErrorCodeEnum Error = spFunction->OpenConfig(Config_Root, spConfig);
  1218. if (Error == Error_Succeed) {
  1219. table.AddEntryString("Audio", "handfree_in_dev", conf->strAudioIn, "$");
  1220. table.AddEntryString("Audio", "handfree_out_dev", conf->strAudioOut, "$");
  1221. table.AddEntryString("Video", "EnvCamera", conf->strVideoEnv, "$");
  1222. table.AddEntryString("Video", "OptCamera", conf->strVideoOpt, "$");
  1223. table.AddEntryString("Video", "EwsCamera", strEwsCam, "$");
  1224. table.AddEntryInt("Video", "EnvRotate", conf->video_env_rotate, 0);
  1225. table.AddEntryInt("Video", "OptRotate", conf->video_opt_rotate, 0);
  1226. table.AddEntryInt("Video", "EnvFps", conf->video_env_fps, 0);
  1227. table.AddEntryInt("Video", "OptFps", conf->video_opt_fps, 0);
  1228. Error = table.Load(spConfig);
  1229. if (Error == Error_Succeed)
  1230. {
  1231. //进行Camera路径名自纠正后再检查
  1232. AutoCorrectCameraConfigName(5000);
  1233. char strInfo[MAX_PATH * 2] = { 0 };
  1234. Error = AutoGetVideoDeviceName(conf);
  1235. snprintf(strInfo, MAX_PATH * 2, "env = %s,opt = %s", conf->strVideoEnv.GetData(), conf->strVideoOpt.GetData());
  1236. if (Error_Succeed == Error){
  1237. LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_MEDIACONTROLLER_VIDEO_AUTO_MATHED_SUCCESS, strInfo);
  1238. }
  1239. else {
  1240. LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_MEDIACONTROLLER_VIDEO_AUTO_MATHED_FAILED, strInfo);
  1241. }
  1242. Error = CheckConfigCameraName(conf);
  1243. if (Error == Error_EnvCamera || Error == Error_AllCamera){
  1244. char strMessage[MAX_PATH*2] = {0};
  1245. get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoEnv ,"ENV 摄像头打开失败,请检查设备或配置是否正确!");
  1246. LogWarn(Severity_Middle,Error_DevMedia,ERROR_MOD_MEDIACONTROLLER_ENVCAM_INITFAIL, strMessage);
  1247. } else if (Error == Error_OptCamera){
  1248. char strMessage[MAX_PATH*2] = {0};
  1249. get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoOpt, "OPT 摄像头打开失败,请检查设备或配置是否正确!");
  1250. LogWarn(Severity_Middle,Error_DevMedia,ERROR_MOD_MEDIACONTROLLER_OPTCAM_INITFAIL, strMessage);
  1251. }
  1252. }
  1253. else
  1254. {
  1255. LOG_TRACE("load config failed!");
  1256. }
  1257. }
  1258. else
  1259. {
  1260. LOG_TRACE("open config failed!");
  1261. }
  1262. return Error;
  1263. }
  1264. // 外接摄像头启动失败 edit by ly 2018/03/08
  1265. void OnExternalCameraSwitchFailed(const char* pszFailedMsg)
  1266. {
  1267. // 广播给业务系统
  1268. ExternalCameraSwitchFailed evt;
  1269. evt.failedmsg = CSimpleStringA2W(pszFailedMsg);
  1270. SpSendBroadcast(GetFunction(), SP_MSG_OF(ExternalCameraSwitchFailed), SP_MSG_SIG_OF(ExternalCameraSwitchFailed), evt);
  1271. Dbg("[dbg] ExternalCameraSwitchFailed broadcast sent!");
  1272. CSmartPointer<IEntityFunction> Func = GetFunction();
  1273. CSimpleStringA strValue;
  1274. Func->GetSysVar("DesktopType", strValue);
  1275. if (strValue == CSimpleStringA("U")) {
  1276. #ifdef RVC_OS_WIN
  1277. MessageBoxA(NULL, pszFailedMsg, NULL, MB_SYSTEMMODAL);
  1278. #else
  1279. #endif // RVC_OS_WIN
  1280. }
  1281. }
  1282. virtual void OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  1283. const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  1284. const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage)
  1285. {
  1286. LOG_TRACE("user_code = 0x%08x", dwUserCode);
  1287. switch (dwUserCode)
  1288. {
  1289. case MOD_EVENT_SNAPSHOT_START_CAPTURE_ENVOPT:
  1290. {
  1291. Dbg("recv MOD_EVENT_SNAPSHOT_START_CAPTURE_ENVOPT");
  1292. #ifdef RVC_OS_WIN
  1293. InterlockedCompareExchange(&m_lCaptureEnvOptCount, 3, 0);
  1294. #else
  1295. pthread_mutex_lock(&m_envopt_mutex);
  1296. LONG* plTemp = &m_lCaptureEnvOptCount;
  1297. if (0 == *plTemp) {
  1298. *plTemp = 3;
  1299. }
  1300. pthread_mutex_unlock(&m_envopt_mutex);
  1301. #endif // RVC_OS_WIN
  1302. }
  1303. break;
  1304. case MOD_EVENT_SNAPSHOT_START_CAPTURE_ENV:
  1305. {
  1306. Dbg("recv MOD_EVENT_SNAPSHOT_START_CAPTURE_ENV");
  1307. #ifdef RVC_OS_WIN
  1308. InterlockedCompareExchange(&m_lCaptureEnvOptCount, 1, 0);
  1309. #else
  1310. pthread_mutex_lock(&m_envopt_mutex);
  1311. LONG* plTemp = &m_lCaptureEnvOptCount;
  1312. if (0 == *plTemp) {
  1313. *plTemp = 1;
  1314. }
  1315. pthread_mutex_unlock(&m_envopt_mutex);
  1316. #endif // RVC_OS_WIN
  1317. }
  1318. break;
  1319. case MOD_EVENT_SNAPSHOT_START_CAPTURE_OPT:
  1320. {
  1321. Dbg("recv MOD_EVENT_SNAPSHOT_START_CAPTURE_OPT");
  1322. #ifdef RVC_OS_WIN
  1323. InterlockedCompareExchange(&m_lCaptureEnvOptCount, 1, 0);
  1324. #else
  1325. pthread_mutex_lock(&m_envopt_mutex);
  1326. LONG* plTemp = &m_lCaptureEnvOptCount;
  1327. if (0 == *plTemp) {
  1328. *plTemp = 1;
  1329. }
  1330. pthread_mutex_unlock(&m_envopt_mutex);
  1331. #endif // RVC_OS_WIN
  1332. }
  1333. break;
  1334. case LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE:
  1335. {
  1336. Dbg("recv LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE");
  1337. if (m_pMediaControllerChannel!=NULL)
  1338. {
  1339. m_pMediaControllerChannel->GetFunction()->CloseSession();
  1340. m_pMediaControllerChannel = NULL;
  1341. Dbg("Close AssistChannel Session ");
  1342. }
  1343. if (m_pMediaControllerChannel == NULL)
  1344. {
  1345. Dbg("ReConnection AssistChannel Session");
  1346. m_pMediaControllerChannel = new ChannelMediaControllerClient(this);
  1347. ErrorCodeEnum Error = m_pMediaControllerChannel->Connect();
  1348. if (Error != Error_Succeed)
  1349. {
  1350. m_pMediaControllerChannel->SafeDelete();
  1351. m_pMediaControllerChannel = NULL;
  1352. Dbg("AssistChannelClient connect fail!");
  1353. }
  1354. if (Error == Error_Succeed)
  1355. {
  1356. ChannelService_BeginRecv_Sub Sub;
  1357. Sub.type = ACM_TYPE_DEVICE;
  1358. Error = m_pMediaControllerChannel->BeginRecv(Sub);
  1359. if (Error != Error_Succeed)
  1360. {
  1361. m_pMediaControllerChannel->GetFunction()->CloseSession();
  1362. m_pMediaControllerChannel = NULL;
  1363. }
  1364. }
  1365. if (Error == Error_Succeed)
  1366. {
  1367. ChannelService_BeginState_Sub Sub;
  1368. Error = m_pMediaControllerChannel->BeginState(Sub);
  1369. if (Error != Error_Succeed)
  1370. {
  1371. LOG_TRACE("BeginState biz channel failed!");
  1372. m_pMediaControllerChannel->GetFunction()->CloseSession();
  1373. m_pMediaControllerChannel = NULL;
  1374. }
  1375. }
  1376. }
  1377. }
  1378. break;
  1379. case EVENT_MOD_CUSTOMERAWARE_BEGIN:
  1380. {
  1381. m_bCustomerwareBegin = true;
  1382. if (!m_bStartCamera&&!m_bExternControlCam)
  1383. {
  1384. StartCameraAndTiggerRecord(pszMessage);
  1385. }
  1386. }
  1387. break;
  1388. case EVENT_MOD_CUSTOMERAWARE_END:
  1389. {
  1390. m_bCustomerwareBegin = false;
  1391. if (m_bStartCamera&&!m_bExternControlCam)
  1392. {
  1393. Dbg("stop camera");
  1394. if (m_capture)
  1395. {
  1396. LogEvent(Severity_Middle, EVENT_MOD_END_RECORD,pszMessage);
  1397. GetFunction()->KillTimer(1);
  1398. capture_stop(m_capture);
  1399. capture_destroy(m_capture);
  1400. m_capture = NULL;
  1401. }
  1402. m_bStartCamera = FALSE;
  1403. }
  1404. }
  1405. break;
  1406. case EVENT_USB_CAMER_INPUT: // add by ly at 20160329
  1407. {
  1408. Dbg("[dbg] usbcam %s inserted.", pszMessage);
  1409. //huchen add for support usb inout,camera config AutoCorrect
  1410. if (m_bCustomerwareBegin){
  1411. if (!m_bStartCamera&&!m_bExternControlCam) {
  1412. CSimpleStringA strSessionId;
  1413. CSmartPointer<IEntityFunction> Func = GetFunction();
  1414. Func->GetSysVar("SessionID", strSessionId);
  1415. StartCameraAndTiggerRecord((LPCTSTR)strSessionId);
  1416. }
  1417. }
  1418. }
  1419. break;
  1420. case EVENT_USB_CAMER_OUTPUT: // add by ly at 20160329
  1421. {
  1422. Dbg("[dbg] usb cam %s removed.", pszMessage);
  1423. int nEnv = capture_get_video_device_id((LPCTSTR)conf.strVideoEnv);
  1424. if(nEnv<0)
  1425. {
  1426. // 对低柜双屏版屏蔽外接摄像头拔出事件 edit by ly@2018/10
  1427. if (eDesk2SType != m_eDeviceType)
  1428. {
  1429. // 广播给业务系统
  1430. ExternalCameraRemoved evt;
  1431. // comment by ly@2019/03/19
  1432. //evt.camname = CSimpleStringA2W(strUSBCam);
  1433. evt.camname = CSimpleStringA2W(pszMessage);
  1434. SpSendBroadcast(GetFunction(), SP_MSG_OF(ExternalCameraRemoved), SP_MSG_SIG_OF(ExternalCameraRemoved), evt);
  1435. Dbg("[dbg] ExternalCameraRemoved broadcast sent!");
  1436. }
  1437. // 停止摄像头 add by ly@2019/03/19
  1438. if (m_bStartCamera&&!m_bExternControlCam)
  1439. {
  1440. Dbg("stop camera");
  1441. if (m_capture)
  1442. {
  1443. LogEvent(Severity_Middle, EVENT_MOD_END_RECORD,pszMessage);
  1444. GetFunction()->KillTimer(1);
  1445. capture_stop(m_capture);
  1446. capture_destroy(m_capture);
  1447. m_capture = NULL;
  1448. }
  1449. m_bStartCamera = FALSE;
  1450. }
  1451. }
  1452. else
  1453. {
  1454. Dbg("[dbg] USBCam(%s) is not the one used now!",pszMessage);
  1455. }
  1456. //strUSBCam = "$";
  1457. }
  1458. break;
  1459. case EVENT_USB_CAMERA_NOT_ONLY: // add by ly at 20160707
  1460. {
  1461. Dbg("[dbg] more than one usb cam detected.");
  1462. OnExternalCameraSwitchFailed(SwitchFailed_NoUnique);
  1463. }
  1464. break;
  1465. case LOG_EVT_RECORDFAILED: // add by ly at 20160713(edit by ly@2018/06/08)
  1466. {
  1467. Dbg("[dbg] record failed event.");
  1468. GetFunction()->KillTimer(1);
  1469. //edit by ly @2018/01/17
  1470. LogEvent(Severity_Middle, EVENT_MOD_END_RECORD, NULL);
  1471. char FaildFlag = pszMessage[0];
  1472. if (FaildFlag == '0')
  1473. {
  1474. GetFunction()->SetTimer(1, this, 5000);
  1475. OnExternalCameraSwitchFailed("本地录音录像失败,已停止!");
  1476. }
  1477. else //if (FaildFlag == '1')
  1478. {
  1479. OnExternalCameraSwitchFailed("本地录音录像设备故障,尝试恢复中(预计10s内),请稍等");
  1480. m_nCameraErrorCode = Error_AllCamera;
  1481. RealSelfCheck(); // 录音录像失败,强行kill实体
  1482. }
  1483. }
  1484. break;
  1485. case LOG_EVT_UI_RECORDFAILED: // add by ly@2018/06/08
  1486. {
  1487. Dbg("[dbg] sales record failed event.");
  1488. GetFunction()->KillTimer(1);
  1489. if (m_bIsRemoteRecord){
  1490. LogEvent(Severity_Middle, LOG_EVT_UI_STOPREMOTERECORD, NULL);
  1491. }
  1492. else{
  1493. LogEvent(Severity_Middle, LOG_EVT_UI_STOPRECORD, NULL);
  1494. }
  1495. char FaildFlag = pszMessage[0];
  1496. if (FaildFlag == '0')
  1497. {
  1498. GetFunction()->SetTimer(1, this, 5000);
  1499. OnExternalCameraSwitchFailed("现场销售录音录像失败,已停止!");
  1500. }
  1501. else //if (FaildFlag == '1')
  1502. {
  1503. OnExternalCameraSwitchFailed("现场销售录音录像设备故障,尝试恢复中(预计10s内),请稍等");
  1504. m_nCameraErrorCode = Error_AllCamera;
  1505. RealSelfCheck(); // 录音录像失败,强行kill实体
  1506. }
  1507. }
  1508. break;
  1509. case LOG_EVT_BEGIN_CAMERA_CONFIG:
  1510. {
  1511. ExternStopCamera();
  1512. }
  1513. break;
  1514. case LOG_EVT_END_CAMERA_CONFIG:
  1515. {
  1516. ExternStartCamera();
  1517. }
  1518. break;
  1519. case LOG_EVT_UI_STARTREMOTERECORD:
  1520. {
  1521. m_bIsRemoteRecord = true;
  1522. HandleRemoteRecord(pszMessage);
  1523. }
  1524. break;
  1525. case LOG_EVT_UI_STOPREMOTERECORD:
  1526. {
  1527. m_bIsRemoteRecord = false;
  1528. if (Error_Succeed == StopSalesRecordAudioCapture()){
  1529. Dbg("stop remote sales record audio capture.");
  1530. }
  1531. if (true == m_bHasStartSpeakerRender){
  1532. StopSpeakerAudioRender();
  1533. }
  1534. }
  1535. break;
  1536. //case EVENT_MOD_CONNECT_STOP_RECORD_BROADCAST:
  1537. // {
  1538. // if (eStand2sType == m_eDeviceType){
  1539. // StopSpeakerAudioRender();
  1540. // }
  1541. // }
  1542. // break;
  1543. case LOG_EVT_UI_STARTRECORD:
  1544. case LOG_EVT_UI_STARTRECORDPREVIEW:
  1545. {
  1546. m_bIsRemoteRecord = false;
  1547. if (false == m_bRecordPCM){
  1548. if (Error_Succeed == StartSalesRecordAudioCapture()){
  1549. Dbg("begin remote sales record audio capture.");
  1550. }
  1551. }
  1552. else{
  1553. HandleSalesRecordPCMAudio(false, pszMessage);
  1554. }
  1555. }
  1556. break;
  1557. case LOG_EVT_UI_STOPRECORD:
  1558. {
  1559. if (Error_Succeed == StopSalesRecordAudioCapture()){
  1560. Dbg("stop sales record audio capture.");
  1561. }
  1562. }
  1563. break;
  1564. case LOG_EVT_START_CONTINURECORD:
  1565. {
  1566. Dbg("receive LOG_EVT_START_CONTINURECORD event.");
  1567. }
  1568. break;
  1569. case LOG_EVT_STOP_CONTINURECORD:
  1570. {
  1571. Dbg("receive LOG_EVT_STOP_CONTINURECORD event.");
  1572. }
  1573. break;
  1574. default:
  1575. Dbg("unknown event.");
  1576. break;
  1577. }
  1578. }
  1579. virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  1580. {
  1581. if (Test_ShakeHand == eTestType)
  1582. {
  1583. if (m_nCameraErrorCode == Error_AllCamera)
  1584. {
  1585. pTransactionContext->SendAnswer(Error_DevMedia);
  1586. }
  1587. else
  1588. {
  1589. pTransactionContext->SendAnswer(Error_Succeed);
  1590. }
  1591. }
  1592. }
  1593. //获取当前使用摄像头,30分钟轮休一次
  1594. int GetActiveCamera()
  1595. {
  1596. #ifdef RVC_OS_WIN
  1597. SYSTEMTIME st;
  1598. GetLocalTime(&st);
  1599. if (st.wMinute <= CAMERA_CHANGE_TIMER)
  1600. {
  1601. return ENVCAMERA;
  1602. }
  1603. else if (st.wMinute > CAMERA_CHANGE_TIMER)
  1604. {
  1605. return OPTCAMERA;
  1606. }
  1607. #else
  1608. return ENVCAMERA;
  1609. #endif // RVC_OS_WIN
  1610. }
  1611. ErrorCodeEnum ChangeSysvar(ErrorCodeEnum op)
  1612. {
  1613. switch (op)
  1614. {
  1615. case Error_Succeed:
  1616. Dbg("Camera State to No_Error");
  1617. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_NO_ERROR);
  1618. SetCameraSysVar(CAMERA_NO_ERROR);
  1619. GetFunction()->SetUserDefineState(USER_MEDIA_IDLE);
  1620. break;
  1621. case Error_EnvCamera:
  1622. Dbg("Camera State to Env_Error");
  1623. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_ENV_ERROR);
  1624. SetCameraSysVar(CAMERA_ENV_ERROR);
  1625. GetFunction()->SetUserDefineState(USER_MEDIA_ENVERRROR);
  1626. capture_clearsnapshotvideo(m_capture,ENVCAMERA);
  1627. break;
  1628. case Error_OptCamera:
  1629. Dbg("Camera State to Opt_Error");
  1630. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_OPT_ERROR);
  1631. SetCameraSysVar(CAMERA_OPT_ERROR);
  1632. GetFunction()->SetUserDefineState(USER_MEDIA_OPTERROR);
  1633. capture_clearsnapshotvideo(m_capture,OPTCAMERA);
  1634. break;
  1635. case Error_AllCamera:
  1636. Dbg("Camera State to Both_Error");
  1637. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_BOTH_ERROR);
  1638. SetCameraSysVar(CAMERA_BOTH_ERROR);
  1639. GetFunction()->SetUserDefineState(USER_MEDIA_ALLERROR);
  1640. capture_clearsnapshotvideo(m_capture,AlLCAMERA);
  1641. break;
  1642. default:
  1643. break;
  1644. }
  1645. return Error_Succeed;
  1646. }
  1647. void AutoCorrectCameraConfigName(long wait_time) {
  1648. ErrorCodeEnum Error = Error_Succeed;
  1649. int one_timeout = 400;
  1650. int retry = 0;
  1651. #ifdef RVC_OS_WIN
  1652. //检查配置名都成功,不用自动纠正
  1653. Error = CheckConfigCameraName(&conf);
  1654. if (Error == Error_Succeed) {
  1655. return;
  1656. }
  1657. #endif // RVC_OS_WIN
  1658. //只针对低柜双屏做自纠正
  1659. if(eDesk2SType != m_eDeviceType){
  1660. Dbg("AutoCorrectCameraConfig failed, DeviceType:%d is not Desk2SType", m_eDeviceType);
  1661. return;
  1662. }
  1663. auto pCameraConfigManageClient = new CameraConfigManageService_ClientBase(this);
  1664. while ((pCameraConfigManageClient->Connect() != Error_Succeed) && retry < wait_time/one_timeout)
  1665. {
  1666. Dbg("连接CameraConfigManage实体失败, retry:%d", retry);
  1667. Sleep(one_timeout);
  1668. retry++;
  1669. }
  1670. //连接不上,不纠正
  1671. if (retry >= wait_time/one_timeout){
  1672. pCameraConfigManageClient->SafeDelete();
  1673. pCameraConfigManageClient = NULL;
  1674. }
  1675. else {
  1676. CameraConfigManageService_AutoCorrectCameraConfig_Req req;
  1677. CameraConfigManageService_AutoCorrectCameraConfig_Ans ans;
  1678. DWORD Timeout = 5000;
  1679. Error = pCameraConfigManageClient->AutoCorrectCameraConfig(req, ans, Timeout);
  1680. if (Error != Error_Succeed)
  1681. {
  1682. Dbg("CameraConfigManage 调用 AutoCorrectCameraConfig 失败: 0x%x", Error);
  1683. }
  1684. else
  1685. {
  1686. Dbg("AutoCorrectCameraConfig, old EnvCamera;%s, OptCamera;%s, EwsCamera;%s",
  1687. (LPCSTR)conf.strVideoEnv, (LPCSTR)conf.strVideoOpt, (LPCSTR)strEwsCam);
  1688. Dbg("AutoCorrectCameraConfig, get new EnvCamera;%s, OptCamera;%s, EwsCamera;%s",
  1689. (LPCSTR)ans.EnvCamera, (LPCSTR)ans.OptCamera, (LPCSTR)ans.EwsCamera);
  1690. if ((ans.EnvCamera.GetLength() > 1) && (conf.strVideoEnv.GetLength() > 1)){
  1691. conf.strVideoEnv = ans.EnvCamera;
  1692. }
  1693. if ((ans.OptCamera.GetLength() > 1) && (conf.strVideoOpt.GetLength() > 1)){
  1694. conf.strVideoOpt = ans.OptCamera;
  1695. }
  1696. if ((ans.EwsCamera.GetLength() > 1) && (strEwsCam.GetLength() > 1)){
  1697. strEwsCam = ans.EwsCamera;
  1698. }
  1699. Dbg("AutoCorrectCameraConfig, updated EnvCamera;%s, OptCamera;%s, EwsCamera;%s",
  1700. (LPCSTR)conf.strVideoEnv, (LPCSTR)conf.strVideoOpt, (LPCSTR)strEwsCam);
  1701. }
  1702. pCameraConfigManageClient->GetFunction()->CloseSession();
  1703. pCameraConfigManageClient = NULL;
  1704. }
  1705. }
  1706. //开始销售双录音频采集函数
  1707. ErrorCodeEnum StartSalesRecordAudioCapture(bool bRemoteRecord = false, eRvcPCMTransType eType = eUnKnown, void* pData = NULL)
  1708. {
  1709. ErrorCodeEnum Error = Error_Succeed;
  1710. if (NULL == m_salesaudio_capture){
  1711. memset(&m_sales_audio_conf, 0, sizeof(m_sales_audio_conf));
  1712. GetSalesAudioConfig(&m_sales_audio_conf, bRemoteRecord);
  1713. Error = (ErrorCodeEnum)salesaudio_capture_create(&m_sales_audio_conf, &m_salesaudio_capture);
  1714. if (Error_Succeed == Error){
  1715. Error = SetSalesRecordAudioCaptureTransActionData(eType, pData);
  1716. }
  1717. }
  1718. if (Error_Succeed == Error){
  1719. Error = salesrecord_audio_capture_start(m_salesaudio_capture);
  1720. if (Error_Succeed == Error){
  1721. Dbg("sales record audio capture start success.");
  1722. }
  1723. else{
  1724. Dbg("sales record audio capture start failed for param error.");
  1725. }
  1726. }
  1727. return Error;
  1728. }
  1729. //停止销售双录音频采集函数
  1730. ErrorCodeEnum StopSalesRecordAudioCapture()
  1731. {
  1732. salesrecord_audio_capture_stop(m_salesaudio_capture);
  1733. salesaudio_capture_destroy(m_salesaudio_capture);
  1734. m_salesaudio_capture = NULL;
  1735. Dbg("set m_salesaudio_capture to null.");
  1736. return Error_Succeed;
  1737. }
  1738. ErrorCodeEnum StartCamera()
  1739. {
  1740. if (m_capture == NULL)
  1741. {
  1742. //打开前检查配置摄像头名字是否能被打开并自纠正
  1743. AutoCorrectCameraConfigName(4000);
  1744. ErrorCodeEnum Error = Error_Succeed;
  1745. conf.ref_env_capture_count = &m_lCaptureEnvCount;
  1746. conf.ref_opt_capture_count = &m_lCaptureOptCount;
  1747. conf.ref_envopt_capture_count = &m_lCaptureEnvOptCount;
  1748. #ifdef RVC_OS_WIN
  1749. #else
  1750. conf.env_mutex = &m_env_mutex;
  1751. conf.opt_mutex = &m_opt_mutex;
  1752. conf.envopt_mutex = &m_envopt_mutex;
  1753. #endif
  1754. Error = (ErrorCodeEnum)capture_create(&conf, &m_capture);
  1755. if (Error == Error_Succeed)
  1756. {
  1757. #ifdef RVC_OS_WIN
  1758. #else
  1759. m_capture->audio->paudiocap = m_pAudioCap;
  1760. #endif
  1761. Error = capture_start(m_capture);
  1762. Dbg("capture_start Error code=0x%08x",Error);
  1763. if (Error != Error_Succeed)
  1764. {
  1765. if((Error == Error_AudioIN)||(Error == Error_AudioOut))
  1766. {
  1767. return Error;
  1768. }
  1769. else if (Error == Error_AllCamera)
  1770. {
  1771. capture_destroy(m_capture);
  1772. m_capture = NULL;
  1773. return Error;
  1774. }
  1775. else
  1776. {
  1777. SetAutoBright(Error);
  1778. GetFunction()->SetTimer(1, this, 5000);
  1779. if((Error == Error_OptCamera)&&((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType)||(eDesk1SType == m_eDeviceType)||(eDesk2SIntegratedType == m_eDeviceType)))
  1780. {
  1781. return Error_Succeed;
  1782. }
  1783. else
  1784. {
  1785. return Error;
  1786. }
  1787. }
  1788. }
  1789. else
  1790. {
  1791. SetAutoBright(Error);
  1792. GetFunction()->SetTimer(1, this, 5000);
  1793. return Error_Succeed;
  1794. }
  1795. }
  1796. else
  1797. {
  1798. Dbg("create capture failed! 0x%08x", Error);
  1799. m_capture = NULL;
  1800. return Error_Unexpect;
  1801. }
  1802. return Error;
  1803. }
  1804. else
  1805. {
  1806. Dbg("m_capture == NULL");
  1807. return Error_Unexpect;
  1808. }
  1809. }
  1810. ErrorCodeEnum StartCamera(int nCamera)
  1811. {
  1812. if (m_capture == NULL)
  1813. {
  1814. //打开前检查配置摄像头名字是否能被打开并自纠正
  1815. AutoCorrectCameraConfigName(4000);
  1816. ErrorCodeEnum Error = Error_Succeed;
  1817. Error = capture_create(&conf, m_capture,nCamera);
  1818. if (Error == Error_Succeed)
  1819. {
  1820. return capture_start(m_capture,nCamera);
  1821. }
  1822. else
  1823. {
  1824. return Error_Hardware;
  1825. }
  1826. }
  1827. else
  1828. {
  1829. return Error_Unexpect;
  1830. }
  1831. }
  1832. void StartCameraAndTiggerRecord(const char * strSessionId){
  1833. Dbg("start camera");
  1834. ErrorCodeEnum Error = StartCamera();
  1835. if (Error == Error_Succeed)
  1836. {
  1837. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_NO_ERROR);
  1838. SetCameraSysVar(CAMERA_NO_ERROR);
  1839. Dbg("Camera State to CAMERA_NO_ERROR");
  1840. m_bStartCamera = TRUE;
  1841. LogEvent(Severity_Middle, EVENT_MOD_BEGIN_RECORD,strSessionId);
  1842. }
  1843. else
  1844. {
  1845. if (Error == Error_EnvCamera)
  1846. {
  1847. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_ENV_ERROR);
  1848. SetCameraSysVar(CAMERA_ENV_ERROR);
  1849. Dbg("Camera State to CAMERA_ENV_ERROR");
  1850. m_bStartCamera = TRUE;
  1851. LogEvent(Severity_Middle, EVENT_MOD_BEGIN_RECORD,strSessionId);
  1852. }
  1853. else if (Error == Error_OptCamera)
  1854. {
  1855. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_OPT_ERROR);
  1856. SetCameraSysVar(CAMERA_OPT_ERROR);
  1857. Dbg("Camera State to CAMERA_OPT_ERROR");
  1858. m_bStartCamera = TRUE;
  1859. LogEvent(Severity_Middle, EVENT_MOD_BEGIN_RECORD,strSessionId);
  1860. }
  1861. else if (Error == Error_AllCamera)
  1862. {
  1863. //GetFunction()->SetSysVar(SYSVAR_CAMERASTATE, CAMERA_BOTH_ERROR);
  1864. SetCameraSysVar(CAMERA_BOTH_ERROR);
  1865. Dbg("Camera State to CAMERA_BOTH_ERROR");
  1866. m_nCameraErrorCode = Error_AllCamera;
  1867. m_bStartCamera = FALSE;
  1868. GetFunction()->SetUserDefineState(USER_MEDIA_ALLERROR);
  1869. }
  1870. else
  1871. {
  1872. SetCameraSysVar(Error);
  1873. Dbg("Camera State to Other Error");
  1874. m_nCameraErrorCode = Error;
  1875. m_bStartCamera = FALSE;
  1876. }
  1877. }
  1878. }
  1879. ErrorCodeEnum ReStartCamera(int nCamera)
  1880. {
  1881. if (m_capture != NULL)
  1882. {
  1883. if((StopCamera(m_capture,nCamera)==-1))
  1884. {
  1885. Dbg("ReStartCamera,stop camera fail!");
  1886. }
  1887. Sleep(2000);
  1888. //打开前检查配置摄像头名字是否能被打开并自纠正
  1889. AutoCorrectCameraConfigName(4000);
  1890. ErrorCodeEnum Error = Error_Succeed;
  1891. Error = capture_create(&conf, m_capture,nCamera);
  1892. if (Error == Error_Succeed)
  1893. {
  1894. Error = capture_start(m_capture,nCamera);
  1895. if (Error != Error_Succeed)
  1896. {
  1897. Dbg("ReStartCamera,capture_start fail!");
  1898. capture_destroy(m_capture,nCamera);
  1899. return Error;
  1900. }
  1901. else
  1902. {
  1903. Dbg("ReStartCamera,camera = %d,success!",nCamera);
  1904. return Error_Succeed;
  1905. }
  1906. }
  1907. else
  1908. {
  1909. Dbg("ReStartCamera,capture_create fail!");
  1910. capture_destroy(m_capture,nCamera);
  1911. return Error;
  1912. }
  1913. }
  1914. else
  1915. {
  1916. return Error_Unexpect;
  1917. }
  1918. }
  1919. virtual CServerSessionBase *OnNewSession(const char* pszRemoteEntityName, const char * pszClass)
  1920. {
  1921. LOG_FUNCTION();
  1922. LOG_TRACE("%s connected class = %s!", pszRemoteEntityName, pszClass);
  1923. return new MediaServiceSession(this);
  1924. }
  1925. public:
  1926. ErrorCodeEnum ExternStartCamera()
  1927. {
  1928. Dbg("Extern start camera");
  1929. CSimpleStringA strSessionId;
  1930. CSmartPointer<IEntityFunction> Func = GetFunction();
  1931. Func->GetSysVar("SessionID", strSessionId);
  1932. if (!m_bStartCamera)
  1933. {
  1934. StartCameraAndTiggerRecord((LPCTSTR)strSessionId);
  1935. }
  1936. m_bExternControlCam = FALSE;
  1937. return Error_Succeed;
  1938. }
  1939. ErrorCodeEnum ExternStopCamera()
  1940. {
  1941. Dbg("Extern stop camera");
  1942. if (m_capture)
  1943. {
  1944. LogEvent(Severity_Middle, EVENT_MOD_END_RECORD,NULL);
  1945. GetFunction()->KillTimer(1);
  1946. capture_stop(m_capture);
  1947. capture_destroy(m_capture);
  1948. m_capture = NULL;
  1949. }
  1950. m_bStartCamera = FALSE;
  1951. m_bExternControlCam = TRUE;
  1952. return Error_Succeed;
  1953. }
  1954. //add by ly at 20160401
  1955. ErrorCodeEnum SaveInnerCamera()
  1956. {
  1957. if (strFrontCam.GetLength() <= 1) {
  1958. return Error_Resource;
  1959. }
  1960. if (strstr((LPCTSTR)conf.strVideoEnv,(LPCTSTR)strFrontCam)==NULL)
  1961. {
  1962. CSimpleStringA tmp = strRearCam;
  1963. strRearCam = strFrontCam;
  1964. strFrontCam = tmp;
  1965. }
  1966. Dbg("[dbg] strFrontCam: %s, strRearCam: %s", (LPCSTR)strFrontCam, (LPCSTR)strRearCam);
  1967. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  1968. CSmartPointer<IConfigInfo> spConfig;
  1969. ErrorCodeEnum Error = spFunction->OpenConfig(Config_Run, spConfig);
  1970. if (Error == Error_Succeed) {
  1971. SpIniMappingTable table;
  1972. table.AddEntryString("Video", "FrontCamera", strFrontCam, "$");
  1973. table.AddEntryString("Video", "RearCamera", strRearCam, "$");
  1974. Error = table.Save(spConfig);
  1975. if (Error != Error_Succeed)
  1976. {
  1977. LOG_TRACE("[dbg] failed to save run config.");
  1978. }
  1979. }
  1980. else {
  1981. LOG_TRACE("[dbg] failed to open run config.");
  1982. }
  1983. return Error;
  1984. }
  1985. // 获取高拍仪摄像头(考虑多个高拍仪)
  1986. ErrorCodeEnum GetHSPCameras(CAutoArray<CSimpleStringA> &HSPCameras)
  1987. {
  1988. auto rc = Error_Succeed;
  1989. auto pScannerSetClient = new ScannerService_ClientBase(this);
  1990. if (pScannerSetClient->Connect() != Error_Succeed)
  1991. {
  1992. Dbg("连接ScannerSet实体失败");
  1993. pScannerSetClient->SafeDelete();
  1994. pScannerSetClient = NULL;
  1995. rc = Error_DevConnFailed;
  1996. }
  1997. else
  1998. {
  1999. ScannerService_GetOnlineCameras_Req req = {};
  2000. ScannerService_GetOnlineCameras_Ans ans = {};
  2001. rc = pScannerSetClient->GetOnlineCameras(req, ans, 10000);
  2002. if (rc != Error_Succeed)
  2003. {
  2004. Dbg("ScannerSet 调用 GetOnlineCameras 失败: 0x%x", rc);
  2005. }
  2006. else
  2007. {
  2008. Dbg("ScannerSet invokes GetOnlineCameras suc.");
  2009. Dbg("Count: %d", ans.devCount);
  2010. if (ans.devCount > 0) {
  2011. for (int i = 0; i < ans.devFriendlyNames.GetCount(); ++i) {
  2012. Dbg("[%d]%s(%d)", i, (LPCTSTR)ans.devFriendlyNames[i],
  2013. ans.devType[i]);
  2014. CapTypeEnum devType = (CapTypeEnum)ans.devType[i];
  2015. if (devType == CAMTYPE_HSPS)
  2016. {
  2017. HSPCameras.Append(ans.devFriendlyNames, i, 1);
  2018. }
  2019. }
  2020. }
  2021. }
  2022. pScannerSetClient->GetFunction()->CloseSession();
  2023. pScannerSetClient = NULL;
  2024. }
  2025. return rc;
  2026. }
  2027. ErrorCodeEnum HandleSalesRecordPCMAudio(bool bRemoteRecord, const char *pszMessage, audio_frame* pFrame = NULL)
  2028. {
  2029. ErrorCodeEnum Error = Error_Succeed;
  2030. char strSwiftName[MAX_PATH] = {0};
  2031. if (NULL != pszMessage){
  2032. size_t ulen = strlen(pszMessage);
  2033. char *tmp = new char[ulen+1];
  2034. memset(tmp, 0, ulen + 1);
  2035. memcpy(tmp, pszMessage, ulen);
  2036. char *result[16] = {0};
  2037. auto arr1 = CSimpleStringA2W(tmp).Split('@');
  2038. auto arr2 = CAutoArray<CSimpleStringA>(arr1.GetCount());
  2039. for (int i = 0; i < arr1.GetCount(); ++i){
  2040. arr2[i] = CSimpleStringW2A(arr1[i]);
  2041. result[i] = const_cast<LPSTR>(arr2[i].GetData());
  2042. }
  2043. if (arr1.GetCount() > 4){
  2044. Dbg("remote record swift number is %s.", result[4]);
  2045. sprintf(strSwiftName, "%s", result[4]);
  2046. }
  2047. delete tmp;
  2048. tmp = NULL;
  2049. }
  2050. char strMicroName[MAX_PATH] = {0};
  2051. CSimpleStringA strTempDir;
  2052. if (Error_Succeed == GetFunction()->GetPath("Temp", strTempDir)){
  2053. sprintf_s(strMicroName, MAX_PATH, "%s\\local_micro_%s.pcm", strTempDir.GetData(), strSwiftName);
  2054. }
  2055. else{
  2056. sprintf_s(strMicroName, MAX_PATH, "local_micro_%s.pcm", strSwiftName);
  2057. }
  2058. FILE *pRecord = fopen(strMicroName, "wb+");
  2059. if (NULL != pRecord){
  2060. if (Error_Succeed == StartSalesRecordAudioCapture(bRemoteRecord, eSingleWriteLocal, pRecord)){
  2061. Dbg("begin remote sales record audio capture and record local PCM.");
  2062. }
  2063. }
  2064. else{
  2065. Dbg("fopen %s failed.",strMicroName);
  2066. }
  2067. if (true == bRemoteRecord){
  2068. char strSpeakerName[MAX_PATH] = {0};
  2069. if ("" != strTempDir){
  2070. sprintf_s(strSpeakerName, MAX_PATH, "%s\\remote_speaker_%s.pcm", strTempDir.GetData(), strSwiftName);
  2071. }
  2072. else{
  2073. sprintf_s(strSpeakerName, MAX_PATH, "remote_speaker_%s.pcm", strSwiftName);
  2074. }
  2075. StartSpeakerAudioRender(0, pFrame, strSpeakerName);
  2076. }
  2077. return Error;
  2078. }
  2079. void HandleRemoteRecord(const char *pszMessage)
  2080. {
  2081. audio_frame frame;
  2082. frame.bitspersample = 16;
  2083. frame.format = 1;
  2084. frame.framesize = 320;
  2085. frame.nchannels = 1;
  2086. frame.samplespersec = 8000;
  2087. if (true == m_bRecordPCM){
  2088. HandleSalesRecordPCMAudio(true, pszMessage, &frame);
  2089. }
  2090. else{
  2091. if (Error_Succeed == StartSalesRecordAudioCapture(true)){
  2092. Dbg("begin remote sales record audio capture.");
  2093. }
  2094. StartSpeakerAudioRender(0, &frame, NULL);
  2095. }
  2096. }
  2097. ErrorCodeEnum StartSpeakerAudioRender(int iQueue, audio_frame* pFrame, const char* strName)
  2098. {
  2099. auto rc = Error_Succeed;
  2100. Dbg("start speak audio render.");
  2101. #ifdef RVC_OS_WIN
  2102. if (NULL != m_pAudioRenderObj) {
  2103. if (0 == m_pAudioRenderObj->StartRender(0, pFrame, strName)) {
  2104. m_bHasStartSpeakerRender = true;
  2105. Dbg("start speak audio render success.");
  2106. }
  2107. }
  2108. #else
  2109. #endif // RVC_OS_WIN
  2110. return rc;
  2111. }
  2112. ErrorCodeEnum StopSpeakerAudioRender()
  2113. {
  2114. auto rc = Error_Succeed;
  2115. Dbg("stop speak audio render.");
  2116. #ifdef RVC_OS_WIN
  2117. if (NULL != m_pAudioRenderObj) {
  2118. m_pAudioRenderObj->StopRender();
  2119. m_bHasStartSpeakerRender = false;
  2120. }
  2121. #else
  2122. #endif // RVC_OS_WIN
  2123. return rc;
  2124. }
  2125. ErrorCodeEnum SetSalesRecordAudioCaptureTransActionData(eRvcPCMTransType eType, void* pData)
  2126. {
  2127. auto rc = Error_Param;
  2128. if (NULL != m_salesaudio_capture){
  2129. if (NULL != m_salesaudio_capture->rvc_audio){
  2130. m_salesaudio_capture->rvc_audio->eType = eType;
  2131. m_salesaudio_capture->rvc_audio->pdata = pData;
  2132. rc = Error_Succeed;
  2133. }
  2134. }
  2135. return rc;
  2136. }
  2137. DeviceTypeEnum m_eDeviceType;
  2138. BOOL m_bStartCamera;
  2139. BOOL m_bExternControlCam;
  2140. capture_config_t conf;
  2141. rvc_audio_capture_config_s m_sales_audio_conf; //销售双录音频配置
  2142. ErrorCodeEnum m_nCameraErrorCode; //摄像头故障码,0:无故障,1:env摄像头故障,2:opt摄像头故障,3:双摄像头故障
  2143. int m_nCurActiveCamera; //当前正在使用的摄像头
  2144. CSimpleStringA strFrontCam;
  2145. CSimpleStringA strRearCam;
  2146. CSimpleStringA strEnvCam; //Env摄像头 add by ly 20160331
  2147. CSimpleStringA strUSBCam; //外接摄像头 add by ly 20160329
  2148. CSimpleStringA strEwsCam; //外部广角摄像头路径名(全程录像用,通常不配置)
  2149. int m_nCameraCount; //当前摄像头数量 add by ly 20160531
  2150. int m_nSysCallType;//0:普通模式,1:p2p模式
  2151. capture_t *m_capture;
  2152. rvc_sales_audio_capture_t *m_salesaudio_capture;
  2153. BOOL m_bCustomerwareBegin;
  2154. bool m_bHasStartSpeakerRender; //add by clp 20200416 是否已开启扬声器音频采集
  2155. private:
  2156. LONG m_lCaptureEnvCount;
  2157. LONG m_lCaptureOptCount;
  2158. LONG m_lCaptureEnvOptCount;
  2159. CAutoArray<CUUID> m_arrListener;
  2160. ChannelMediaControllerClient *m_pMediaControllerChannel;
  2161. SelfChekerClient*m_pSelfcheckClient;
  2162. IAudioRender* m_pAudioRenderObj; //add by clp 20200319 扬声器捕捉实体
  2163. bool m_bRecordPCM; //add by clp 20200401 是否单独录制PCM音频
  2164. int m_nSalesAudioSmpPsec; //add by clp 20200402 销售双录音频采样率
  2165. bool m_bIsRemoteRecord; //add by clp 20200403 是否是远程双录
  2166. #ifdef RVC_OS_WIN
  2167. #else
  2168. pthread_mutex_t m_env_mutex;
  2169. pthread_mutex_t m_opt_mutex;
  2170. pthread_mutex_t m_envopt_mutex;
  2171. IAudioMgr* m_pAudioCap;
  2172. #endif
  2173. };
  2174. SelfChekerClient::SelfChekerClient( CMediaControllerEntity *pEntity ) : SelfCheckerService_ClientBase(pEntity)
  2175. {
  2176. }
  2177. ChannelMediaControllerClient::ChannelMediaControllerClient( CMediaControllerEntity *pEntity ) : ChannelService_ClientBase(pEntity)
  2178. {
  2179. }
  2180. void ChannelMediaControllerClient::OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer<IReleasable> pData)
  2181. {
  2182. if (Error == Error_Succeed)
  2183. {
  2184. CMediaControllerEntity *pEntity = static_cast<CMediaControllerEntity*>(m_pEntityBase);
  2185. if (Msg.state == eChannelState_Idle)
  2186. {
  2187. if (pEntity->m_bStartCamera)
  2188. {
  2189. if (pEntity->SetAutoBright(pEntity->m_nCameraErrorCode)==false)
  2190. {
  2191. Dbg("SetAutoBright Fail!");
  2192. }
  2193. }
  2194. }
  2195. else if (Msg.state == eChannelState_Connected)
  2196. {
  2197. if (pEntity->m_bStartCamera)
  2198. {
  2199. pEntity->SendCameraBright();
  2200. }
  2201. }
  2202. }
  2203. }
  2204. void ChannelMediaControllerClient::OnMessage( ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer<IReleasable> pData )
  2205. {
  2206. LOG_FUNCTION();
  2207. if (Error == Error_Succeed)
  2208. {
  2209. CMediaControllerEntity *pEntity = static_cast<CMediaControllerEntity*>(m_pEntityBase);
  2210. pEntity->OnReceivePkt(Msg.sub_type, (const char*)Msg.data.m_pData, Msg.data.m_iLength);
  2211. }
  2212. }
  2213. // edit by ly 20160401
  2214. void MediaServiceSession::Handle_GetVideoDeviceName(SpReqAnsContext<MediaService_GetVideoDeviceName_Req, MediaService_GetVideoDeviceName_Ans>::Pointer ctx)
  2215. {
  2216. CSimpleStringA frontcam = m_pEntity->strFrontCam;
  2217. CSimpleStringA rearcam = m_pEntity->strRearCam;
  2218. if (frontcam.GetLength() > 1 && rearcam.GetLength() > 1)
  2219. {
  2220. ctx->Ans.frontcam = frontcam;
  2221. if (strstr((LPCTSTR)frontcam,";"))
  2222. {
  2223. ctx->Ans.frontcam = frontcam.SubString(0, frontcam.IndexOf(";"));
  2224. }
  2225. ctx->Ans.rearcam = rearcam;
  2226. if (strstr((LPCTSTR)rearcam,";"))
  2227. {
  2228. ctx->Ans.rearcam = rearcam.SubString(0, rearcam.IndexOf(";"));
  2229. }
  2230. Dbg("get camera1 name:%s",m_pEntity->strFrontCam);
  2231. Dbg("get camera2 name:%s",m_pEntity->strRearCam);
  2232. }
  2233. ctx->Answer(Error_Succeed);
  2234. }
  2235. void MediaServiceSession::Handle_StartCamera(SpOnewayCallContext<MediaService_StartCamera_Info>::Pointer ctx)
  2236. {
  2237. m_pEntity->ExternStartCamera();
  2238. }
  2239. void MediaServiceSession::Handle_StopCamera(SpOnewayCallContext<MediaService_StopCamera_Info>::Pointer ctx)
  2240. {
  2241. m_pEntity->ExternStopCamera();
  2242. }
  2243. void MediaServiceSession::Handle_StartEnvCamera(SpReqAnsContext<MediaService_StartEnvCamera_Req, MediaService_StartEnvCamera_Ans>::Pointer ctx)
  2244. {
  2245. LOG_FUNCTION();
  2246. ErrorCodeEnum Error = m_pEntity->StartEnvCamera();
  2247. ctx->Ans.returncod = Error;
  2248. ctx->Answer(Error);
  2249. }
  2250. void MediaServiceSession::Handle_StopEnvCamera(SpOnewayCallContext<MediaService_StopEnvCamera_Info>::Pointer ctx)
  2251. {
  2252. LOG_FUNCTION();
  2253. m_pEntity->StopEnvCamera();
  2254. }
  2255. void MediaServiceSession::Handle_StartSpeakerRender(SpOnewayCallContext<MediaService_StartSpeakerRender_Info>::Pointer ctx)
  2256. {
  2257. LOG_FUNCTION();
  2258. }
  2259. void MediaServiceSession::Handle_StopSpeakerRender(SpOnewayCallContext<MediaService_StopSpeakerRender_Info>::Pointer ctx)
  2260. {
  2261. LOG_FUNCTION();
  2262. if (true == m_pEntity->m_bHasStartSpeakerRender){
  2263. m_pEntity->StopSpeakerAudioRender();
  2264. }
  2265. else{
  2266. Dbg("speaker audio render already stopped.");
  2267. }
  2268. }
  2269. SP_BEGIN_ENTITY_MAP()
  2270. SP_ENTITY(CMediaControllerEntity)
  2271. SP_END_ENTITY_MAP()