1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/system_wrappers/include/trace.h" 12 #include "webrtc/voice_engine/dtmf_inband_queue.h" 13 14 namespace webrtc { 15 16 DtmfInbandQueue::DtmfInbandQueue(int32_t id): 17 _id(id), 18 _DtmfCritsect(*CriticalSectionWrapper::CreateCriticalSection()), 19 _nextEmptyIndex(0) 20 { 21 memset(_DtmfKey,0, sizeof(_DtmfKey)); 22 memset(_DtmfLen,0, sizeof(_DtmfLen)); 23 memset(_DtmfLevel,0, sizeof(_DtmfLevel)); 24 } 25 26 DtmfInbandQueue::~DtmfInbandQueue() 27 { 28 delete &_DtmfCritsect; 29 } 30 31 int 32 DtmfInbandQueue::AddDtmf(uint8_t key, uint16_t len, uint8_t level) 33 { 34 CriticalSectionScoped lock(&_DtmfCritsect); 35 36 if (_nextEmptyIndex >= kDtmfInbandMax) 37 { 38 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_id,-1), 39 "DtmfInbandQueue::AddDtmf() unable to add Dtmf tone"); 40 return -1; 41 } 42 int32_t index = _nextEmptyIndex; 43 _DtmfKey[index] = key; 44 _DtmfLen[index] = len; 45 _DtmfLevel[index] = level; 46 _nextEmptyIndex++; 47 return 0; 48 } 49 50 int8_t 51 DtmfInbandQueue::NextDtmf(uint16_t* len, uint8_t* level) 52 { 53 CriticalSectionScoped lock(&_DtmfCritsect); 54 55 if(!PendingDtmf()) 56 { 57 return -1; 58 } 59 int8_t nextDtmf = _DtmfKey[0]; 60 *len=_DtmfLen[0]; 61 *level=_DtmfLevel[0]; 62 63 memmove(&(_DtmfKey[0]), &(_DtmfKey[1]), 64 _nextEmptyIndex*sizeof(uint8_t)); 65 memmove(&(_DtmfLen[0]), &(_DtmfLen[1]), 66 _nextEmptyIndex*sizeof(uint16_t)); 67 memmove(&(_DtmfLevel[0]), &(_DtmfLevel[1]), 68 _nextEmptyIndex*sizeof(uint8_t)); 69 70 _nextEmptyIndex--; 71 return nextDtmf; 72 } 73 74 bool 75 DtmfInbandQueue::PendingDtmf() 76 { 77 CriticalSectionScoped lock(&_DtmfCritsect); 78 return _nextEmptyIndex > 0; 79 } 80 81 void 82 DtmfInbandQueue::ResetDtmf() 83 { 84 CriticalSectionScoped lock(&_DtmfCritsect); 85 _nextEmptyIndex = 0; 86 } 87 88 } // namespace webrtc 89