⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xms_confdemo_sub.cpp

📁 基于东进Keygoe交换机的会议应用演示程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	DrawCount_RemoveState ( s8DspModID );

	// handle device : INTERFACE_CH
	for ( i = 0; i < AllDeviceRes[s8DspModID].lTrunkNum; i ++ )
	{
		if ( AllDeviceRes[s8DspModID].pTrunk[i].State == TRK_FREE )
			Change_State ( &AllDeviceRes[s8DspModID].pTrunk[i], TRK_WAIT_REMOVE );
	}

	// handle device : VOICE
	for ( i = 0; i < AllDeviceRes[s8DspModID].lVocNum; i ++ )
	{
		if ( AllDeviceRes[s8DspModID].pVoice[i].State == VOC_FREE )
		{
			Change_Voc_State ( &AllDeviceRes[s8DspModID].pVoice[i], VOC_WAIT_REMOVE);
		}
	}

	// handle device : CONF
	for ( i = 0; i < AllDeviceRes[s8DspModID].lConfNum; i ++ )
	{
		if ( AllDeviceRes[s8DspModID].pConf[i].State == CONF_FREE )
		{
			Change_Conf_State ( &AllDeviceRes[s8DspModID].pConf[i], CONF_WAIT_REMOVE);
		}
	}

	// check if all device is WAIT_OPEN or WAIT_REMOVE
	CheckRemoveReady ( s8DspModID );
}

// --------------------------------------------------------------------------------
/*停止放音*/
DJ_S32 StopPlayFile ( DeviceID_t	*pVocDevID )
{
	RetCode_t		r;
	ControlPlay_t	controlPlay;

	controlPlay.m_u16ControlType = XMS_STOP_PLAY;

	r = XMS_ctsControlPlay ( g_acsHandle, pVocDevID, &controlPlay, NULL );

	return r;
}

/*放音处理*/
DJ_S32	 PlayFile ( DeviceID_t	*pVocDevID, DJ_S8 *s8FileName, DJ_U8 u8PlayTag, bool bIsQueue )
{	
	DJ_U32           i = 0;	
	PlayProperty_t  playProperty;
	RetCode_t		 r;

	memset(&playProperty,0,sizeof(playProperty));		
	
	if ( bIsQueue )
		playProperty.m_u16PlayType = XMS_PLAY_TYPE_FILE_QUEUE;	
	else
		playProperty.m_u16PlayType = XMS_PLAY_TYPE_FILE;	

	playProperty.m_u8TaskID = u8PlayTag;

	strcpy ( playProperty.m_s8PlayContent, s8FileName );
	
	r = XMS_ctsPlay ( g_acsHandle, pVocDevID, &playProperty, NULL );

	return r;
}

bool	CheckPlayEnd ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
	Acs_MediaProc_Data	*pMediaData = NULL;

	if ( pAcsEvt->m_s32EventType == XMS_EVT_PLAY )	
	{
		pMediaData = (Acs_MediaProc_Data *) FetchEventData(pAcsEvt);
		if ( pMediaData->m_u8TaskID == pOneTrunk->u8PlayTag )
			return true;
	}

	return false;
}

/*停止录音*/
DJ_S32 StopRecordFile ( DeviceID_t	*pVocDevID )
{
	RetCode_t		r;
	ControlRecord_t	controlRecord;

	controlRecord.m_u32ControlType = XMS_STOP_RECORD;

	r = XMS_ctsControlRecord ( g_acsHandle, pVocDevID, &controlRecord, NULL );

	return r;
}

/*录音处理*/
DJ_S32	 RecordFile ( DeviceID_t	*pVocDevID, DJ_S8 *s8FileName, DJ_U32 u32RecSize, bool bIsAppend )
{	
	DJ_U32				i = 0;	
	RecordProperty_t	recordProperty;
	RetCode_t			r;

	memset(&recordProperty,0,sizeof(RecordProperty_t));		
	
	recordProperty.m_u32MaxSize = u32RecSize;

	if ( bIsAppend )
		recordProperty.m_s8IsAppend = 1;
	else
		recordProperty.m_s8IsAppend = 0;

	strcpy ( recordProperty.m_s8FileName, s8FileName );

	r = XMS_ctsRecord ( g_acsHandle, pVocDevID, &recordProperty, NULL );

	return r;
}

DJ_S32	 RecordFile_Conf ( DeviceID_t	*pVocDevID, DJ_S8 *s8FileName, DJ_U32 u32RecSize, bool bIsAppend, DeviceID_t *pConfDevID )
{	
	DJ_U32				i = 0;	
	RecordProperty_t	recordProperty;
	RetCode_t			r;

	memset(&recordProperty,0,sizeof(RecordProperty_t));		
	
	recordProperty.m_u32MaxSize = u32RecSize;

	if ( bIsAppend )
		recordProperty.m_s8IsAppend = 1;
	else
		recordProperty.m_s8IsAppend = 0;

	strcpy ( recordProperty.m_s8FileName, s8FileName );

	// record conf
	recordProperty.m_s8IsMixEnable = 1;

	recordProperty.m_MixerControl.m_u8SRC1_Ctrl = XMS_MIXER_FROM_CONF;
	recordProperty.m_MixerControl.m_u16SRC_ChID1 = pConfDevID->m_s16ChannelID;
	recordProperty.m_MixerControl.m_u8SRC2_Ctrl = XMS_MIXER_FROM_NULL;
	//recordProperty.m_MixerControl.m_u16SRC_ChID2	// don't care when XMS_MIXER_FROM_NULL
	//

	r = XMS_ctsRecord ( g_acsHandle, pVocDevID, &recordProperty, NULL );

	return r;
}

bool	CheckRecordEnd ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
	Acs_MediaProc_Data	*pMediaData = NULL;

	if ( pAcsEvt->m_s32EventType == XMS_EVT_RECORD )	
	{
		return true;
	}

	return false;
}

void My_InitDtmfBuf ( TRUNK_STRUCT *pOneTrunk )
{
	pOneTrunk->DtmfCount = 0;
	pOneTrunk->DtmfBuf[0] = 0; 
}

void My_AddDtmfBuf ( TRUNK_STRUCT *pOneTrunk, char TmpDtmf )
{
	if ( pOneTrunk->DtmfCount < (32-1) )
	{
		pOneTrunk->DtmfBuf[pOneTrunk->DtmfCount] = TmpDtmf; 
		pOneTrunk->DtmfBuf[pOneTrunk->DtmfCount+1] = 0; 
		pOneTrunk->DtmfCount ++;
	}
}

char My_GetDtmfCode ( Acs_Evt_t *pAcsEvt )
{
	Acs_IO_Data				*pIOData = NULL;
	char		*p;

	if ( pAcsEvt->m_s32EventType == XMS_EVT_RECVIODATA )	/*IO Data事件*/
	{
		pIOData = (Acs_IO_Data *)FetchEventData(pAcsEvt);

		if ( ( pIOData->m_u16IoType == XMS_IO_TYPE_DTMF ) 
			&& ( pIOData->m_u16IoDataLen > 0 ) )
		{
			p = (char *)FetchIOData(pAcsEvt);

			return *p;
		}
	}

	return -1;	// not a good DTMF
}

void	My_DualLink ( DeviceID_t *pDev1, DeviceID_t *pDev2 )
{
	XMS_ctsLinkDevice ( g_acsHandle, pDev1, pDev2, NULL ); 
	XMS_ctsLinkDevice ( g_acsHandle, pDev2, pDev1, NULL ); 
}

void	My_DualUnlink ( DeviceID_t *pDev1, DeviceID_t *pDev2 )
{
	XMS_ctsUnlinkDevice ( g_acsHandle, pDev1, pDev2, NULL ); 
	XMS_ctsUnlinkDevice ( g_acsHandle, pDev2, pDev1, NULL ); 
}

RetCode_t  My_JoinToConf ( DeviceID_t *pConfDevID, DeviceID_t *pVocDevID, int iMode )
{
	RetCode_t	r = -1;
	CmdParamData_Conf_t		confParam;
	CONF_STRUCT				*pOneConf;

	pOneConf = &M_OneConf (*pConfDevID);

	switch ( iMode )
	{
	case CONF_MODE_ADD:			// add
		confParam.m_u8InputOpt = XMS_CONF_INPUT_OPT_NORMAL;
		confParam.m_u8OutputOpt = XMS_CONF_OUTPUT_OPT_NORMAL;
		break;

	case CONF_MODE_LISTEN:		// listen
		confParam.m_u8InputOpt = XMS_CONF_INPUT_OPT_SILENCE;
		confParam.m_u8OutputOpt = XMS_CONF_OUTPUT_OPT_SUM;
		break;

	case CONF_MODE_SPEAKONLY:	// Speak Only
		confParam.m_u8InputOpt = XMS_CONF_INPUT_OPT_NORMAL;
		confParam.m_u8OutputOpt = XMS_CONF_OUTPUT_OPT_SILENCE;
		break;

	case CONF_MODE_PLAY:		// Play
		confParam.m_u8InputOpt = XMS_CONF_INPUT_OPT_PLAY;
		// confParam.m_u8OutputOpt // don't care
		break;
	}

	r = XMS_ctsJoinToConf ( g_acsHandle, pConfDevID, pVocDevID, &confParam, NULL);

	if ( r > 0 )
	{
		pOneConf->Member[pOneConf->lMemberNum].lMode = iMode; 
		pOneConf->Member[pOneConf->lMemberNum].DevID = *pVocDevID;
		pOneConf->lMemberNum ++;
		if ( iMode == CONF_MODE_LISTEN )
		{
			pOneConf->lListenNum ++;
		}

		DrawConf_DetailInfo ( pOneConf );

		if ( pOneConf->lMemberNum == 1 )
		{
			OccupyOneConf ( pOneConf );
		}
	}
	else
	{
		AddMsg ( "XMS_ctsJoinToConf() Fail in My_JoinToConf()!" );
	}

	return	r;
}

bool	IsDeviceEqual ( DeviceID_t *pDevID1, DeviceID_t *pDevID2 )
{
	if ( ( pDevID1->m_s16DeviceMain == pDevID2->m_s16DeviceMain )
		&& ( pDevID1->m_s8ModuleID == pDevID2->m_s8ModuleID )
		&& ( pDevID1->m_s16ChannelID == pDevID2->m_s16ChannelID ) )
	{
		return true;
	}

	return false;
}


RetCode_t  My_LeaveFromConf ( DeviceID_t *pConfDevID, DeviceID_t *pVocDevID, int iMode )
{
	int						i, j;
	RetCode_t				r = -1;
	CmdParamData_Conf_t		confParam;
	CONF_STRUCT				*pOneConf;

	pOneConf = &M_OneConf (*pConfDevID);

	if ( iMode != CONF_MODE_PLAY )
		confParam.m_u8InputOpt = XMS_CONF_INPUT_OPT_NORMAL;
	else
		confParam.m_u8InputOpt = XMS_CONF_INPUT_OPT_PLAY;

	// confParam.m_u8OutputOpt // don't care

	r = XMS_ctsLeaveFromConf ( g_acsHandle, pConfDevID, pVocDevID, &confParam, NULL);

	if ( r > 0 )
	{
		for ( i = 0; i < pOneConf->lMemberNum; i ++ )
		{
			if ( ( pOneConf->Member[i].lMode == iMode ) && IsDeviceEqual(&pOneConf->Member[i].DevID, pVocDevID) )
				break;
		}

		if ( i < pOneConf->lMemberNum )
		{
			if ( i < (pOneConf->lMemberNum-1) )
			{
				for ( j = i; j < pOneConf->lMemberNum-1; j ++ )		// move
					pOneConf->Member[j] = pOneConf->Member[j+1];  
			}
			
			if ( pOneConf->lMemberNum > 0 )
				pOneConf->lMemberNum --;
			if ( pOneConf->lListenNum > 0 )
				pOneConf->lListenNum --;

			DrawConf_DetailInfo ( pOneConf );

			if ( pOneConf->lMemberNum == 0 )
				FreeOneConf ( &pOneConf->deviceID );
		}
	}
	else
	{
		AddMsg ( "XMS_ctsLeaveFromConf() Fail in My_LeaveFromConf()!" );
	}

	return	r;
}

int		SearchOneFreeVoice (  DeviceID_t *pFreeVocDeviceID, SEARCH_RULE SearchRule, DJ_S8 s8RefModID )
{
	int				i;
	static	int		iLoopStart = 0;
	VOICE_STRUCT	*pOneVoice;
	DJ_S8			s8SearchModID;
	long			lNowMaxFreeNum;

	if ( SearchRule == SEARCH_RULE_SAME_MODULE )			// Search in Same Module
	{
		s8SearchModID = s8RefModID;
	}
	else		// Search in Max free resource module
	{
		s8SearchModID = -1;
		lNowMaxFreeNum = -1;
		for ( i = 0; i < g_iTotalModule; i ++ )
		{
			if ( AllDeviceRes[MapTable_Module[i]].lVocFreeNum > lNowMaxFreeNum )
			{
				s8SearchModID = MapTable_Module[i];
				lNowMaxFreeNum = AllDeviceRes[MapTable_Module[i]].lVocFreeNum;
			}
		}
	}

	for ( i = 0; i < AllDeviceRes[s8SearchModID].lVocNum; i ++ )
	{
		pOneVoice = &AllDeviceRes[s8SearchModID].pVoice[i];
		if ( pOneVoice->State == VOC_FREE )
		{
			*pFreeVocDeviceID = pOneVoice->deviceID;

			// 占用该voice device 
			Change_Voc_State ( &AllDeviceRes[s8SearchModID].pVoice[i], VOC_USED);
			AllDeviceRes[s8SearchModID].lVocFreeNum--;
			g_iTotalVoiceFree --;
			DrawCount_Voc ( s8SearchModID );
			return i;
		}
	}

	return -1;
}

int		FreeOneVoice (  DeviceID_t *pFreeVocDeviceID )
{
	DJ_S8	s8ModID;

	s8ModID = pFreeVocDeviceID->m_s8ModuleID;
	if ( AllDeviceRes[s8ModID].lFlag == 1 )
	{
		Change_Voc_State ( &M_OneVoice(*pFreeVocDeviceID), VOC_FREE);

		AllDeviceRes[s8ModID].lVocFreeNum++;
		g_iTotalVoiceFree ++;
		DrawCount_Voc ( s8ModID );
		return	0;		// OK
	}

	return -1;			// invalid VocDeviceID
}

int		SearchOneFreeConf ( DeviceID_t *pFreeConfDeviceID )
{
	int				i;
	static	int		iLoopStart = 0;
	CONF_STRUCT		*pOneConf;
	DJ_S8			s8SearchModID;
	long			lNowMaxFreeNum;

	// Search in Max free voice resource module
	{
		s8SearchModID = -1;
		lNowMaxFreeNum = -1;
		for ( i = 0; i < g_iTotalModule; i ++ )
		{
			if ( AllDeviceRes[MapTable_Module[i]].lVocFreeNum > lNowMaxFreeNum )
			{
				s8SearchModID = MapTable_Module[i];
				lNowMaxFreeNum = AllDeviceRes[MapTable_Module[i]].lVocFreeNum;
			}
		}
	}

	for ( i = 0; i < AllDeviceRes[s8SearchModID].lConfNum; i ++ )
	{
		pOneConf = &AllDeviceRes[s8SearchModID].pConf[i];
		if ( pOneConf->State == CONF_FREE )
		{
			*pFreeConfDeviceID = pOneConf->deviceID;

			/*
			// 占用该Conf device 
			pOneConf->State = CONF_USED;
			DrawConf_State( pOneConf );

			AllDeviceRes[s8SearchModID].lConfFreeNum--;
			g_iTotalConfFree --;

			DrawCount_Conf ( s8SearchModID );
			*/
			return i;
		}
	}

	return -1;
}

int		FreeOneConf (  DeviceID_t *pFreeConfDeviceID )
{
	DJ_S8	s8ModID;

	s8ModID = pFreeConfDeviceID->m_s8ModuleID;
	if ( AllDeviceRes[s8ModID].lFlag == 1 )
	{
		Change_Conf_State ( &M_OneConf(*pFreeConfDeviceID), CONF_FREE);

		AllDeviceRes[pFreeConfDeviceID->m_s8ModuleID].lConfFreeNum++;
		g_iTotalConfFree ++;

		DrawCount_Conf ( pFreeConfDeviceID->m_s8ModuleID );

		return	0;		// OK
	}

	return -1;			// invalid VocDeviceID
}

void	OccupyOneConf ( CONF_STRUCT *pOneConf )
{
	// 可能占用该Conf device 
	if ( pOneConf->State == CONF_FREE )
	{
		Change_Conf_State ( pOneConf, CONF_USED);

		AllDeviceRes[pOneConf->deviceID.m_s8ModuleID].lConfFreeNum--;
		g_iTotalConfFree --;

		DrawCount_Conf(pOneConf->deviceID.m_s8ModuleID);
	}
}

void	Change_Conf_State ( CONF_STRUCT *pOneConf, CONF_STATE NewState )
{
	pOneConf->State = NewState;

	DrawConf_State ( pOneConf );

	// 检查是否准备开始删除DSP单元
	if ( (AllDeviceRes[pOneConf->deviceID.m_s8ModuleID].RemoveState == DSP_REMOVE_STATE_START)
		&& (NewState == CONF_FREE) )
	{
		pOneConf->State = CONF_WAIT_REMOVE;
	
		DrawConf_State ( pOneConf );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -