/* * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "webrtc/system_wrappers/interface/trace.h" #include "webrtc/voice_engine/dtmf_inband_queue.h" namespace webrtc { DtmfInbandQueue::DtmfInbandQueue(int32_t id): _id(id), _DtmfCritsect(*CriticalSectionWrapper::CreateCriticalSection()), _nextEmptyIndex(0) { memset(_DtmfKey,0, sizeof(_DtmfKey)); memset(_DtmfLen,0, sizeof(_DtmfLen)); memset(_DtmfLevel,0, sizeof(_DtmfLevel)); } DtmfInbandQueue::~DtmfInbandQueue() { delete &_DtmfCritsect; } int DtmfInbandQueue::AddDtmf(uint8_t key, uint16_t len, uint8_t level) { CriticalSectionScoped lock(&_DtmfCritsect); if (_nextEmptyIndex >= kDtmfInbandMax) { WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_id,-1), "DtmfInbandQueue::AddDtmf() unable to add Dtmf tone"); return -1; } int32_t index = _nextEmptyIndex; _DtmfKey[index] = key; _DtmfLen[index] = len; _DtmfLevel[index] = level; _nextEmptyIndex++; return 0; } int8_t DtmfInbandQueue::NextDtmf(uint16_t* len, uint8_t* level) { CriticalSectionScoped lock(&_DtmfCritsect); if(!PendingDtmf()) { return -1; } int8_t nextDtmf = _DtmfKey[0]; *len=_DtmfLen[0]; *level=_DtmfLevel[0]; memmove(&(_DtmfKey[0]), &(_DtmfKey[1]), _nextEmptyIndex*sizeof(uint8_t)); memmove(&(_DtmfLen[0]), &(_DtmfLen[1]), _nextEmptyIndex*sizeof(uint16_t)); memmove(&(_DtmfLevel[0]), &(_DtmfLevel[1]), _nextEmptyIndex*sizeof(uint8_t)); _nextEmptyIndex--; return nextDtmf; } bool DtmfInbandQueue::PendingDtmf() { CriticalSectionScoped lock(&_DtmfCritsect); return _nextEmptyIndex > 0; } void DtmfInbandQueue::ResetDtmf() { CriticalSectionScoped lock(&_DtmfCritsect); _nextEmptyIndex = 0; } } // namespace webrtc