📄 xms_demo_sub.cpp
字号:
s16ChID = pOneTrunk->deviceID.m_s16ChannelID;
i = pOneTrunk->iModSeqID;
if ( i < AllDeviceRes[s8ModID].lVocNum )
{
pOneVoice = &AllDeviceRes[s8ModID].pVoice[i];
if ( pOneVoice->State != VOC_WAITOPEN )
{
*pFreeVocDeviceID = pOneVoice->deviceID;
// 占用该voice device
Change_Voc_State ( pOneVoice, VOC_USED);
AllDeviceRes[s8ModID].lVocFreeNum--;
g_iTotalVoiceFree --;
DrawCount_Voc ( s8ModID );
return i;
}
}
return -1;
}
if ( cfg_iVoiceRule == 1 ) // Search in Same Module
{
s8SearchModID = s8ModID;
}
else // Search in Most free resource module
{
s8SearchModID = -1;
lNowMostFreeNum = -1;
for ( i = 0; i < g_iTotalModule; i ++ )
{
if ( AllDeviceRes[MapTable_Module[i]].lVocFreeNum > lNowMostFreeNum )
{
s8SearchModID = MapTable_Module[i];
lNowMostFreeNum = 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 ( pOneVoice, VOC_USED);
AllDeviceRes[s8SearchModID].lVocFreeNum--;
g_iTotalVoiceFree --;
DrawCount_Voc ( s8SearchModID );
return i;
}
}
return -1;
}
int FreeOneFreeVoice ( 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
}
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) ); // -1表示还没有分配Voc Device
DrawMain_VocInfo ( pOneTrunk );
}
void ResetTrunk ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
StopPlayFile ( &pOneTrunk->VocDevID );
// free the used Voice Resource
if ( pOneTrunk->VocDevID.m_s16DeviceMain != 0 )
{
My_DualUnlink ( &pOneTrunk->VocDevID, &pOneTrunk->deviceID );
FreeOneFreeVoice ( &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 );
}
InitTrunkChannel ( pOneTrunk );
}
// 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 ( pOneTrunk, &FreeVocDeviceID ) >= 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设备*/
{
FreeOneFreeVoice ( &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 SetGtD(DeviceID_t* pDevId)
{
//========Set GTG Begin========
CmdParamData_Voice_t cmdVoc;
memset(&cmdVoc,0,sizeof(cmdVoc));
cmdVoc.m_u8GtdCtrlValid = 1 ; //Enable GTD
cmdVoc.m_VocGtdControl.m_u8ChannelEnable = 1;//Enable Gtd channel
cmdVoc.m_VocGtdControl.m_u8DTMFEnable = 1;
cmdVoc.m_VocGtdControl.m_u8MR2FEnable = 1;
cmdVoc.m_VocGtdControl.m_u8MR2BEnable = 1;
cmdVoc.m_VocGtdControl.m_u8GTDEnable = 1;
cmdVoc.m_VocGtdControl.m_u8FSKEnable = 1;
strcpy((char*)&cmdVoc.m_VocGtdControl.m_u8GTDID[0],"GHIJK");
DJ_U16 u16ParamType = VOC_PARAM_UNIPARAM;
DJ_U16 u16ParamSize = sizeof(cmdVoc);
void* p = (void*) &cmdVoc;
int r = XMS_ctsSetParam( g_acsHandle,pDevId,u16ParamType,u16ParamSize,(void*)p);
char szbuffer[1024];
memset(szbuffer,0,sizeof(szbuffer));
sprintf(szbuffer,"Set GTD ret = %d\n",r);
AddMsg ( szbuffer );
//========Set GTG End ========
}
void TrunkWork ( TRUNK_STRUCT *pOneTrunk, Acs_Evt_t *pAcsEvt )
{
Acs_CallControl_Data * pCallControl = NULL;
DeviceID_t FreeVocDeviceID;
char FileName[256];
char TmpDtmf;
if ( pAcsEvt->m_s32EventType == XMS_EVT_CLEARCALL ) /*拆线事件*/
{
if ( (pOneTrunk->State != TRK_FREE) && (pOneTrunk->State != TRK_WAIT_REMOVE) )
{
ResetTrunk ( pOneTrunk, pAcsEvt );
return ;
}
}
if ( pAcsEvt->m_s32EventType == XMS_EVT_RECVIODATA ) /*忙音事件*/
{
Acs_IO_Data *pIOData = NULL;
char *p;
pIOData = (Acs_IO_Data *)FetchEventData(pAcsEvt);
if ( ( pIOData->m_u16IoType == XMS_IO_TYPE_GTG ) //
&& ( pIOData->m_u16IoDataLen > 0 ) )
{
p = (char *)FetchIOData(pAcsEvt);
if ( *p == 'I' || *p == 'J' || *p == 'K' )//忙音
{
XMS_ctsResetDevice(g_acsHandle,&pOneTrunk->deviceID,NULL);
XMS_ctsClearCall(g_acsHandle,&pOneTrunk->deviceID,0,NULL);
ResetTrunk(pOneTrunk,pAcsEvt);
}
}
}
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 ( pOneTrunk, &FreeVocDeviceID ) >= 0 )
{
pOneTrunk->u8PlayTag = 16;
pOneTrunk->VocDevID = FreeVocDeviceID;
M_OneVoice(FreeVocDeviceID).UsedDevID = pOneTrunk->deviceID;
DrawMain_VocInfo ( pOneTrunk );
My_DualLink ( &FreeVocDeviceID, &pOneTrunk->deviceID );
SetGtD(&pOneTrunk->VocDevID);
Change_State ( pOneTrunk, TRK_WAIT_LINKOK );
}
}
break;
case TRK_WAIT_LINKOK:
if ( pAcsEvt->m_s32EventType == XMS_EVT_LINKDEVICE ) /*LinkDevice完成*/
{
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\bank.001");
pOneTrunk->u8PlayTag ++;
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );
Change_State ( pOneTrunk, TRK_WELCOME );
}
break;
case TRK_WELCOME:
if ( CheckPlayEnd ( pOneTrunk, pAcsEvt) ) /*play完成事件*/
{
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\bank.002");
pOneTrunk->u8PlayTag ++;
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );
Change_State ( pOneTrunk, TRK_ACCOUNT );
}
TmpDtmf = My_GetDtmfCode ( pAcsEvt );
if ( TmpDtmf != -1 ) /*DTMF按键*/
{
My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
DrawMain_DTMF ( pOneTrunk );
StopPlayFile ( &pOneTrunk->VocDevID );
Change_State ( pOneTrunk, TRK_ACCOUNT );
}
break;
case TRK_ACCOUNT:
// if play end
// do nothing
TmpDtmf = My_GetDtmfCode ( pAcsEvt );
if ( TmpDtmf != -1 ) /*DTMF按键*/
{
My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
DrawMain_DTMF ( pOneTrunk );
StopPlayFile ( &pOneTrunk->VocDevID );
if ( pOneTrunk->DtmfCount >= 8 )
{
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\bank.003");
pOneTrunk->u8PlayTag ++;
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );
My_InitDtmfBuf ( pOneTrunk );
Change_State ( pOneTrunk, TRK_PASSWORD );
}
}
break;
case TRK_PASSWORD:
// if play end
// do nothing
TmpDtmf = My_GetDtmfCode ( pAcsEvt );
if ( TmpDtmf != -1 ) /*DTMF按键*/
{
My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
DrawMain_DTMF ( pOneTrunk );
StopPlayFile ( &pOneTrunk->VocDevID );
if ( pOneTrunk->DtmfCount >= 6 )
{
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\bank.004");
pOneTrunk->u8PlayTag ++;
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );
My_InitDtmfBuf ( pOneTrunk );
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 );
pOneTrunk->u8PlayTag ++;
strcpy ( FileName, cfg_VocPath );
switch(TmpDtmf)
{
case '1':
{
StopPlayFile ( &pOneTrunk->VocDevID );
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\bank.005");
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 5, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 12, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 8, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 11, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 9, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 10, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 15, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 8, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 16, pOneTrunk->u8PlayTag, true ); // bank.008
Change_State ( pOneTrunk, TRK_PLAYRESULT );
}
break;
case '2':
StopPlayFile ( &pOneTrunk->VocDevID );
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\bank.006");
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 0, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 15, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 4, pOneTrunk->u8PlayTag, true );
PlayIndex ( &pOneTrunk->VocDevID, 8, pOneTrunk->u8PlayTag, true );
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\bank.008");
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
Change_State ( pOneTrunk, TRK_PLAYRESULT );
break;
case '3':
StopPlayFile ( &pOneTrunk->VocDevID );
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\bank.007");
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\D3");
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\D13");
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\D7");
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\D12");
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
strcpy ( FileName, cfg_VocPath );
strcat ( FileName, "\\bank.008");
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag, true );
Change_State ( pOneTrunk, TRK_PLAYRESULT );
break;
case '4':
StopPlayFile ( &pOneTrunk->VocDevID );
sprintf ( FileName, "%s\\DemoRec.%03d", cfg_VocPath, pOneTrunk->iSeqID );
RecordFile ( &pOneTrunk->VocDevID, FileName, 8000L*10, false );
Change_State ( pOneTrunk, TRK_RECORDFILE );
break;
default:
break;
}
break;
case TRK_PLAYRESULT:
case TRK_PLAYRECORD:
if ( CheckPlayEnd ( pOneTrunk, pAcsEvt) ) /*play完成事件*/
{
// 主动挂机
XMS_ctsClearCall ( g_acsHandle, &pOneTrunk->deviceID, 0, NULL );
Change_State ( pOneTrunk, TRK_HANGON );
}
break;
case TRK_RECORDFILE:
//
TmpDtmf = My_GetDtmfCode ( pAcsEvt );
if ( TmpDtmf != -1 ) /*DTMF按键*/
{
My_AddDtmfBuf ( pOneTrunk, TmpDtmf );
DrawMain_DTMF ( pOneTrunk );
StopRecordFile ( &pOneTrunk->VocDevID );
}
if ( CheckRecordEnd ( pOneTrunk, pAcsEvt) ) /*record完成事件*/
{
pOneTrunk->u8PlayTag ++;
sprintf ( FileName, "%s\\DemoRec.%03d", cfg_VocPath, pOneTrunk->iSeqID );
PlayFile ( &pOneTrunk->VocDevID, FileName, pOneTrunk->u8PlayTag );
Change_State ( pOneTrunk, TRK_PLAYRECORD );
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -