mod_salesaudiotrans.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. #include "mod_salesaudiotrans.h"
  2. #define LOG_EVT_UI_STARTRECORD 0x30B00001 //开始录像
  3. #define LOG_EVT_UI_STOPRECORD 0x30B00002 //停止录像
  4. #define LOG_EVT_SALESRECORD_FINISHED 0x31500003 //销售双录结束
  5. #define LOG_EVT_UI_RECORDFAILED 0x31500001 //双录失败
  6. #define LOG_EVT_SALESRECORD_ENTITY_EXCEPTION 0x31500002 //销售双录实体异常
  7. using namespace SalesAudioTrans;
  8. void SalesAudioTransServiceSession::Handle_StartAudioTrans(SpReqAnsContext<SalesAudioTransService_StartAudioTrans_Req, SalesAudioTransService_StartAudioTrans_Ans>::Pointer ctx)
  9. {
  10. LOG_FUNCTION();
  11. ErrorCodeEnum rc = Error_Succeed;
  12. rc = m_pEntity->StartAudioTrans(ctx->Req.VideoName, ctx->Req.Context, ctx->Req.ContextLen);
  13. ctx->Answer(rc);
  14. }
  15. ErrorCodeEnum CSalesAudioTransEntity::Load_RestFul_Functions()
  16. {
  17. ErrorCodeEnum err = Error_NotImpl;
  18. CSimpleStringA szDllName = "libaudiotransmission.dll";
  19. if (NULL == m_fcreateobj) {
  20. m_hInst = LoadLibraryA(szDllName);
  21. if (m_hInst) {
  22. m_fcreateobj = (cpprestful_create)GetProcAddress(m_hInst, "CreateIAudioTransObj");
  23. if (NULL == m_fcreateobj) {
  24. return err;
  25. }
  26. m_fdestoryobj = (cpprestful_destory)GetProcAddress(m_hInst, "DestoryIAudioTransObj");
  27. if (NULL == m_fdestoryobj) {
  28. return err;
  29. }
  30. err = Error_Succeed;
  31. }
  32. else{
  33. DWORD tmpError = GetLastError();
  34. Dbg("LoadLibraryA [%s] failed with error %u.", szDllName.GetData(), tmpError);
  35. }
  36. }
  37. return err;
  38. }
  39. void CSalesAudioTransEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  40. {
  41. ErrorCodeEnum Error = __OnStart(Error_Succeed);
  42. pTransactionContext->SendAnswer(Error) ;
  43. }
  44. ErrorCodeEnum CSalesAudioTransEntity::__OnStart( ErrorCodeEnum preOperationError )
  45. {
  46. LOG_FUNCTION();
  47. ErrorCodeEnum Error = Error_Succeed;
  48. //MessageBoxA(0,0,0,0);
  49. if (Error_Succeed != Load_RestFul_Functions()){
  50. Dbg("load restful functions failed!");
  51. return Error;
  52. }
  53. else{
  54. Dbg("load restful functions success!");
  55. }
  56. Error = LoadConfig();
  57. int i = 0;
  58. m_arrListener.Init(5);
  59. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_High, Error_IgnoreAll, LOG_EVT_SALESRECORD_FINISHED, NULL, false);
  60. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_UI_STARTRECORD, NULL, false);
  61. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_UI_STOPRECORD, NULL, false);
  62. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_UI_RECORDFAILED, NULL, false);
  63. GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_High, Error_IgnoreAll, LOG_EVT_SALESRECORD_ENTITY_EXCEPTION, NULL, false);
  64. return Error;
  65. }
  66. ErrorCodeEnum CSalesAudioTransEntity::LoadConfig()
  67. {
  68. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  69. CSmartPointer<IConfigInfo> spConfig;
  70. ErrorCodeEnum Error = spFunction->OpenConfig(Config_CenterSetting, spConfig);
  71. if (Error == Error_Succeed) {
  72. CSimpleStringA str_main_server;
  73. Error = spConfig->ReadConfigValue("SalesAudioTrans", "ASRServer", str_main_server);
  74. if (Error_Succeed == Error){
  75. if (str_main_server.GetLength() > MIN_URL_LEN){
  76. m_main_server = str_main_server;
  77. }
  78. }
  79. Dbg("audio recognize main server[%s]", m_main_server.GetData());
  80. if (Error_Succeed != Error){
  81. CSimpleStringA str_backup_server;
  82. Error = spConfig->ReadConfigValue("SalesAudioTrans", "ASRServer_Backup", str_backup_server);
  83. if (Error_Succeed == Error){
  84. if (str_backup_server.GetLength() > MIN_URL_LEN){
  85. m_backup_server = str_backup_server;
  86. }
  87. }
  88. }
  89. Dbg("audio recognize backup server[%s]", m_backup_server.GetData());
  90. int iTimeOut = DEFAULT_CONNECT_TIMEOUT;
  91. int iSize = DEFAULT_MAX_AUDIO_SEND_SIZE;
  92. Error = spConfig->ReadConfigValueInt("SalesAudioTrans", "ConnectTimeOut", iTimeOut);
  93. if (iTimeOut > 0 && iTimeOut < 5*DEFAULT_CONNECT_TIMEOUT){
  94. m_iconntimeout = iTimeOut;
  95. }
  96. Error = spConfig->ReadConfigValueInt("SalesAudioTrans", "MaxAudioSize", iSize);
  97. m_imaxaudiosendsize = SetMaxAudioSendSize(iSize);
  98. Dbg("connect timeout is %d, max audio transmission size is %d.",m_iconntimeout, m_imaxaudiosendsize);
  99. }
  100. return Error;
  101. }
  102. void CSalesAudioTransEntity::OnStarted()
  103. {
  104. asr_server_info_t tServerInfo;
  105. tServerInfo.fCreateObj = m_fcreateobj;
  106. tServerInfo.fDestoryObj = m_fdestoryobj;
  107. tServerInfo.iMaxAudioSize = m_imaxaudiosendsize;
  108. tServerInfo.iTimeOut = m_iconntimeout;
  109. sprintf_s(tServerInfo.strMainServerURL, MAX_PATH, "%s", m_main_server.GetData());
  110. sprintf_s(tServerInfo.strBackupServerURL, MAX_PATH, "%s", m_backup_server.GetData());
  111. m_pAudioTrans = new Caudiotransmission(&tServerInfo);
  112. if (NULL != m_pAudioTrans){
  113. Dbg("create Caudiotransmission object success, and m_pAudioTrans address is %0x.", m_pAudioTrans);
  114. }
  115. }
  116. ErrorCodeEnum CSalesAudioTransEntity::StartAudioTrans(CSimpleStringW strVideoName, CBlob cBuffer, size_t uLen)
  117. {
  118. LOG_FUNCTION();
  119. ErrorCodeEnum Error = Error_Succeed;
  120. if (NULL != m_pAudioTrans){
  121. char* result[16] = {0};
  122. auto arr1 = strVideoName.Split('@');
  123. auto arr2 = CAutoArray<CSimpleStringA>(arr1.GetCount());
  124. for (int i = 0; i < arr1.GetCount() && i <= 4; ++i)
  125. {
  126. arr2[i] = CSimpleStringW2A(arr1[i]);
  127. result[i] = const_cast<LPSTR>(arr2[i].GetData());
  128. }
  129. char strName[MAX_PATH] = {0};
  130. sprintf_s(strName, MAX_PATH, "%s", result[4]);//录像名:录像类型标志_录像流水号(如S_C13213EF)
  131. Dbg("record number is %s.", strName);
  132. if (0 == m_pAudioTrans->StartAudioTransmission(strName, cBuffer.m_pData, uLen)){
  133. m_bStartTrans = true;
  134. }
  135. }
  136. else{
  137. Error = Error_NotImpl;
  138. }
  139. return Error;
  140. }
  141. ErrorCodeEnum CSalesAudioTransEntity::StopAudioTrans()
  142. {
  143. LOG_FUNCTION();
  144. ErrorCodeEnum Error = Error_NotImpl;
  145. if (m_bStartTrans){
  146. if (NULL != m_pAudioTrans){
  147. if (0 == m_pAudioTrans->StopAudioTransmission()){
  148. Error = Error_Succeed;
  149. m_bStartTrans = false;
  150. Dbg("stop audio transmission success!");
  151. }
  152. else{
  153. Dbg("stop audio transmission failed!");
  154. }
  155. }
  156. else{
  157. Dbg("audio trans object is invalid!");
  158. }
  159. }
  160. else{
  161. Dbg("audio transmission has stopped.");
  162. }
  163. return Error;
  164. }
  165. int CSalesAudioTransEntity::SetMaxAudioSendSize(int iSize)
  166. {
  167. int iRet = DEFAULT_MAX_AUDIO_SEND_SIZE;
  168. if (iSize >= SINGLE_AUDIO_FRAME_SIZE && iSize < DEFAULT_MAX_AUDIO_SEND_SIZE)
  169. {
  170. iRet = (iSize/SINGLE_AUDIO_FRAME_SIZE)*SINGLE_AUDIO_FRAME_SIZE;
  171. }
  172. return iRet;
  173. }
  174. void CSalesAudioTransEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage)
  175. {
  176. LOG_TRACE("user_code = %08x", dwUserCode);
  177. switch (dwUserCode)
  178. {
  179. //case LOG_EVT_UI_STOPRECORD:
  180. case LOG_EVT_SALESRECORD_FINISHED:
  181. case LOG_EVT_SALESRECORD_ENTITY_EXCEPTION:
  182. case LOG_EVT_UI_RECORDFAILED:
  183. StopAudioTrans();
  184. break;
  185. default:
  186. break;
  187. }
  188. }
  189. void CSalesAudioTransEntity::OnTimeout(DWORD dwTimerID)
  190. {
  191. }
  192. void CSalesAudioTransEntity::OnSysVarEvent(const char *pszKey,const char *pszValue,const char *pszOldValue,const char *pszEntityName)
  193. {
  194. }
  195. void CSalesAudioTransEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  196. {
  197. ErrorCodeEnum Error = __OnClose(Error_Succeed);
  198. pTransactionContext->SendAnswer(Error);
  199. }
  200. ErrorCodeEnum CSalesAudioTransEntity::__OnClose(ErrorCodeEnum preOperationError)
  201. {
  202. LOG_FUNCTION();
  203. if (NULL != m_pAudioTrans){
  204. delete m_pAudioTrans;
  205. m_pAudioTrans = NULL;
  206. }
  207. SAFE_FREE_LIBRARY(m_hInst);
  208. m_hInst = NULL;
  209. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  210. for (int i = 0; i < m_arrListener.GetCount(); ++i)
  211. {
  212. spFunction->UnsubscribeLog(m_arrListener[i]);
  213. }
  214. return Error_Succeed;
  215. }
  216. void CSalesAudioTransEntity::OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  217. {
  218. pTransactionContext->SendAnswer(Error_Succeed);
  219. }
  220. CServerSessionBase* CSalesAudioTransEntity::OnNewSession(const char *pszRemoteEntityName, const char * pszParam)
  221. {
  222. LOG_FUNCTION();
  223. Dbg("%s connected class = %s!", pszRemoteEntityName, pszParam);
  224. return new SalesAudioTransServiceSession(this);
  225. }
  226. SP_BEGIN_ENTITY_MAP()
  227. SP_ENTITY(CSalesAudioTransEntity)
  228. SP_END_ENTITY_MAP()