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