Browse Source

Z991239-5169 #comment 增加释放摄像头并停止交易录像接口

80274480 1 year ago
parent
commit
481eb5abb9

+ 49 - 0
Module/mod_mediacontroller/MediaController_client_g.h

@@ -423,6 +423,55 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum ManipulateCameras(MediaService_ManipulateCameras_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(MediaService_Method_ManipulateCameras, MediaService_MethodSignature_ManipulateCameras, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum ManipulateCameras(MediaService_ManipulateCameras_Req &Req, MediaService_ManipulateCameras_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = ManipulateCameras(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum ManipulateCameras(MediaService_ManipulateCameras_Req &Req, MediaService_ManipulateCameras_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = ManipulateCameras(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum ManipulateCameras(MediaService_ManipulateCameras_Req &Req, MediaService_ManipulateCameras_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = ManipulateCameras(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
 
 	bool SafeDelete()
 	{

+ 28 - 0
Module/mod_mediacontroller/MediaController_def_g.h

@@ -23,6 +23,7 @@ namespace MediaController {
 #define MediaService_Method_GetAudioDevices 8
 #define MediaService_Method_GetVideoDevices 9
 #define MediaService_Method_GetCameraInfos 10
+#define MediaService_Method_ManipulateCameras 11
 
 #define MediaService_MethodSignature_GetVideoDeviceName -496217232
 #define MediaService_MethodSignature_StartCamera 749460891
@@ -35,6 +36,7 @@ namespace MediaController {
 #define MediaService_MethodSignature_GetAudioDevices -819377328
 #define MediaService_MethodSignature_GetVideoDevices 616397805
 #define MediaService_MethodSignature_GetCameraInfos -2116637958
+#define MediaService_MethodSignature_ManipulateCameras 755873072
 
 #define MediaService_LogCode_GetVideoDeviceName "QLR040220800"
 #define MediaService_LogCode_StartCamera "QLR040220801"
@@ -226,6 +228,32 @@ struct MediaService_GetCameraInfos_Ans
 
 };
 
+struct MediaService_ManipulateCameras_Req
+{
+	int cmdType;
+	int reserved1;
+	CSimpleStringA reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & cmdType & reserved1 & reserved2;
+	}
+
+};
+
+struct MediaService_ManipulateCameras_Ans
+{
+	int retCode;
+	int reserved1;
+	CSimpleStringA reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & retCode & reserved1 & reserved2;
+	}
+
+};
+
 
 ///////////////////////////
 

+ 27 - 0
Module/mod_mediacontroller/MediaController_server_g.h

@@ -107,6 +107,13 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case MediaService_Method_ManipulateCameras:
+			if (dwSignature == MediaService_MethodSignature_ManipulateCameras) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -173,6 +180,11 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case MediaService_Method_ManipulateCameras:
+			if (dwSignature != MediaService_MethodSignature_ManipulateCameras) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -235,6 +247,11 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_ManipulateCameras(SpReqAnsContext<MediaService_ManipulateCameras_Req, MediaService_ManipulateCameras_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -361,6 +378,16 @@ public:
 						Handle_GetCameraInfos(ctx);
 					}
 					break;
+				case MediaService_Method_ManipulateCameras:
+					{
+						SpReqAnsContext<MediaService_ManipulateCameras_Req,MediaService_ManipulateCameras_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<MediaService_ManipulateCameras_Req,MediaService_ManipulateCameras_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_ManipulateCameras(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 54 - 39
Module/mod_mediacontroller/MediaService.xml

@@ -23,46 +23,61 @@
 		<oneway name="StopSpeakerRender" overlap="true">
 		</oneway>
 		<twoway name="ManipulateMediaDevice" overlap="true">
-            		<req>
-                		<!--操作意图指令: 0:获取并接管设备权限;1:归还设备权限,不再占用-->
-                		<param name="cmdType" type="int"/>
-                		<!--设备类型:0:无效参数;1:ENV环境摄像头;2:OPT操作摄像头;3:EWS外部广角摄像头;4:高拍仪文档摄像头;5:高拍仪上接摄像头-->
-                		<param name="devType" type="int"/>
-                		<param name="reserved1" type="int"/>
-                		<param name="reserved2" type="string"/>
-            		</req>
-                	<!--实体收到接口请求时无论操作成功与否返回Answer(Error_Succeed),具体操作成功与否通过retCode标识-->
-            		<res>
-                		<!--retCode:0:表示成功,非0:表示失败 -->
-                		<param name="retCode" type="int"/>
-                		<param name="reserved1" type="int"/>
-                		<param name="reserved2" type="string"/>
-            		</res>
-        	</twoway>
+            <req>
+            	<!--操作意图指令: 0:获取并接管设备权限;1:归还设备权限,不再占用-->
+            	<param name="cmdType" type="int"/>
+            	<!--设备类型:0:无效参数;1:ENV环境摄像头;2:OPT操作摄像头;3:EWS外部广角摄像头;4:高拍仪文档摄像头;5:高拍仪上接摄像头-->
+            	<param name="devType" type="int"/>
+            	<param name="reserved1" type="int"/>
+            	<param name="reserved2" type="string"/>
+            </req>
+            <!--实体收到接口请求时无论操作成功与否返回Answer(Error_Succeed),具体操作成功与否通过retCode标识-->
+            <res>
+            	<!--retCode:0:表示成功,非0:表示失败 -->
+            	<param name="retCode" type="int"/>
+            	<param name="reserved1" type="int"/>
+            	<param name="reserved2" type="string"/>
+            </res>
+        </twoway>
 		<twoway name="GetAudioDevices" overlap="true">
-            		<req>
-                		<param name="audioType" type="int"/>
-            		</req>
-            		<res>
-                		<param name="retCode" type="int"/>
-				<param name="deviceCount" type="int"/>
-                		<param name="strNames" type="string"/>
-            		</res>
-        	</twoway>
-		<twoway name="GetVideoDevices" overlap="true">
-            		<res>
-                		<param name="retCode" type="int"/>
-				<param name="deviceCount" type="int"/>
-                		<param name="strNames" type="string"/>
-            		</res>
-       		 </twoway>
-		<twoway name="GetCameraInfos" overlap="true">
-            		<res>
-                		<param name="retCode" type="int"/>
-                		<param name="strEnvCamera" type="string"/>
-				<param name="strOptCamera" type="string"/>
-            		</res>
-        	</twoway>
+            <req>
+            	<param name="audioType" type="int"/>
+            </req>
+            <res>
+            	<param name="retCode" type="int"/>
+		<param name="deviceCount" type="int"/>
+                <param name="strNames" type="string"/>
+            </res>
+        </twoway>
+	<twoway name="GetVideoDevices" overlap="true">
+            <res>
+               	<param name="retCode" type="int"/>
+		<param name="deviceCount" type="int"/>
+               	<param name="strNames" type="string"/>
+           </res>
+       	</twoway>
+	<twoway name="GetCameraInfos" overlap="true">
+            <res>
+           	<param name="retCode" type="int"/>
+           	<param name="strEnvCamera" type="string"/>
+		<param name="strOptCamera" type="string"/>
+            </res>
+        </twoway>
+	<twoway name="ManipulateCameras" overlap="true">
+            <req>
+            	<!--操作意图指令: 0:获取并接管设备权限;1:归还设备权限,不再占用-->
+            	<param name="cmdType" type="int"/>
+            	<param name="reserved1" type="int"/>
+            	<param name="reserved2" type="string"/>
+            </req>
+            <!--实体收到接口请求时无论操作成功与否返回Answer(Error_Succeed),具体操作成功与否通过retCode标识-->
+            <res>
+            	<!--retCode:0:表示成功,非0:表示失败 -->
+            	<param name="retCode" type="int"/>
+            	<param name="reserved1" type="int"/>
+            	<param name="reserved2" type="string"/>
+            </res>
+        </twoway>
 	</class>
 	<!-- 内置摄像头切换外接摄像头失败消息 -->
 	<message name="ExternalCameraSwitchFailed">

+ 5 - 2
Module/mod_mediacontroller/mod_mediacontroller.h

@@ -62,6 +62,7 @@ public:
 	virtual void Handle_GetAudioDevices(SpReqAnsContext<MediaService_GetAudioDevices_Req, MediaService_GetAudioDevices_Ans>::Pointer ctx);
 	virtual void Handle_GetVideoDevices(SpReqAnsContext<MediaService_GetVideoDevices_Req, MediaService_GetVideoDevices_Ans>::Pointer ctx);
 	virtual void Handle_GetCameraInfos(SpReqAnsContext<MediaService_GetCameraInfos_Req, MediaService_GetCameraInfos_Ans>::Pointer ctx);
+	virtual void Handle_ManipulateCameras(SpReqAnsContext<MediaService_ManipulateCameras_Req, MediaService_ManipulateCameras_Ans>::Pointer ctx);
 
 private:
 	CMediaControllerEntity *m_pEntity;
@@ -90,8 +91,8 @@ public:
 	void OnReceivePkt(int sub_type, const char *buffer, int size);
 	ErrorCodeEnum RealSelfCheck();
 	void SendCameraBright();
-	ErrorCodeEnum StartEnvCamera();
-	ErrorCodeEnum StopEnvCamera();
+	ErrorCodeEnum StartCameras();
+	ErrorCodeEnum StopCameras();
 
 	ErrorCodeEnum ExternStartCamera();
 	ErrorCodeEnum ExternStopCamera();
@@ -100,6 +101,8 @@ public:
 	ErrorCodeEnum StartSpeakerAudioRender(int iQueue, audio_frame* pFrame, const char* strName);
 	ErrorCodeEnum StopSpeakerAudioRender();
 	ErrorCodeEnum SetSalesRecordAudioCaptureTransActionData(eRvcPCMTransType eType, void* pData);
+	ErrorCodeEnum StopCamerasAndRecord();
+	ErrorCodeEnum StartCamerasAndRecord();
 	DeviceTypeEnum RvcDeviceType();
 	ErrorCodeEnum GetMediaConfig();
 

+ 60 - 26
Module/mod_mediacontroller/unix/mod_mediacontroller.cpp

@@ -205,13 +205,15 @@ void CMediaControllerEntity::OnStarted()
 			{
 				if (Error == Error_EnvCamera)
 				{
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Load  EnvCamera Config failed!");
 					SetCameraSysVar(CAMERA_ENV_ERROR);
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_ENV_ERROR");
+					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_ENV_ERROR");
 					m_nCameraErrorCode = Error_EnvCamera;
 					GetFunction()->SetUserDefineState(USER_MEDIA_ENVERRROR);
 				}
 				else if (Error == Error_OptCamera)
 				{
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Load  OptCamera Config failed!");
 					SetCameraSysVar(CAMERA_OPT_ERROR);
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_OPT_ERROR");
 					m_nCameraErrorCode = Error_OptCamera;
@@ -224,7 +226,7 @@ void CMediaControllerEntity::OnStarted()
 				{
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Load all camera Config failed!");
 					SetCameraSysVar(CAMERA_BOTH_ERROR);
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_BOTH_ERROR");
+					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_BOTH_ERROR");
 					m_nCameraErrorCode = Error_AllCamera;
 					GetFunction()->SetUserDefineState(USER_MEDIA_ALLERROR);
 				}
@@ -232,8 +234,7 @@ void CMediaControllerEntity::OnStarted()
 			}
 		}
 	}
-	else
-	{
+	else{
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("capture_lib_init failed!");
 	}
 
@@ -356,9 +357,6 @@ DeviceTypeEnum CMediaControllerEntity::RvcGetDeviceType()
 	else if (_stricmp(stStaticinfo.strMachineType, "RPM.Stand1S") == 0) {
 		eType = eRpm1sType;
 	}
-	else if (_stricmp(stStaticinfo.strMachineType, "RVC.Desk1S") == 0) {
-		eType = eDesk1SType;
-	}
 	else if (stricmp(stStaticinfo.strMachineType, "RVC.CardStore") == 0 || stricmp(stStaticinfo.strMachineType, "RVC.CardPrinter") == 0) {
 		eType = eCardStore;
 	}
@@ -566,12 +564,10 @@ void CMediaControllerEntity::OnTimeout(DWORD dwTimerID)
 {
 	if (dwTimerID == 1) {
 		if (!m_capture) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_capture =Null");
 			return;
 		}
 
 		if (!m_bStartCamera) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_bStartCamera =false");
 			return;
 		}
 
@@ -625,7 +621,6 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 
 	capture_detect_camera_bug(m_capture, &env_n, &opt_n, bIsPadType);
 
-
 	capture_get_last_frametime(m_capture, &nLastEnvTime, &nLastOptTime, bIsPadType);
 
 	if (env_n == 0) {
@@ -639,7 +634,7 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 	}
 	else {
 		if (m_iEnvEmptyTimes == CAMERA_BUG_THRESHOLD){
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("env camera get right!");
+
 		}
 		m_iEnvEmptyTimes = 0;
 	}
@@ -670,7 +665,8 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 		}
 		
 		LogWarn(Severity_Middle, Error_Hardware, ERROR_MOD_MEDIACONTROLLER_ENVCAMERA_BUG, strInfo);
-		if ((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType)||(eDesk1SType == m_eDeviceType)||(eDesk2SIntegratedType == m_eDeviceType))
+
+		if (eMobilePadType == m_eDeviceType)
 		{
 			m_nCameraErrorCode = Error_AllCamera;
 			ChangeSysvar(Error_EnvCamera);
@@ -697,7 +693,7 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 	}
 	else if((m_iEnvEmptyTimes != CAMERA_BUG_THRESHOLD)&&!bEnvTimeout&&((m_nCameraErrorCode == Error_EnvCamera)||(m_nCameraErrorCode == Error_AllCamera)))
 	{
-		if ((ePadtype == m_eDeviceType)||(eMobilePadType == m_eDeviceType)||(eDesk2SType == m_eDeviceType)||(eDesk1SType == m_eDeviceType)||(eDesk2SIntegratedType == m_eDeviceType))
+		if (eMobilePadType == m_eDeviceType)
 		{
 			m_nCameraErrorCode = Error_Succeed;
 			ChangeSysvar(m_nCameraErrorCode);
@@ -735,7 +731,7 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 		{
 			if (m_iOptEmptyTimes == CAMERA_BUG_THRESHOLD)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("opt camera get right!");
+				//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("opt camera get right!");
 			}
 			m_iOptEmptyTimes = 0;
 		}
@@ -751,10 +747,9 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 		else if (((y2k_time_now()-nLastOptTime) < m_iCamTimeout)&&bOptTimeout)
 		{
 			bOptTimeout = false;
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("change opt camera from bOptTimeout to OK");
+			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("change opt camera from bOptTimeout to OK");
 		}
 	}
-
 	//opt是否100S没有图像或者图像20秒没有更新
 	if(((m_iOptEmptyTimes == CAMERA_BUG_THRESHOLD)||bOptTimeout)&&(m_nCameraErrorCode!=Error_OptCamera)&&(m_nCameraErrorCode!=Error_AllCamera)&&(eStand2sType == m_eDeviceType))
 	{
@@ -972,7 +967,7 @@ void CMediaControllerEntity::SendCameraBright()
 }
 
 
-ErrorCodeEnum CMediaControllerEntity::StartEnvCamera()
+ErrorCodeEnum CMediaControllerEntity::StartCameras()
 {
 	ErrorCodeEnum Error = Error_Succeed;
 	if (FALSE == m_bStartCamera){
@@ -991,7 +986,7 @@ ErrorCodeEnum CMediaControllerEntity::StartEnvCamera()
 }
 
 
-ErrorCodeEnum CMediaControllerEntity::StopEnvCamera()
+ErrorCodeEnum CMediaControllerEntity::StopCameras()
 {
 	if (m_capture){
 		GetFunction()->KillTimer(1);
@@ -1005,6 +1000,25 @@ ErrorCodeEnum CMediaControllerEntity::StopEnvCamera()
 }
 
 
+ErrorCodeEnum CMediaControllerEntity::StopCamerasAndRecord()
+{
+	LogEvent(Severity_Middle, EVENT_MOD_PAUSE_RECORD, "pause record.");
+
+	ErrorCodeEnum CamRet = StopCameras(); 
+
+	return CamRet;
+}
+
+ErrorCodeEnum CMediaControllerEntity::StartCamerasAndRecord()
+{
+	ErrorCodeEnum CamRet = StartCameras();
+	
+	LogEvent(Severity_Middle, EVENT_MOD_CONTINUE_RECORD, "continue record.");
+
+	return CamRet;
+}
+
+
 ErrorCodeEnum CMediaControllerEntity::LoadRunConfig(CSimpleStringA& frontcam, CSimpleStringA& rearcam)
 {
 	CSmartPointer<IEntityFunction> spFunction = GetFunction();
@@ -1329,7 +1343,7 @@ void CMediaControllerEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID
 			if (m_pMediaControllerChannel != NULL){
 				m_pMediaControllerChannel->GetFunction()->CloseSession();
 				m_pMediaControllerChannel = NULL;
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Close AssistChannel Session ");
+				//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Close AssistChannel Session ");
 				m_bConnectedAssist = FALSE;
 			}
 
@@ -1892,6 +1906,7 @@ ErrorCodeEnum CMediaControllerEntity::StopSpeakerAudioRender()
 	return rc;
 }
 
+
 ErrorCodeEnum CMediaControllerEntity::SetSalesRecordAudioCaptureTransActionData(eRvcPCMTransType eType, void* pData)
 {
 	auto rc = Error_Param;
@@ -1922,7 +1937,7 @@ ErrorCodeEnum CMediaControllerEntity::ConnectAssistChannel()
 	if (Error_Succeed == Error)
 	{
 		ChannelService_BeginState_Sub Sub;
-		Error = m_pMediaControllerChannel->BeginState(Sub);
+		Error = (*m_pMediaControllerChannel)(EntityResource::getLink().upgradeLink())->BeginState(Sub);
 		if (Error != Error_Succeed) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("BeginState biz channel failed!");
 			m_pMediaControllerChannel->GetFunction()->CloseSession();
@@ -1935,7 +1950,7 @@ ErrorCodeEnum CMediaControllerEntity::ConnectAssistChannel()
 	{
 		ChannelService_BeginRecv_Sub Sub;
 		Sub.type = ACM_TYPE_DEVICE;
-		Error = m_pMediaControllerChannel->BeginRecv(Sub);
+		Error = (*m_pMediaControllerChannel)(EntityResource::getLink().upgradeLink())->BeginRecv(Sub);
 		if (Error != Error_Succeed) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Begin BeginRecv ACM_TYPE_DEVICE failed!");
 			m_pMediaControllerChannel->GetFunction()->CloseSession();
@@ -2109,16 +2124,13 @@ void MediaServiceSession::Handle_StopCamera(SpOnewayCallContext<MediaService_Sto
 void MediaServiceSession::Handle_StartEnvCamera(SpReqAnsContext<MediaService_StartEnvCamera_Req, MediaService_StartEnvCamera_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum Error = m_pEntity->StartEnvCamera();
-	ctx->Ans.returncod = Error;
-	ctx->Answer(Error);
+	ctx->Answer(Error_Succeed);
 }
 
 
 void MediaServiceSession::Handle_StopEnvCamera(SpOnewayCallContext<MediaService_StopEnvCamera_Info>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
-	m_pEntity->StopEnvCamera();
 }
 
 
@@ -2131,7 +2143,7 @@ void MediaServiceSession::Handle_StartSpeakerRender(SpOnewayCallContext<MediaSer
 void MediaServiceSession::Handle_StopSpeakerRender(SpOnewayCallContext<MediaService_StopSpeakerRender_Info>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
-	if (true == m_pEntity->m_bHasStartSpeakerRender) {
+	if (true == m_pEntity->m_bHasStartSpeakerRender){
 		m_pEntity->StopSpeakerAudioRender();
 	} 
 }
@@ -2182,6 +2194,28 @@ void MediaServiceSession::Handle_GetCameraInfos(SpReqAnsContext<MediaService_Get
 }
 
 
+void MediaServiceSession::Handle_ManipulateCameras(SpReqAnsContext<MediaService_ManipulateCameras_Req, MediaService_ManipulateCameras_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	ErrorCodeEnum Error = Error_NotImpl;
+
+	DeviceTypeEnum eType = m_pEntity->RvcDeviceType();
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("rvc Device Type is %s, and cmdType is %d.", Device_Type_Table[eType], ctx->Req.cmdType);
+	
+	if (ctx->Req.cmdType == 0) {
+		Error = m_pEntity->StopCamerasAndRecord();
+		Sleep(50);
+	}
+	else {
+		Sleep(100);
+		Error = m_pEntity->StartCamerasAndRecord();
+	}
+
+	ctx->Ans.retCode = (int)Error;
+	ctx->Answer(Error_Succeed);
+}
+
+
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CMediaControllerEntity)
 SP_END_ENTITY_MAP()

+ 7 - 0
Module/mod_recorder/unix/mod_recorder.cpp

@@ -488,6 +488,13 @@ void CRecorderEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,
 {
 	switch (dwUserCode) 
 	{
+	case EVENT_MOD_PAUSE_RECORD:
+		if (m_bStarted) {
+			m_pRecorder->PauseRecord();
+			m_pRecorder->CloseVideoFile();
+		}
+		break;
+
 	case EVENT_MOD_CONTINUE_RECORD:
 		m_pRecorder->ContinueRecord();
 		break;

+ 1 - 1
Module/mod_recorder/win/mod_recorder.cpp

@@ -459,7 +459,7 @@ void CRecorderEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,
 		break;
 
 	case EVENT_MOD_PAUSE_RECORD:
-		if (m_bStarted && (0 == m_iRecordMode)){
+		if (m_bStarted){
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("manipulate media device function called, pause record!");
 			m_pRecorder->PauseRecord();
 			m_pRecorder->CloseVideoFile();

+ 24 - 0
Other/unix/libvideorecord/libvideorecord_impl.cpp

@@ -454,6 +454,7 @@ libvideorecord_impl::libvideorecord_impl(bool* pResult, CHostApi* pHostAPI, cons
 	m_bIsAudioNsOn = false;
 	m_iNsPolicy = 2;
 	m_bIsAudioTransOn = false;
+	m_bPauseRecord = false;
 	m_eFormat = eMP4;
 	m_pText = NULL;
 
@@ -622,6 +623,18 @@ int libvideorecord_impl::VideoRecord()
 	GetVideoFullName();
 	 
 	while (!m_bStopRecord){
+
+		if (m_bPauseRecord) {
+			struct timespec pause_ts;
+			clock_gettime(CLOCK_REALTIME, &pause_ts);
+			long unsec = pause_ts.tv_nsec + (1000 * 1000 * 1000);
+			pause_ts.tv_sec += (unsec / 1000000000);
+			pause_ts.tv_nsec = (unsec % 1000000000);
+			if (0 != sem_timedwait(&m_semt, &pause_ts) && (ETIMEDOUT == errno)) {
+			}
+			continue;
+		}
+
 		struct timespec ts;
 		clock_gettime(CLOCK_REALTIME, &ts);
 		long unsec = ts.tv_nsec + (1000 * 1000 * 5);
@@ -1627,6 +1640,7 @@ bool libvideorecord_impl::setRightWaterMark(const wchar_t* strWaterMark, size_t
 void libvideorecord_impl::Debug(const char* fmt, ...)
 {
 	va_list arg;
+
 	va_start(arg, fmt);
 
 	m_pHostApi->vDebug(RECORD_LOG_DEBUG, fmt, arg);
@@ -1643,6 +1657,10 @@ void libvideorecord_impl::vDebug(const char* str, va_list list)
 
 bool libvideorecord_impl::ContinueRecord()			//继续录像
 {
+	InitAudioQueue();
+	m_audioqueue = m_local_audioqueue;
+	InitVideoQueue();
+	m_bPauseRecord = false;
 	return true;
 }
 
@@ -1677,6 +1695,12 @@ bool libvideorecord_impl::StopVideoRecord()				//退出
 
 bool libvideorecord_impl::PauseRecord()				//暂停录像
 {
+	m_bPauseRecord = true;
+
+	RECORD_SAFE_DELETE(m_local_audioqueue);
+	RECORD_SAFE_DELETE(m_env_videoqueue);
+	RECORD_SAFE_DELETE(m_opt_videoqueue);
+
 	return true;
 }
 

+ 1 - 0
Other/unix/libvideorecord/libvideorecord_impl.h

@@ -119,6 +119,7 @@ private:
 	int m_iNsPolicy;			  //音频降噪等级
 	bool m_bIsAudioTransOn;		  //是否开始音频传输到识别服务器开关
 	int m_iAudioChannels;		  //录制音频通道数
+	bool m_bPauseRecord;
 
 	int m_nFps;
 	int m_videoquality;