📄 xms_confdemo_sub.cpp
字号:
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 + -