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