1 /*
2  *  Copyright (c) 2011 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/modules/rtp_rtcp/source/dtmf_queue.h"
12 
13 #include <string.h>
14 
15 namespace webrtc {
DTMFqueue()16 DTMFqueue::DTMFqueue()
17     : dtmf_critsect_(CriticalSectionWrapper::CreateCriticalSection()),
18       next_empty_index_(0) {
19   memset(dtmf_key_, 0, sizeof(dtmf_key_));
20   memset(dtmf_length, 0, sizeof(dtmf_length));
21   memset(dtmf_level_, 0, sizeof(dtmf_level_));
22 }
23 
~DTMFqueue()24 DTMFqueue::~DTMFqueue() {
25   delete dtmf_critsect_;
26 }
27 
AddDTMF(uint8_t key,uint16_t len,uint8_t level)28 int32_t DTMFqueue::AddDTMF(uint8_t key, uint16_t len, uint8_t level) {
29   CriticalSectionScoped lock(dtmf_critsect_);
30 
31   if (next_empty_index_ >= DTMF_OUTBAND_MAX) {
32     return -1;
33   }
34   int32_t index = next_empty_index_;
35   dtmf_key_[index] = key;
36   dtmf_length[index] = len;
37   dtmf_level_[index] = level;
38   next_empty_index_++;
39   return 0;
40 }
41 
NextDTMF(uint8_t * dtmf_key,uint16_t * len,uint8_t * level)42 int8_t DTMFqueue::NextDTMF(uint8_t* dtmf_key, uint16_t* len, uint8_t* level) {
43   CriticalSectionScoped lock(dtmf_critsect_);
44   if (next_empty_index_ == 0)
45     return -1;
46 
47   *dtmf_key = dtmf_key_[0];
48   *len = dtmf_length[0];
49   *level = dtmf_level_[0];
50 
51   memmove(&(dtmf_key_[0]), &(dtmf_key_[1]),
52           next_empty_index_ * sizeof(uint8_t));
53   memmove(&(dtmf_length[0]), &(dtmf_length[1]),
54           next_empty_index_ * sizeof(uint16_t));
55   memmove(&(dtmf_level_[0]), &(dtmf_level_[1]),
56           next_empty_index_ * sizeof(uint8_t));
57 
58   next_empty_index_--;
59   return 0;
60 }
61 
PendingDTMF()62 bool DTMFqueue::PendingDTMF() {
63   CriticalSectionScoped lock(dtmf_critsect_);
64   return next_empty_index_ > 0;
65 }
66 
ResetDTMF()67 void DTMFqueue::ResetDTMF() {
68   CriticalSectionScoped lock(dtmf_critsect_);
69   next_empty_index_ = 0;
70 }
71 }  // namespace webrtc
72