| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- #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));
- }
|