/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/modules/rtp_rtcp/source/dtmf_queue.h"

#include <string.h>  //memset

namespace webrtc {
DTMFqueue::DTMFqueue()
    : dtmf_critsect_(CriticalSectionWrapper::CreateCriticalSection()),
      next_empty_index_(0) {
  memset(dtmf_key_, 0, sizeof(dtmf_key_));
  memset(dtmf_length, 0, sizeof(dtmf_length));
  memset(dtmf_level_, 0, sizeof(dtmf_level_));
}

DTMFqueue::~DTMFqueue() { delete dtmf_critsect_; }

int32_t DTMFqueue::AddDTMF(uint8_t key, uint16_t len, uint8_t level) {
  CriticalSectionScoped lock(dtmf_critsect_);

  if (next_empty_index_ >= DTMF_OUTBAND_MAX) {
    return -1;
  }
  int32_t index = next_empty_index_;
  dtmf_key_[index] = key;
  dtmf_length[index] = len;
  dtmf_level_[index] = level;
  next_empty_index_++;
  return 0;
}

int8_t DTMFqueue::NextDTMF(uint8_t* dtmf_key, uint16_t* len, uint8_t* level) {
  CriticalSectionScoped lock(dtmf_critsect_);
  if (next_empty_index_ == 0)
    return -1;

  *dtmf_key = dtmf_key_[0];
  *len = dtmf_length[0];
  *level = dtmf_level_[0];

  memmove(&(dtmf_key_[0]), &(dtmf_key_[1]),
          next_empty_index_ * sizeof(uint8_t));
  memmove(&(dtmf_length[0]), &(dtmf_length[1]),
          next_empty_index_ * sizeof(uint16_t));
  memmove(&(dtmf_level_[0]), &(dtmf_level_[1]),
          next_empty_index_ * sizeof(uint8_t));

  next_empty_index_--;
  return 0;
}

bool DTMFqueue::PendingDTMF() {
  CriticalSectionScoped lock(dtmf_critsect_);
  return next_empty_index_ > 0;
}

void DTMFqueue::ResetDTMF() {
  CriticalSectionScoped lock(dtmf_critsect_);
  next_empty_index_ = 0;
}
}  // namespace webrtc
