Home | History | Annotate | Download | only in voice_engine
      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