Selaa lähdekoodia

Z991239-5559 #comment USB声卡故障时支持启动摄像头

80274480 1 vuosi sitten
vanhempi
sitoutus
85229278d1

+ 3 - 3
Module/mod_counterconnector/mod_counterconnector.cpp

@@ -281,11 +281,11 @@ void CCounterConnectorEntity::HandleGetVideoFailedEvent()
 {
 	MediaService_ClientBase* pMSClient = new MediaService_ClientBase(this);
 	
-	CSimpleStringA strCustomerBeing;
+	CSimpleStringA strCustomerBeing("");
 	GetFunction()->GetSysVar("CustomerBeing", strCustomerBeing);
-	CSimpleStringA strCustomerHandle;
+	CSimpleStringA strCustomerHandle("");
 	GetFunction()->GetSysVar("CustomerHandle", strCustomerHandle);
-	CSimpleStringA strCameraState;
+	CSimpleStringA strCameraState("");
 	GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strCameraState);
 
 	CSimpleStringA strmsg("");

+ 2 - 0
Module/mod_mediacontroller/Event.h

@@ -69,6 +69,8 @@
 #define LOG_EVT_MEDIACONTROLLER_OPTCAM_CLOSE				0x20880078  //关闭下摄像头
 #define LOG_EVT_MEDIACONTROLLER_CAMOPEN_FAILED_INFO			0x20880079  //摄像头失败原因
 #define LOG_EVT_MEDIACONTROLLER_RESTART_CAME_SUCCESS		0x20880080  //重新打开摄像头成功
+#define LOG_EVT_MEDIACONTROLLER_ENVCAM_FRAME_INFO			0x20880081  //上摄像头帧数信息
+#define LOG_EVT_MEDIACONTROLLER_OPTCAM_FRAME_INFO			0x20880082  //下摄像头帧数信息
 
 #define LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED				0x20890001	//摄像头已开启
 #define LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED				0x20890002  //摄像头已关闭

+ 25 - 19
Module/mod_mediacontroller/capture.cpp

@@ -17,7 +17,6 @@
 #include <memutil.h>
 #include <md5.h>
 #include "y2k_time.h"
-#include "rvc_media_common.h"
 #include "Event.h"
 
 using namespace MediaController;
@@ -34,6 +33,9 @@ using namespace MediaController;
 #define RVC_AUDIO_BUFFER_LEN 320
 #endif
 
+#ifndef MAX_PATH
+#define MAX_PATH 260
+#endif
 
 static void __dbg(const char *fmt, va_list arg)
 {
@@ -521,7 +523,7 @@ static int pulseaudio_capture_start(audio_capture_t* audio_cap)
 		int nId = audio_cap->paudiocap->audio_get_device_id(cap->config.strAudioIn.GetData(), true);
 		if (nId == -1)
 		{
-			LogWarn(Severity_Low, Error_Debug, ERROR_MOD_MEDIACONTROLLER_HANDFREEIN_INITFAIL, "hand free in device config error,please check");
+			LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_MEDIACONTROLLER_HANDFREEIN_INITFAIL, "hand free in device config error,please check");
 			return Error_AudioIN;
 		}
 
@@ -583,10 +585,6 @@ static void record_audio_data_callback(const void* input, unsigned long audiolen
 			else {
 				//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s:%d InsertAudio to audio_shm_queue success!", __FUNCTION__, __LINE__);
 			}
-
-			if (audio_cap->pdata) {
-				fwrite(frm.data, frm.framesize, 1, (FILE*)(audio_cap->pdata));
-			}
 			
 			audio_cap->uaudiolen -= RVC_AUDIO_BUFFER_LEN;
 		}
@@ -610,7 +608,7 @@ static int record_pulseaudio_capture_start(rvc_audio_capture_t* audio_cap)
 		audiocap_param_t param = { 0 };
 		int nId = audio_cap->paudiocap->audio_get_device_id(cap->rvc_audio_config.strAudioIn.GetData(), true);
 		if (nId == -1){
-			LogWarn(Severity_Low, Error_Debug, ERROR_MOD_MEDIACONTROLLER_HANDFREEIN_INITFAIL, "hand free in device config error,please check");
+			LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_MEDIACONTROLLER_HANDFREEIN_INITFAIL, "hand free in device config error,please check");
 			return Error_AudioIN;
 		}
 
@@ -647,7 +645,6 @@ static rvc_audio_capture_t *salesrecord_audio_capture_create(rvc_sales_audio_cap
 		audio_cap->audio_shm_queue = new Clibaudioqueue(REC_COMMON_AUDIO_SALES_SHM_QUEUE);
 		//audio_cap->remote_audio_queue = new Clibaudioqueue(REC_COMMON_REMOTEAUDIO_SHM_QUEUE);
 		audio_cap->iseriesnumber = 0;
-		audio_cap->pdata = NULL;
 	}
 
 #ifdef RVC_OS_LINUX
@@ -1657,9 +1654,14 @@ namespace MediaController {
 	{
 		int rc = 0;
 
-		ErrorCodeEnum rslt = start_audio_capture(cap->audio);
-		if (Error_Succeed != rslt){
-			return rslt;
+		if ('N' == cap->config.strAudioState[0] || 'P' == cap->config.strAudioState[0]) {
+			ErrorCodeEnum rslt = start_audio_capture(cap->audio);
+			if (Error_Succeed != rslt) {
+				return rslt;
+			}
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("handfree audio is error, not start it.");
 		}
 
 		return capture_start_envopt(cap);
@@ -1736,10 +1738,6 @@ namespace MediaController {
 	{
 		if (NULL != cap){
 			if (cap->rvc_audio){
-				if (cap->rvc_audio->pdata) {
-					fclose((FILE*)cap->rvc_audio->pdata);
-					cap->rvc_audio->pdata = NULL;
-				}
 				record_audio_capture_stop(cap->rvc_audio);
 
 #ifdef RVC_OS_LINUX
@@ -1762,13 +1760,17 @@ namespace MediaController {
 		}
 		if (cap->env_video) {
 			if (0 != cap->env_video->ustarttime) {
-				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_ENVCAM_CLOSE, CSimpleStringA::Format("stop envcam, and camera open time is %us.", y2k_time_now() - cap->env_video->ustarttime).GetData());
+				int ienvtime = y2k_time_now() - cap->env_video->ustarttime;
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_ENVCAM_CLOSE, CSimpleStringA::Format("stop envcam, and camera open time is %us.", ienvtime).GetData());
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_ENVCAM_FRAME_INFO, CSimpleStringA::Format("env camera frame info is dest frame number is %d(%us), real frame number is %d, difference is %d.", ienvtime*cap->config.video_env_fps, ienvtime, cap->env_video->frame_id, ienvtime * cap->config.video_env_fps - cap->env_video->frame_id).GetData());
 			}
 			video_capture_stop(cap->env_video);
 		}
 		if (cap->opt_video) {
 			if (0 != cap->opt_video->ustarttime) {
-				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_OPTCAM_CLOSE, CSimpleStringA::Format("stop optcam, and camera open time is %us.", y2k_time_now() - cap->opt_video->ustarttime).GetData());
+				int iopttime = y2k_time_now() - cap->opt_video->ustarttime;
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_OPTCAM_CLOSE, CSimpleStringA::Format("stop optcam, and camera open time is %us.", iopttime).GetData());
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_OPTCAM_FRAME_INFO, CSimpleStringA::Format("opt camera frame info is dest frame number is %d(%us), real frame number is %d, difference is %d.", iopttime * cap->config.video_opt_fps, iopttime, cap->opt_video->frame_id, iopttime * cap->config.video_opt_fps - cap->opt_video->frame_id).GetData());
 			}
 			video_capture_stop(cap->opt_video);
 		}
@@ -2175,7 +2177,9 @@ namespace MediaController {
 		{
 			video_capture_stop(cap->env_video);
 			if (0 != cap->env_video->ustarttime) {
-				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_ENVCAM_CLOSE, CSimpleStringA::Format("stop envcam, and camera open time is %us.", y2k_time_now() - cap->env_video->ustarttime).GetData());
+				int ienvtime = y2k_time_now() - cap->env_video->ustarttime;
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_ENVCAM_CLOSE, CSimpleStringA::Format("stop envcam, and camera open time is %us.", ienvtime).GetData());
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_ENVCAM_FRAME_INFO, CSimpleStringA::Format("env camera frame info is dest frame number is %d(%us), real frame number is %d, difference is %d.", ienvtime * cap->config.video_env_fps, ienvtime, cap->env_video->frame_id, ienvtime * cap->config.video_env_fps - cap->env_video->frame_id).GetData());
 			}
 
 			video_capture_destroy(cap->env_video);
@@ -2186,7 +2190,9 @@ namespace MediaController {
 		{
 			video_capture_stop(cap->opt_video);
 			if (0 != cap->opt_video->ustarttime) {
-				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_OPTCAM_CLOSE, CSimpleStringA::Format("stop optcam, and camera open time is %us.", y2k_time_now() - cap->opt_video->ustarttime).GetData());
+				int iopttime = y2k_time_now() - cap->opt_video->ustarttime;
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_OPTCAM_CLOSE, CSimpleStringA::Format("stop optcam, and camera open time is %us.", iopttime).GetData());
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_OPTCAM_FRAME_INFO, CSimpleStringA::Format("opt camera frame info is dest frame number is %d(%us), real frame number is %d, difference is %d.", iopttime * cap->config.video_opt_fps, iopttime, cap->opt_video->frame_id, iopttime * cap->config.video_opt_fps - cap->opt_video->frame_id).GetData());
 			}
 
 			video_capture_destroy(cap->opt_video);

+ 2 - 2
Module/mod_mediacontroller/capture.h

@@ -4,6 +4,7 @@
 #include "EventCode.h"
 #include "libaudioqueue.h"
 #include "libvideoqueue.h"
+#include "rvc_media_common.h"
 
 #ifdef RVC_OS_WIN
 #include <portaudio.h>
@@ -61,6 +62,7 @@ namespace MediaController {
 		int video_opt_fps;
 		CSimpleStringA strAudioIn;
 		CSimpleStringA strAudioOut;
+		CSimpleStringA strAudioState;
 		CSimpleStringA strVideoEnv;
 		CSimpleStringA strVideoOpt;
 		volatile LONG *ref_env_capture_count;
@@ -116,8 +118,6 @@ namespace MediaController {
 		int iaudio_capture_samplerate;						// 音频采样率,默认值为8K
 		int iaudio_capture_peroid;							// 音频采样率周期,默认20ms,每秒50个包
 		int iseriesnumber;									// 音频包序号
-
-		void* pdata;
 	}rvc_audio_capture_t;
 
 	typedef struct video_capture_t {

+ 34 - 51
Module/mod_mediacontroller/mod_mediacontroller.cpp

@@ -11,6 +11,7 @@
 #include "../mod_interactivecontrol/Event.h"
 #include "../mod_recorder/Event.h"
 #include "../mod_counterconnector/Event.h"
+#include "../mod_sipphone/Event.h"
 
 #ifndef AUTOMATCH_CAMERA_ENV
 #define AUTOMATCH_CAMERA_ENV	"ENV_"
@@ -111,8 +112,6 @@ CMediaControllerEntity::CMediaControllerEntity(): m_capture(NULL), m_salesaudio_
 	m_nCameraErrorCode = Error_Succeed;
 	memset(&conf, 0, sizeof(capture_config_t));
 	memset(&m_sales_audio_conf, 0, sizeof(rvc_audio_capture_config_t));
-
-	m_bRecordPCM = false;
 }
 
 void CMediaControllerEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
@@ -429,14 +428,12 @@ ErrorCodeEnum CMediaControllerEntity::GetMediaConfig()
 	int itimeout = CAMERA_TIMEOUT;
 	int iDelayTime = RVC_MAX_DELAY_TIME;
 	unsigned int intervaltime = RVC_CAM_INTERVAL_TIME;
-	bool bRecordPCM = false;
 
 	Error = GetFunction()->OpenConfig(Config_CenterSetting, spConfig);
 	if (Error == Error_Succeed){
 		table.AddEntryInt("MediaController", "CamTimeOut", itimeout, CAMERA_TIMEOUT);
 		table.AddEntryInt("MediaController", "MaxDelayTime", iDelayTime, RVC_MAX_DELAY_TIME);
 		table.AddEntryUInt("MediaController", "InterValTime", intervaltime, RVC_CAM_INTERVAL_TIME);
-		table.AddEntryBoolean("MediaController", "IsRecordPCM", bRecordPCM, false);
 		Error= table.Load(spConfig);
 	}
 
@@ -455,10 +452,6 @@ ErrorCodeEnum CMediaControllerEntity::GetMediaConfig()
 		if (intervaltime <= RVC_CAM_INTERVAL_TIME && intervaltime >= RVC_CAM_INTERVAL_TIME / 3) {
 			m_interValTime = intervaltime;
 		}
-
-		if (bRecordPCM) {
-			m_bRecordPCM = true;
-		}
 	}
 
 	return Error;
@@ -623,10 +616,6 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("change env camera from bEnvTimeout to ok.");
 		}
 	}
-	else {
-		bEnvTimeout = true;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("bEnvTimeout.");
-	}
 
 	//env是否30S没有图像或者图像15秒没有更新
 	if(((iEnvEmptyTimes == CAMERA_BUG_THRESHOLD)||bEnvTimeout)&&(m_nCameraErrorCode!=Error_EnvCamera)&&(m_nCameraErrorCode!=Error_AllCamera))
@@ -715,10 +704,6 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("change opt camera from bOptTimeout to ok");
 			}
 		}
-		else {
-			bOptTimeout = true;
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("bOptTimeout");
-		}
 	}
 
 	//opt是否100S没有图像或者图像20秒没有更新
@@ -1155,15 +1140,17 @@ ErrorCodeEnum CMediaControllerEntity::LoadConfig(capture_config_t *conf)
 	SpIniMappingTable table;
 	ErrorCodeEnum Error = spFunction->OpenConfig(Config_Root, spConfig);
 	if (Error == Error_Succeed) {
-		int imtu = 0;
+		int imtu = 1500;
+		int ienvfps = REC_COMMON_VIDEO_RAW_FPS;
+		int ioptfps = REC_COMMON_VIDEO_RAW_FPS;
 		table.AddEntryString("Audio", "handfree_in_dev", conf->strAudioIn, "$");
 		table.AddEntryString("Audio", "handfree_out_dev", conf->strAudioOut, "$");
 		table.AddEntryString("Video", "EnvCamera", conf->strVideoEnv, "$");
 		table.AddEntryString("Video", "OptCamera", conf->strVideoOpt, "$");
 		table.AddEntryInt("Video", "EnvRotate", conf->video_env_rotate, 0);
 		table.AddEntryInt("Video", "OptRotate", conf->video_opt_rotate, 270);
-		table.AddEntryInt("Video", "EnvFps", conf->video_env_fps, 15);
-		table.AddEntryInt("Video", "OptFps", conf->video_opt_fps, 15);
+		table.AddEntryInt("Video", "EnvFps", ienvfps, REC_COMMON_VIDEO_RAW_FPS);
+		table.AddEntryInt("Video", "OptFps", ioptfps, REC_COMMON_VIDEO_RAW_FPS);
 		table.AddEntryInt("Video", "mtu", imtu, 1500);
 		Error = table.Load(spConfig);
 		if (Error == Error_Succeed)
@@ -1175,6 +1162,18 @@ ErrorCodeEnum CMediaControllerEntity::LoadConfig(capture_config_t *conf)
 			if (270 != conf->video_opt_rotate) {
 				conf->video_opt_rotate = 270;
 			}
+
+			conf->video_env_fps = REC_COMMON_VIDEO_RAW_FPS;
+			if (ienvfps <= 30 && ienvfps >= 5) {
+				conf->video_env_fps = ienvfps;
+			}
+
+			conf->video_opt_fps = REC_COMMON_VIDEO_RAW_FPS;
+			if (ioptfps <= 30 && ioptfps >= 5) {
+				conf->video_opt_fps = ioptfps;
+			}
+
+
 			LogWarn(Severity_Low, Error_Debug, ERROR_MOD_MEDIACONTROLLER_ENV_CAMERA_INFO, conf->strVideoEnv.GetData());
 			LogWarn(Severity_Low, Error_Debug, ERROR_MOD_MEDIACONTROLLER_OPT_CAMERA_INFO, conf->strVideoOpt.GetData());
 			LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_CAMERA_INFOS, generateCameraInfosJson(conf->strVideoEnv, conf->strVideoOpt, conf->video_env_rotate, conf->video_opt_rotate, imtu).GetData());
@@ -1354,13 +1353,12 @@ void CMediaControllerEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID
 				GetFunction()->SetTimer(1, this, 5000);
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("本地录音录像失败,已停止!");
 			}
-			else //if (FaildFlag == '1')
+			else 
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("本地录音录像设备故障,尝试恢复中(预计10s内),请稍等");
 				if (false == m_bIsRemoteRecord) {
 					m_nCameraErrorCode = Error_AllCamera;
 				}
-				//RealSelfCheck(); // 录音录像失败,强行kill实体
 			}
 		}
 		break;
@@ -1484,18 +1482,13 @@ ErrorCodeEnum CMediaControllerEntity::ChangeSysvar(ErrorCodeEnum op)
 }
 
 //开始销售双录音频采集函数
-ErrorCodeEnum CMediaControllerEntity::StartSalesRecordAudioCapture(bool bRemoteRecord, void* pdata)
+ErrorCodeEnum CMediaControllerEntity::StartSalesRecordAudioCapture(bool bRemoteRecord)
 {
 	ErrorCodeEnum Error = Error_Succeed;
 	if (NULL == m_salesaudio_capture){
 		memset(&m_sales_audio_conf, 0, sizeof(m_sales_audio_conf));
 		GetSalesAudioConfig(&m_sales_audio_conf, bRemoteRecord);
 		Error = (ErrorCodeEnum)salesaudio_capture_create(&m_sales_audio_conf, &m_salesaudio_capture);
-		if (Error_Succeed == Error) {
-			if (NULL != m_salesaudio_capture->rvc_audio && NULL != pdata) {
-				m_salesaudio_capture->rvc_audio->pdata = pdata;
-			}
-		}
 	}
 
 	if (Error_Succeed == Error){
@@ -1539,6 +1532,12 @@ ErrorCodeEnum CMediaControllerEntity::StartCamera()
 #else
 			m_capture->audio->paudiocap = m_pAudioCap;
 #endif
+			CSmartPointer<IEntityFunction> Func = GetFunction();
+			CSimpleStringA strValue("");
+			Func->GetSysVar(SYSVAR_SOUNDCARDSTATE, strValue);
+			m_capture->config.strAudioState = strValue;
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Sound Card State is %s.", strValue);
+
 			Error = capture_start(m_capture);
 			if (Error != Error_Succeed)
 			{
@@ -1695,23 +1694,13 @@ ErrorCodeEnum CMediaControllerEntity::HandleSalesRecordPCMAudio(bool bRemoteReco
 		tmp = NULL;
 	}
 
-	CSimpleStringA strMicroName("");
-	CSimpleStringA strTempDir("");
-	if (Error_Succeed == GetFunction()->GetPath("Temp", strTempDir)) {
-		strMicroName = CSimpleStringA::Format("%s/local_micro_%s.pcm", strTempDir.GetData(), strSwiftName);
-	}
-	else {
-		strMicroName = CSimpleStringA::Format("local_micro_%s.pcm", strSwiftName);
+	CSimpleStringA strTempDir;
+	if (Error_Succeed == GetFunction()->GetPath("Temp", strTempDir)){
+
 	}
+	
+	if (Error_Succeed == StartSalesRecordAudioCapture(bRemoteRecord)){
 
-	FILE* pRecord = fopen(strMicroName.GetData(), "wb+");
-	if (NULL != pRecord) {
-		if (Error_Succeed == StartSalesRecordAudioCapture(bRemoteRecord, pRecord)) {
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("begin remote sales record audio capture and record local PCM.");
-		}
-}
-	else {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("fopen %s failed.", strMicroName);
 	}
 
 #ifdef RVC_OS_WIN
@@ -1739,16 +1728,10 @@ void CMediaControllerEntity::HandleRemoteRecord(const char *pszMessage)
 	frame.nchannels = 1;
 	frame.samplespersec = 8000;
 
-	if (true == m_bRecordPCM) {
-		HandleSalesRecordPCMAudio(true, pszMessage, &frame);
-	}
-	else {
-		if (Error_Succeed == StartSalesRecordAudioCapture(true)) {
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("begin remote sales record audio capture.");
-		}
-		StartSpeakerAudioRender(0, &frame, NULL);
-	}
+	if (Error_Succeed == StartSalesRecordAudioCapture(true)){
 
+	}
+	StartSpeakerAudioRender(0, &frame, NULL);	
 }
 
 ErrorCodeEnum CMediaControllerEntity::StartSpeakerAudioRender(int iQueue, audio_frame* pFrame, const char* strName)

+ 1 - 3
Module/mod_mediacontroller/mod_mediacontroller.h

@@ -113,7 +113,7 @@ public:
 	virtual void OnSelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext);
 	int GetActiveCamera();
 	ErrorCodeEnum ChangeSysvar(ErrorCodeEnum op);
-	ErrorCodeEnum StartSalesRecordAudioCapture(bool bRemoteRecord = false, void* pdata = NULL);
+	ErrorCodeEnum StartSalesRecordAudioCapture(bool bRemoteRecord = false);
 	ErrorCodeEnum StopSalesRecordAudioCapture();
 	ErrorCodeEnum StartCamera();
 	void StartCameraAndSetSysVar();
@@ -160,6 +160,4 @@ private:
 	int m_iDelayTime;
 	int m_interValTime;
 	bool m_bCameraOffTimerOn;
-
-	bool m_bRecordPCM;
 };

+ 2 - 2
Module/mod_sipphone/Event.h

@@ -198,11 +198,11 @@
 #define LOG_EVT_HANDFREE_MODE_REMOTE_CALL		0x30400006				//以免提模式开始远程连线
 #define LOG_EVT_PICKUP_MODE_REMOTE_CALL			0x30400007				//以话筒模式开始远程连线
 
-#define ACM_CONTROL_PERSONAREA		0x30 // 控制人形框,0:隐藏,1:显示
-
+#define ACM_CONTROL_PERSONAREA					0x30 // 控制人形框,0:隐藏,1:显示
 
 //sysvar
 #define SYSVAR_SOUNDCARDSTATE	"SoundCardState"
+#define SOUNDCARD_INIT_STATE		"X"
 #define SOUNDCARD_NO_ERROR			"N"
 #define SOUNDCARD_HANDFREE_ERROR	"H"
 #define SOUNDCARD_PICKUP_ERROR		"P"

+ 72 - 64
Module/mod_sipphone/mod_sipphone.cpp

@@ -556,6 +556,22 @@ void CSIPEntity::OnStarted()
 		GetFunction()->SetTimer(2, this, 3200);
 	}
 
+	Error = GetLocalIP();
+	if (Error != 0) {
+		CSimpleStringA strErrMsg = "获取本地 IP 地址失败,请检查本地网络是否连接!";
+		LogWarn(Severity_Middle, Error_NetBroken, ERROR_MOD_SIP_GET_LOCAL_IP_FAILED, strErrMsg.GetData());
+	}
+
+	{
+		CSmartPointer<IEntityFunction> Func = GetFunction();
+		CSimpleStringA strValue("");
+		Func->GetSysVar(SYSVAR_SOUNDCARDSTATE, strValue);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Sound Card State %s.", strValue.GetData());
+	}
+
+	LogEvent(Severity_Middle, LOG_EVT_MOD_SIPPHONE_STARTED_SUCCESS, "sipphone entity started successfully.");
+	LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_ENTITY_STARTED, "sipphone entity started.");
+
 #ifdef RVC_OS_WIN
 	if (!m_pAudioMgr || !m_bAudioMgrInited){
 		return;
@@ -592,14 +608,6 @@ void CSIPEntity::OnStarted()
 		}
 	}
 #endif
-	Error = GetLocalIP();
-	if (Error != 0) {
-		CSimpleStringA strErrMsg = "获取本地 IP 地址失败,请检查本地网络是否连接!";
-		LogWarn(Severity_Middle, Error_NetBroken, ERROR_MOD_SIP_GET_LOCAL_IP_FAILED, strErrMsg.GetData());
-	}
-
-	LogEvent(Severity_Middle, LOG_EVT_MOD_SIPPHONE_STARTED_SUCCESS, "sipphone entity started successfully.");
-	LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_ENTITY_STARTED, "sipphone entity started.");
 }
 
 
@@ -822,13 +830,14 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 	audiomgr_callback_t t_callback = { 0 };
 	t_callback.debug = &__audiomgrlog;
 	m_pAudioMgr = CreateAudioMgrObj(&t_callback);
-	if (0 == m_pAudioMgr->audio_mgr_initialize()) {
+	if (m_pAudioMgr && 0 == m_pAudioMgr->audio_mgr_initialize()) {
 		m_bAudioMgrInited = true;
 	}
 	else {
 		LogWarn(Severity_Middle, Error_Debug, LOG_EVT_SIPPHONE_AUDIOMGR_INITIAL_FAILED, "audio manager initialize failed!");
 	}
-	
+	SetSoundCardSysVar(SOUNDCARD_INIT_STATE);
+
 	m_eDeviceType = RvcGetDeviceType();
 	m_stVideoParam.bActiveInspect = 0;
 	m_stVideoParam.bShowActiveImg = 0;
@@ -848,30 +857,38 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 	if (Error != Error_Succeed) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load config failed!");
 	}
-	
+
 	if (IsPostAudioConfigInfo()) {
 		LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_AUDIO_DEVICE_INFO, generateAudioInfoJson(conf.audio_handfree_in_dev, conf.audio_handfree_out_dev, conf.audio_pickup_in_dev, conf.audio_pickup_out_dev).GetData());
 	}
 	else {
 		//有配置为空的,进关门页
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("audio config is invalid.");
+		SetSoundCardSysVar(SOUNDCARD_BOTH_ERROR);
 		return Error_Param;
 	}
 	
 	uint32_t uCheckRet = CheckAudioDevice();
 	if (RVC_AUDIO_NO_ERROR == uCheckRet) {
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("no audio device config error.");
+		SetSoundCardSysVar(SOUNDCARD_NO_ERROR);
 	}
 	else {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("error audio device number is %d.", countnum(uCheckRet));
 		if (countnum(uCheckRet) >= 3) {		//故障设备数大于3个或以上
+			SetSoundCardSysVar(SOUNDCARD_BOTH_ERROR);
 			return Error_Param;
 		}
 
-		if (uCheckRet = RVC_AUDIO_HANDFREEIN_ERROR | RVC_AUDIO_HANDFREEOUT_ERROR) {
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("can't find usb audio device.");
+		if ((uCheckRet == (RVC_AUDIO_HANDFREEIN_ERROR | RVC_AUDIO_HANDFREEOUT_ERROR)) || (uCheckRet == RVC_AUDIO_HANDFREEIN_ERROR) || (uCheckRet == RVC_AUDIO_HANDFREEOUT_ERROR)) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("can't find usb audio device.");
+			SetSoundCardSysVar(SOUNDCARD_HANDFREE_ERROR);
 			HandleUSBAudioDeviceErrorEvent();
 		}
+
+		if ((uCheckRet == (RVC_AUDIO_PICKUPIN_ERROR | RVC_AUDIO_PICKUPOUT_ERROR))|| (uCheckRet == RVC_AUDIO_PICKUPIN_ERROR) || (uCheckRet == RVC_AUDIO_PICKUPOUT_ERROR)) {
+			SetSoundCardSysVar(SOUNDCARD_PICKUP_ERROR);
+		}
 	}
 
 	int nhandfreeout = 0;
@@ -1104,7 +1121,7 @@ void CSIPEntity::OnReceivePkt(int type, int sub_type, const char *buffer, int si
 			}
 #endif
 		} 
-		else if((sub_type == ACM_SET_PICKUP_OUTVOLUMN)&&(eStand2sType == m_eDeviceType))
+		else if(sub_type == ACM_SET_PICKUP_OUTVOLUMN)
 		{
 			CVolumnValue num;
 			SpBuffer buf;
@@ -1113,16 +1130,10 @@ void CSIPEntity::OnReceivePkt(int type, int sub_type, const char *buffer, int si
 #ifdef RVC_OS_WIN
 			if (m_pKeeperOut[DEV_PICKUP])
 			{
-				if(eStand2sType == m_eDeviceType){
-					volume_keeper_change(m_pKeeperOut[DEV_PICKUP],num.nValue);
-					m_kept_volume_out[DEV_PICKUP] = num.nValue;
-					SendAudioDeviceVolumn(DEVICE_PICKUP_OUT);
-					SaveAudioRunConfig(m_kept_volume_out[DEV_HANDFREE],m_kept_volume_out[DEV_PICKUP],m_kept_volume_in[DEV_HANDFREE],m_kept_volume_in[DEV_PICKUP]);
-				}
-				else   //pad版屏蔽当前PICKUP音量设置
-				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PAD type, ignore pickupout volume adj");
-				}
+				volume_keeper_change(m_pKeeperOut[DEV_PICKUP],num.nValue);
+				m_kept_volume_out[DEV_PICKUP] = num.nValue;
+				SendAudioDeviceVolumn(DEVICE_PICKUP_OUT);
+				SaveAudioRunConfig(m_kept_volume_out[DEV_HANDFREE],m_kept_volume_out[DEV_PICKUP],m_kept_volume_in[DEV_HANDFREE],m_kept_volume_in[DEV_PICKUP]);
 			} 
 			else {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PICKUP out volume keeper create failed!");
@@ -1130,17 +1141,10 @@ void CSIPEntity::OnReceivePkt(int type, int sub_type, const char *buffer, int si
 #else
 			if (m_pAudioMgr)
 			{
-				if (eStand2sType == m_eDeviceType)
-				{
-					m_pAudioMgr->audio_set_device_volume(num.nValue, conf.audio_pickup_out_dev, false);
-					m_kept_volume_out[DEV_PICKUP] = num.nValue;
-					SendAudioDeviceVolumn(DEVICE_PICKUP_OUT);
-					SaveAudioRunConfig(m_kept_volume_out[DEV_HANDFREE], m_kept_volume_out[DEV_PICKUP], m_kept_volume_in[DEV_HANDFREE], m_kept_volume_in[DEV_PICKUP]);
-				}
-				else   //pad版屏蔽当前PICKUP音量设置
-				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PAD type, ignore pickupout volume adj");
-				}
+				m_pAudioMgr->audio_set_device_volume(num.nValue, conf.audio_pickup_out_dev, false);
+				m_kept_volume_out[DEV_PICKUP] = num.nValue;
+				SendAudioDeviceVolumn(DEVICE_PICKUP_OUT);
+				SaveAudioRunConfig(m_kept_volume_out[DEV_HANDFREE], m_kept_volume_out[DEV_PICKUP], m_kept_volume_in[DEV_HANDFREE], m_kept_volume_in[DEV_PICKUP]);
 			}
 			else
 			{
@@ -1179,7 +1183,7 @@ void CSIPEntity::OnReceivePkt(int type, int sub_type, const char *buffer, int si
 			}
 #endif
 		} 
-		else if((sub_type == ACM_SET_PICKUP_INVOLUMN)&&(eStand2sType == m_eDeviceType))
+		else if(sub_type == ACM_SET_PICKUP_INVOLUMN)
 		{
 			CVolumnValue num;
 			SpBuffer buf;
@@ -1188,17 +1192,10 @@ void CSIPEntity::OnReceivePkt(int type, int sub_type, const char *buffer, int si
 #ifdef RVC_OS_WIN
 			if (m_pKeeperIn[DEV_PICKUP])
 			{
-				if (eStand2sType == m_eDeviceType)
-				{
-					volume_keeper_change(m_pKeeperIn[DEV_PICKUP], num.nValue);
-					m_kept_volume_in[DEV_PICKUP] = num.nValue;
-					SendAudioDeviceVolumn(DEVICE_PICKUP_IN);
-					SaveAudioRunConfig(m_kept_volume_out[DEV_HANDFREE], m_kept_volume_out[DEV_PICKUP], m_kept_volume_in[DEV_HANDFREE], m_kept_volume_in[DEV_PICKUP]);
-				}
-				else   //pad版屏蔽当前PICKUP音量设置
-				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PAD type, ignore pickupin volume adj");
-				}
+				volume_keeper_change(m_pKeeperIn[DEV_PICKUP], num.nValue);
+				m_kept_volume_in[DEV_PICKUP] = num.nValue;
+				SendAudioDeviceVolumn(DEVICE_PICKUP_IN);
+				SaveAudioRunConfig(m_kept_volume_out[DEV_HANDFREE], m_kept_volume_out[DEV_PICKUP], m_kept_volume_in[DEV_HANDFREE], m_kept_volume_in[DEV_PICKUP]);
 			}
 			else
 			{
@@ -1207,17 +1204,10 @@ void CSIPEntity::OnReceivePkt(int type, int sub_type, const char *buffer, int si
 #else
 			if (m_pAudioMgr)
 			{
-				if (eStand2sType == m_eDeviceType)
-				{
-					m_pAudioMgr->audio_set_device_volume(num.nValue, conf.audio_pickup_in_dev, true);
-					m_kept_volume_in[DEV_PICKUP] = num.nValue;
-					SendAudioDeviceVolumn(DEVICE_PICKUP_IN);
-					SaveAudioRunConfig(m_kept_volume_out[DEV_HANDFREE], m_kept_volume_out[DEV_PICKUP], m_kept_volume_in[DEV_HANDFREE], m_kept_volume_in[DEV_PICKUP]);
-				}
-				else   //pad版屏蔽当前PICKUP音量设置
-				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PAD type, ignore pickupin volume adj");
-				}
+				m_pAudioMgr->audio_set_device_volume(num.nValue, conf.audio_pickup_in_dev, true);
+				m_kept_volume_in[DEV_PICKUP] = num.nValue;
+				SendAudioDeviceVolumn(DEVICE_PICKUP_IN);
+				SaveAudioRunConfig(m_kept_volume_out[DEV_HANDFREE], m_kept_volume_out[DEV_PICKUP], m_kept_volume_in[DEV_HANDFREE], m_kept_volume_in[DEV_PICKUP]);
 			}
 			else
 			{
@@ -1328,13 +1318,15 @@ ErrorCodeEnum CSIPEntity::RvcSetSaveAudioVolume()
 {
 	ErrorCodeEnum Error = Error_Succeed;
 
+#ifdef RVC_OS_LINUX
 	if (m_pAudioMgr){
 		m_pAudioMgr->audio_set_device_volume(m_kept_volume_out[DEV_HANDFREE], conf.audio_handfree_out_dev, false);
 		m_pAudioMgr->audio_set_device_volume(m_kept_volume_in[DEV_HANDFREE], conf.audio_handfree_in_dev, true);
 		m_pAudioMgr->audio_set_device_volume(m_kept_volume_out[DEV_PICKUP], conf.audio_pickup_out_dev, false);
 		m_pAudioMgr->audio_set_device_volume(m_kept_volume_in[DEV_PICKUP], conf.audio_pickup_in_dev, true);
 	}
-	
+#endif
+
 	return Error;
 }
 
@@ -1347,7 +1339,7 @@ bool CSIPEntity::IsPostAudioConfigInfo()
 	size_t upickupin = strlen(conf.audio_pickup_in_dev);
 	size_t upickupout = strlen(conf.audio_pickup_out_dev);
 
-	if ((uhandfreeout > 0) && (uhandfreeout > 0) && (upickupin > 0) && (upickupout > 0)) {
+	if ((uhandfreein > 0) && (uhandfreeout > 0) && (upickupin > 0) && (upickupout > 0)) {
 		bRet = true;
 	}
 
@@ -1357,12 +1349,15 @@ bool CSIPEntity::IsPostAudioConfigInfo()
 uint32_t CSIPEntity::CheckAudioDevice()
 {
 	int id = -1;
+
 	uint32_t Error = RVC_AUDIO_NO_ERROR;
 
 #ifdef RVC_OS_WIN
 	id = capture_get_audio_device_id(true, conf.audio_handfree_in_dev);
 #else
-	id = m_pAudioMgr->audio_get_device_id(conf.audio_handfree_in_dev, true);
+	if (NULL != m_pAudioMgr) {
+		id = m_pAudioMgr->audio_get_device_id(conf.audio_handfree_in_dev, true);
+	}
 #endif
 	if (id == -1) {
 		//CSimpleStringA strErrMsg = "外部麦克风配置错误,请重新配置!";
@@ -1374,7 +1369,9 @@ uint32_t CSIPEntity::CheckAudioDevice()
 #ifdef RVC_OS_WIN					
 	id = capture_get_audio_device_id(false, conf.audio_handfree_out_dev);
 #else
-	id = m_pAudioMgr->audio_get_device_id(conf.audio_handfree_out_dev, false);
+	if (NULL != m_pAudioMgr) {
+		id = m_pAudioMgr->audio_get_device_id(conf.audio_handfree_out_dev, false);
+	}
 #endif
 	if (id == -1) {
 		//CSimpleStringA strErrMsg = "外部扬声器配置错误,请重新配置!";
@@ -1387,7 +1384,9 @@ uint32_t CSIPEntity::CheckAudioDevice()
 #ifdef RVC_OS_WIN
 	id = capture_get_audio_device_id(true, conf.audio_pickup_in_dev);
 #else
-	id = m_pAudioMgr->audio_get_device_id(conf.audio_pickup_in_dev, true);
+	if (NULL != m_pAudioMgr) {
+		id = m_pAudioMgr->audio_get_device_id(conf.audio_pickup_in_dev, true);
+	}
 #endif
 	if (id == -1) {
 		//CSimpleStringA strErrMsg = "话筒麦克风配置错误,请重新配置!";
@@ -1399,7 +1398,9 @@ uint32_t CSIPEntity::CheckAudioDevice()
 #ifdef RVC_OS_WIN
 	id = capture_get_audio_device_id(false, conf.audio_pickup_out_dev);
 #else
-	id = m_pAudioMgr->audio_get_device_id(conf.audio_pickup_out_dev, false);
+	if (NULL != m_pAudioMgr) {
+		id = m_pAudioMgr->audio_get_device_id(conf.audio_pickup_out_dev, false);
+	}
 #endif				
 	if (id == -1) {
 		//CSimpleStringA strErrMsg = "话筒扬声器配置错误,请重新配置!";
@@ -1415,6 +1416,13 @@ uint32_t CSIPEntity::CheckAudioDevice()
 	return Error;
 }
 
+ErrorCodeEnum CSIPEntity::SetSoundCardSysVar(const CSimpleStringA& newVal)
+{
+	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
+
+	return spFunction->SetSysVar(SYSVAR_SOUNDCARDSTATE, newVal.GetData());
+}
+
 ErrorCodeEnum CSIPEntity::GetLocalIP()
 {
 #ifdef RVC_OS_WIN

+ 1 - 0
Module/mod_sipphone/mod_sipphone.h

@@ -354,6 +354,7 @@ private:
 	ErrorCodeEnum ConnectAssistChannel();
 	bool IsPostAudioConfigInfo();
 	uint32_t CheckAudioDevice();
+	ErrorCodeEnum SetSoundCardSysVar(const CSimpleStringA& newVal);
 
 public:
 	int m_kept_volume_in[2];