/*
 *  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 (!PendingDTMF()) {
    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() { return (next_empty_index_ > 0); }

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