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

📄 xms_confdemo_sub.cpp

📁 基于东进Keygoe交换机的会议应用演示程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		CheckRemoveReady ( pOneConf->deviceID.m_s8ModuleID );
	}
}

void	Change_Voc_State ( VOICE_STRUCT *pOneVoice, VOICE_STATE NewState )
{
	pOneVoice->State = NewState;

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

		CheckRemoveReady ( pOneVoice->deviceID.m_s8ModuleID );
	}
}

void	Change_State ( TRUNK_STRUCT *pOneTrunk, TRUNK_STATE NewState )
{
	pOneTrunk->State = NewState;

	DrawMain_State ( pOneTrunk );

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

		DrawMain_State ( pOneTrunk );

		CheckRemoveReady ( pOneTrunk->deviceID.m_s8ModuleID );
	}
}

void	InitTrunkChannel ( TRUNK_STRUCT *pOneTrunk )
{
	Change_State ( pOneTrunk, TRK_FREE );

	pOneTrunk->CallerCode[0]=0;
	pOneTrunk->CalleeCode[0]=0;

	My_InitDtmfBuf ( pOneTrunk );
	DrawMain_DTMF ( pOneTrunk );

	memset ( &pOneTrunk->VocDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
	DrawMain_VocInfo ( pOneTrunk );

	memset ( &pOneTrunk->ConfDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
	DrawMain_ConfInfo ( pOneTrunk );
}

void ResetTrunk ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
	if ( ( pOneTrunk->State == TRK_CONF_CONFING ) || ( pOneTrunk->State == TRK_CONF_KARAOK ) )
	{
		Do_LeaveConf ( pOneTrunk );

		if ( (pOneTrunk->iConfSelect == 2) && (M_OneConf(pOneTrunk->ConfDevID).lListenNum>0) )		// not the last listen member leave
		{
			// do nothing
		}
		else
		{
			FreeOneVoice ( &pOneTrunk->VocDevID );
			memset ( &M_OneVoice(pOneTrunk->VocDevID).UsedDevID,	0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device 
		}

		memset ( &pOneTrunk->VocDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
		DrawMain_VocInfo ( pOneTrunk );
	}

	StopPlayFile ( &pOneTrunk->VocDevID );
	StopRecordFile ( &pOneTrunk->VocDevID );

	// free the used Voice Resource
	if ( pOneTrunk->VocDevID.m_s16DeviceMain != 0 )
	{
		My_DualUnlink ( &pOneTrunk->deviceID, &pOneTrunk->VocDevID );
		FreeOneVoice ( &pOneTrunk->VocDevID );

		memset ( &M_OneVoice(pOneTrunk->VocDevID).UsedDevID,	0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device 
		memset ( &pOneTrunk->VocDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
		DrawMain_VocInfo ( pOneTrunk );
	}

	// free the used Conf Resource
	if ( pOneTrunk->ConfDevID.m_s16DeviceMain != 0 )
	{
		// free the conf device
		memset ( &M_OneConf(pOneTrunk->ConfDevID).UsedDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
		memset ( &pOneTrunk->ConfDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
		DrawMain_ConfInfo ( pOneTrunk );
	}

	InitTrunkChannel ( pOneTrunk );
}

void	InitConfChannel ( CONF_STRUCT *pOneConf )
{
	Change_Conf_State ( pOneConf, CONF_FREE);

	pOneConf->lMemberNum = 0;
	pOneConf->lListenNum = 0;
	memset ( pOneConf->Member, 0,	sizeof(MEMBER_STRUCT)*MAX_MEMBER_PER_CONF_GROUP );

	DrawConf_DetailInfo( pOneConf );
}

void	Do_JoinConf ( TRUNK_STRUCT *pOneTrunk, DeviceID_t *pConfDevID )
{
	char					FileName[256];
	DeviceID_t				FreeVocDeviceID_ForConf;
	int						i;
	CONF_STRUCT				*pOneConf;

	pOneConf = &M_OneConf(*pConfDevID);
	if ( (pOneTrunk->iConfSelect == 2) && (pOneConf->lListenNum>0) )		// alreay have listen member
	{
		for ( i = 0; i <pOneConf->lMemberNum; i ++ ) 
		{
			if ( pOneConf->Member[i].lMode == CONF_MODE_LISTEN ) 
			{
				FreeVocDeviceID_ForConf = pOneConf->Member[i].DevID;
				break;
			}
		}
	}
	else
	{
		if ( SearchOneFreeVoice ( &FreeVocDeviceID_ForConf, SEARCH_RULE_SAME_MODULE, pConfDevID->m_s8ModuleID ) < 0 )
		{
			return;
		}
	}

	{
		// draw the Conf
		DrawConf_State ( &M_OneConf(*pConfDevID) );

		// free 原来的Voc Device
		My_DualUnlink ( &pOneTrunk->deviceID, &pOneTrunk->VocDevID );
		FreeOneVoice ( &pOneTrunk->VocDevID );

		memset ( &M_OneVoice(pOneTrunk->VocDevID).UsedDevID,	0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
		memset ( &pOneTrunk->VocDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
		DrawMain_VocInfo ( pOneTrunk );

		// 记住现在的Voc & Conf Device
		pOneTrunk->VocDevID = FreeVocDeviceID_ForConf;
		M_OneVoice(FreeVocDeviceID_ForConf).UsedDevID = pOneTrunk->deviceID; 
		pOneTrunk->ConfDevID = *pConfDevID;
		M_OneConf(*pConfDevID).UsedDevID = pOneTrunk->deviceID; 

		DrawMain_VocInfo ( pOneTrunk );
		DrawMain_ConfInfo ( pOneTrunk );

		switch ( pOneTrunk->iConfSelect )
		{
		case 1:		// add
			My_DualLink ( &pOneTrunk->deviceID, &pOneTrunk->VocDevID );  
			My_JoinToConf ( pConfDevID, &FreeVocDeviceID_ForConf, CONF_MODE_ADD );

			Change_State ( pOneTrunk, TRK_CONF_CONFING );
			break;

		case 2:		// listen
			XMS_ctsLinkDevice ( g_acsHandle, &pOneTrunk->VocDevID, &pOneTrunk->deviceID, NULL ); 

			My_JoinToConf ( pConfDevID, &FreeVocDeviceID_ForConf, CONF_MODE_LISTEN );
			break;

		case 3:		// Karaok
			My_DualLink ( &pOneTrunk->deviceID, &pOneTrunk->VocDevID );  

			My_JoinToConf ( pConfDevID, &FreeVocDeviceID_ForConf, CONF_MODE_ADD );

			My_JoinToConf ( pConfDevID, &FreeVocDeviceID_ForConf, CONF_MODE_PLAY );
			
			pOneTrunk->u8PlayTag ++;

			strcpy ( FileName, cfg_VocPath );
			strcat ( FileName, "\\ConfMusi.Pcm");
			PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, false );

			sprintf ( FileName, "%s\\ConfRec%03d.pcm", cfg_VocPath, pOneTrunk->iSeqID );
			RecordFile_Conf ( &pOneTrunk->VocDevID, FileName, 0, false, pConfDevID );	// 0 mean no limit for the size
			break;

		case 4:		// speak only
			XMS_ctsLinkDevice ( g_acsHandle, &pOneTrunk->deviceID, &pOneTrunk->VocDevID, NULL ); 

			My_JoinToConf ( pConfDevID, &FreeVocDeviceID_ForConf, CONF_MODE_SPEAKONLY );
			break;
		}
	}
}

void	Do_LeaveConf ( TRUNK_STRUCT *pOneTrunk )
{
	CONF_STRUCT				*pOneConf;

	pOneConf = &M_OneConf(pOneTrunk->ConfDevID);
	switch ( pOneTrunk->iConfSelect )
	{
		case 1:		// add
			My_DualUnlink ( &pOneTrunk->deviceID, &pOneTrunk->VocDevID );  
			My_LeaveFromConf ( &pOneTrunk->ConfDevID, &pOneTrunk->VocDevID, CONF_MODE_ADD );
			break;

		case 2:		// listen
			XMS_ctsUnlinkDevice ( g_acsHandle, &pOneTrunk->VocDevID, &pOneTrunk->deviceID, NULL ); 

			My_LeaveFromConf ( &pOneTrunk->ConfDevID, &pOneTrunk->VocDevID, CONF_MODE_LISTEN );
			break;

		case 3:		// Karaok
			My_DualUnlink ( &pOneTrunk->deviceID, &pOneTrunk->VocDevID );  

			My_LeaveFromConf ( &pOneTrunk->ConfDevID, &pOneTrunk->VocDevID, CONF_MODE_ADD );
			My_LeaveFromConf ( &pOneTrunk->ConfDevID, &pOneTrunk->VocDevID, CONF_MODE_PLAY );
			
			StopPlayFile ( &pOneTrunk->VocDevID );

			StopRecordFile ( &pOneTrunk->VocDevID );
			break;

		case 4:		// speak only
			XMS_ctsUnlinkDevice ( g_acsHandle, &pOneTrunk->deviceID, &pOneTrunk->VocDevID, NULL ); 

			My_LeaveFromConf ( &pOneTrunk->ConfDevID, &pOneTrunk->VocDevID, CONF_MODE_SPEAKONLY );
			break;
	}

	if ( pOneConf->lMemberNum == 0 )
		XMS_ctsClearConf ( g_acsHandle, &pOneConf->deviceID, NULL );
}

// Special code for CAS(SS1)
void	SpecialForCas ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
	DeviceID_t				FreeVocDeviceID;

	if ( pOneTrunk->deviceID.m_s16DeviceSub != XMS_DEVSUB_E1_CAS )
		return;

	if ( pAcsEvt->m_s32EventType == XMS_EVT_CAS_MFC_START )	/* 开始接收MFC,需要一个Voc设备*/
	{
		if ( SearchOneFreeVoice ( &FreeVocDeviceID, SEARCH_RULE_MAX_FREE_FIST, 0 ) >= 0 )
		{
			pOneTrunk->VocDevID = FreeVocDeviceID;
			M_OneVoice(FreeVocDeviceID).UsedDevID = pOneTrunk->deviceID; 
			DrawMain_VocInfo ( pOneTrunk );

			g_Param_CAS.m_VocDevID = FreeVocDeviceID;
			XMS_ctsSetParam ( g_acsHandle, &pOneTrunk->deviceID, 
				CAS_PARAM_UNIPARAM, sizeof(CmdParamData_CAS_t), (DJ_Void *)&g_Param_CAS );
		}
	}

	if ( pAcsEvt->m_s32EventType == XMS_EVT_CAS_MFC_END )	/* 接收MFC完毕,释放Voc设备*/
	{
		FreeOneVoice (  &pOneTrunk->VocDevID );

		memset ( &M_OneVoice(pOneTrunk->VocDevID).UsedDevID,	0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device 
		memset ( &pOneTrunk->VocDevID, 0, sizeof(DeviceID_t) );		// 0表示还没有分配 Device
		DrawMain_VocInfo ( pOneTrunk );
	}
}
// end of code for CAS(SS1)

void TrunkWork ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
	Acs_CallControl_Data *	pCallControl = NULL;
	DeviceID_t				FreeVocDeviceID;
	DeviceID_t				FreeConfDeviceID;
	char					FileName[256];
	char					TmpDtmf;
	int						iConfNo;

	if ( pAcsEvt->m_s32EventType == XMS_EVT_CLEARCALL )	/*拆线事件*/
	{
		if ( (pOneTrunk->State != TRK_FREE) && (pOneTrunk->State != TRK_WAIT_REMOVE) )
		{
			ResetTrunk ( pOneTrunk, pAcsEvt );
			return ; 
		}
	}

	switch(pOneTrunk->State)
	{
	case TRK_FREE:
		// Special code for CAS(SS1)
		SpecialForCas(pOneTrunk,pAcsEvt);

		if ( pAcsEvt->m_s32EventType == XMS_EVT_CALLIN )	/*呼入事件*/
		{
			pCallControl = (Acs_CallControl_Data *)FetchEventData(pAcsEvt);

			XMS_ctsAlertCall ( g_acsHandle, &pOneTrunk->deviceID, NULL );

			XMS_ctsAnswerCallIn ( g_acsHandle, &pOneTrunk->deviceID, NULL );

			sprintf ( pOneTrunk->CalleeCode, pCallControl->m_s8CalledNum );
			sprintf ( pOneTrunk->CallerCode, pCallControl->m_s8CallingNum );
			DrawMain_CallInfo( pOneTrunk );
			
			Change_State ( pOneTrunk, TRK_WAIT_ANSWERCALL );
		}
		break;

	case TRK_WAIT_ANSWERCALL:
		// Special code for CAS(SS1)
		SpecialForCas(pOneTrunk,pAcsEvt);

		if ( pAcsEvt->m_s32EventType == XMS_EVT_ANSWERCALL )	/*应答呼入完成事件*/
		{
			pCallControl = (Acs_CallControl_Data *)FetchEventData(pAcsEvt);

			if ( SearchOneFreeVoice ( &FreeVocDeviceID, SEARCH_RULE_MAX_FREE_FIST, 0 ) >= 0 )
			{
				pOneTrunk->u8PlayTag = 16;

				pOneTrunk->VocDevID = FreeVocDeviceID;
				M_OneVoice(FreeVocDeviceID).UsedDevID = pOneTrunk->deviceID; 

				DrawMain_VocInfo ( pOneTrunk );

				My_DualLink ( &pOneTrunk->deviceID, &FreeVocDeviceID );
				
				Change_State ( pOneTrunk, TRK_WAIT_LINKOK );
			}
		}
		break;

	case TRK_WAIT_LINKOK:
		if ( pAcsEvt->m_s32EventType == XMS_EVT_LINKDEVICE )	/*LinkDevice完成*/
		{
			pOneTrunk->u8PlayTag ++;

			strcpy ( FileName, cfg_VocPath );
			strcat ( FileName, "\\Conf.001");
			PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
			strcpy ( FileName, cfg_VocPath );
			strcat ( FileName, "\\Conf.002");
			PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

			Change_State ( pOneTrunk, TRK_SELECT );
		}
		break;

	case TRK_SELECT:
		// if play end
			// do nothing

		TmpDtmf = My_GetDtmfCode ( pAcsEvt );
		if ( TmpDtmf == -1 )								/*DTMF按键*/
			break;

		My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
		DrawMain_DTMF ( pOneTrunk );

		StopPlayFile ( &pOneTrunk->VocDevID );

		if ( (TmpDtmf >= '1') && (TmpDtmf <= '4') )	 // "按1加入会议" "按2监听会议" "按3卡拉OK" "按4 Speak Only"
		{
			My_InitDtmfBuf ( pOneTrunk );

			pOneTrunk->u8PlayTag ++;

			strcpy ( FileName, cfg_VocPath );
			strcat ( FileName, "\\Conf.003");
			PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

			pOneTrunk->iConfSelect = TmpDtmf - '1' + 1;
			Change_State ( pOneTrunk, TRK_CONF_INPUTGROUP );
		}	
		
		if ( TmpDtmf == '3' )		// Karaok
		{
			if ( SearchOneFreeConf ( &FreeConfDeviceID ) >= 0 )
			{
				Do_JoinConf ( pOneTrunk, &FreeConfDeviceID );
				Change_State ( pOneTrunk, TRK_CONF_KARAOK );
			}
			else
			{
				Change_State ( pOneTrunk, TRK_CONF_ERROR );
			}
		}
		break;

	case TRK_CONF_INPUTGROUP:
		// if play end
			// do nothing

		TmpDtmf = My_GetDtmfCode ( pAcsEvt );
		if ( TmpDtmf == -1 )								/*DTMF按键*/
			break;

		My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
		DrawMain_DTMF ( pOneTrunk );

		StopPlayFile ( &pOneTrunk->VocDevID );

		if ( pOneTrunk->DtmfCount >= 3 )
		{
			sscanf ( pOneTrunk->DtmfBuf, "%d", &iConfNo ); 
			if ( (iConfNo < 0) || (iConfNo >= g_iTotalConf) )
			{
				Change_State ( pOneTrunk, TRK_CONF_ERROR );
				break;
			}

			if ( (M_OneConf(MapTable_Conf[iConfNo]).State != CONF_FREE)
				&& (M_OneConf(MapTable_Conf[iConfNo]).State != CONF_USED) )
			{
				Change_State ( pOneTrunk, TRK_CONF_ERROR );
				break;
			}

			FreeConfDeviceID = M_OneConf(MapTable_Conf[iConfNo]).deviceID;

			Do_JoinConf ( pOneTrunk, &FreeConfDeviceID );

			Change_State ( pOneTrunk, TRK_CONF_CONFING );
		}
		break;

	case TRK_CONF_CONFING:
		break;

	case TRK_CONF_KARAOK:
		//
		TmpDtmf = My_GetDtmfCode ( pAcsEvt );
		if ( TmpDtmf != -1 )								/*DTMF按键*/
		{
			My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
			DrawMain_DTMF ( pOneTrunk );

			StopPlayFile ( &pOneTrunk->VocDevID );
			StopRecordFile ( &pOneTrunk->VocDevID );
		}

		if ( CheckRecordEnd ( pOneTrunk, pAcsEvt ) )
		{
			Do_LeaveConf ( pOneTrunk );
			FreeOneVoice ( &pOneTrunk->VocDevID );

			// play back 
			if ( SearchOneFreeVoice ( &FreeVocDeviceID, SEARCH_RULE_MAX_FREE_FIST, 0 ) >= 0 )
			{
				pOneTrunk->u8PlayTag ++;

				pOneTrunk->VocDevID = FreeVocDeviceID;
				M_OneVoice(FreeVocDeviceID).UsedDevID = pOneTrunk->deviceID; 

				DrawMain_VocInfo ( pOneTrunk );

				My_DualLink ( &pOneTrunk->deviceID, &FreeVocDeviceID );
				
				sprintf ( FileName, "%s\\ConfRec%03d.pcm", cfg_VocPath, pOneTrunk->iSeqID );
				PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, false );
			}

			Change_State ( pOneTrunk, TRK_CONF_PLAYBACK );
		}
		break;

	case TRK_CONF_PLAYBACK:
		if ( CheckPlayEnd ( pOneTrunk, pAcsEvt ) )
		{
			strcpy ( FileName, cfg_VocPath );
			strcat ( FileName, "\\Conf.001");
			PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
			strcpy ( FileName, cfg_VocPath );
			strcat ( FileName, "\\Conf.002");
			PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );

			Change_State ( pOneTrunk, TRK_SELECT );
		}
		break;

	case TRK_CONF_ERROR:
		break;

	}
}

⌨️ 快捷键说明

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