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
15namespace webrtc {
16DTMFqueue::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
24DTMFqueue::~DTMFqueue() {
25  delete dtmf_critsect_;
26}
27
28int32_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
42int8_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
62bool DTMFqueue::PendingDTMF() {
63  CriticalSectionScoped lock(dtmf_critsect_);
64  return next_empty_index_ > 0;
65}
66
67void DTMFqueue::ResetDTMF() {
68  CriticalSectionScoped lock(dtmf_critsect_);
69  next_empty_index_ = 0;
70}
71}  // namespace webrtc
72