#include "StdAfx.h" #include "DevSpan.h" #include "SpanChannel.h" CDevSpan::CDevSpan(DEV_RES_NO_TYPE NodeNo, DEV_RES_NO_TYPE BoardNo) : CDevResource(NodeNo, BoardNo), m_MixCap(MIXCAP_NON), m_ChannelCount(0) { } CDevSpan::~CDevSpan(void) { close(); } /***************************************************************** **【函数名称】 __openMix **【函数功能】 打开混音器 **【参数】 **【返回值】 ****************************************************************/ bool CDevSpan::__openMix( MIX_TYPE MixTp ) { if(m_MixCap == MIXCAP_NORMAL) { MIX_PARAM set_mix_param; set_mix_param.ucMixType = MixTp; memset(set_mix_param.ucUnmixTimeSlot, 0xff, sizeof(set_mix_param.ucUnmixTimeSlot)); return ISX_sr_SetMixParm(m_NodeNo, m_BoardNo, BT_TRUNK, &set_mix_param) == 0; } return false; } /***************************************************************** **【函数名称】 __getSpan **【函数功能】 获取指定SPAN **【参数】 **【返回值】 ****************************************************************/ CDevSpan::CSpan* CDevSpan::__getSpan( DEV_RES_NO_TYPE SpanNo, bool NewWhenNull /*= false*/ ) { ASSERT(SpanNo >= 0); if(SpanNo >= 0 && SpanNo < m_SpanList.GetCount()) return m_SpanList[SpanNo]; // 查不到指定SPAN,则新建一个 if(NewWhenNull) { CSpan* pSpan = new CSpan; ASSERT(pSpan != NULL); m_SpanList.Add(pSpan); return pSpan; } else return NULL; } /***************************************************************** **【函数名称】 __freeSpan **【函数功能】 删除指定SPAN **【参数】 **【返回值】 ****************************************************************/ bool CDevSpan::__freeSpan( DEV_RES_NO_TYPE SpanNo ) { if(SpanNo >= 0 && SpanNo < m_SpanList.GetCount()) { CSpan* pSpan = m_SpanList[SpanNo]; pSpan->close(); delete pSpan; m_SpanList.RemoveAt(SpanNo); return true; } else return false; } /***************************************************************** **【函数名称】 __freeSpan **【函数功能】 删除SPAN **【参数】 **【返回值】 ****************************************************************/ void CDevSpan::__freeSpan( void ) { for(int i = 0; i < m_SpanList.GetCount(); ++i) { CSpan* pSpan = m_SpanList[i]; pSpan->close(); delete pSpan; } m_SpanList.RemoveAll(); } /***************************************************************** **【函数名称】 open **【函数功能】 span设备打开函数 **【参数】 **【返回值】 ****************************************************************/ bool CDevSpan::open( DEV_RES_NO_TYPE SpanNo ) { if(m_MixCap == MIXCAP_NON) { SPEC_CAP spec_cap; if(ISX_sr_GetSpecCap(m_NodeNo, m_BoardNo, BT_TRUNK, &spec_cap) == 0) m_MixCap = (MIX_CAP)spec_cap.Span.ucMixCap; if(!__openMix(MIXTYPE_RECORD)) LOGGER(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{DevSpan}: 数字中继板[%d-%d]混音打开失败"), m_NodeNo, m_BoardNo); } CSpan* pSpan = __getSpan(SpanNo, true); ASSERT(pSpan != NULL); if(pSpan->channelCount() > 0) return false; int ChanCount = pSpan->open(m_NodeNo, m_BoardNo, SpanNo); m_ChannelCount += ChanCount; LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{DevSpan}: 数字中继板[%d-%d-%d]成功打开%d条通道"), m_NodeNo, m_BoardNo, SpanNo, ChanCount); return ChanCount == DEVICE_SPAN_CAPACITY; } /***************************************************************** **【函数名称】 close **【函数功能】 span设备关闭函数 **【参数】 **【返回值】 ****************************************************************/ void CDevSpan::close( void ) { __openMix(MIXTYPE_NULL); __freeSpan(); LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{DevSpan}: 数字中继板[%d-%d]通道全部关闭"), m_NodeNo, m_BoardNo); } /***************************************************************** **【函数名称】 close **【函数功能】 span设备关闭函数 **【参数】 **【返回值】 ****************************************************************/ void CDevSpan::close( DEV_RES_NO_TYPE SpanNo ) { if(__freeSpan(SpanNo)) LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{DevSpan}: 数字中继板[%d-%d]SPAN[%d]通道全部关闭"), m_NodeNo, m_BoardNo, SpanNo); else LOGGER(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{DevSpan}: 数字中继板[%d-%d]SPAN[%d]通道关闭失败, 未找到对应资源"), m_NodeNo, m_BoardNo, SpanNo); } /***************************************************************** **【函数名称】 getFreeSpanCh **【函数功能】 获取空闲通道 **【参数】 **【返回值】 ****************************************************************/ CSpanChannel* CDevSpan::getFreeSpanCh( void ) { CSingleLock locker(&m_LockSection); locker.Lock(); // 本操作需锁定 for(int i = 0; i < m_SpanList.GetCount(); ++i) { CSpanChannel* pChannel = m_SpanList[i]->getFreeSpanCh(); if(pChannel != NULL) return pChannel; } return NULL; } /***************************************************************** **【函数名称】 getFreeSpanCh **【函数功能】 获取空闲通道 **【参数】 **【返回值】 ****************************************************************/ CSpanChannel* CDevSpan::getFreeSpanCh( int SpanNo ) { CSingleLock locker(&m_LockSection); locker.Lock(); // 本操作需锁定 CSpan* pSpan = __getSpan(SpanNo); ASSERT(pSpan != NULL); if(pSpan != NULL) return pSpan->getFreeSpanCh(); else return NULL; } /***************************************************************** **【函数名称】 findChan **【函数功能】 获取指定通道 **【参数】 **【返回值】 ****************************************************************/ CSpanChannel* CDevSpan::findChan( DEV_RES_NO_TYPE SpanNo, int ResId ) { CSpan* pSpan = __getSpan(SpanNo); ASSERT(pSpan != NULL); if(pSpan != NULL) return pSpan->findChan(ResId); else return NULL; } /***************************************************************** **【函数名称】 isOk **【函数功能】 判断设备状态 **【参数】 **【返回值】 ****************************************************************/ bool CDevSpan::isOk( void ) const { return (m_state == STATUS_WORKING && (m_ChannelCount == m_SpanList.GetCount() * DEVICE_SPAN_CAPACITY)); }