Home | History | Annotate | Download | only in common_audio
      1 /*
      2  *  Copyright (c) 2015 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/common_audio/audio_ring_buffer.h"
     12 
     13 #include "webrtc/base/checks.h"
     14 #include "webrtc/common_audio/ring_buffer.h"
     15 
     16 // This is a simple multi-channel wrapper over the ring_buffer.h C interface.
     17 
     18 namespace webrtc {
     19 
     20 AudioRingBuffer::AudioRingBuffer(size_t channels, size_t max_frames) {
     21   buffers_.reserve(channels);
     22   for (size_t i = 0; i < channels; ++i)
     23     buffers_.push_back(WebRtc_CreateBuffer(max_frames, sizeof(float)));
     24 }
     25 
     26 AudioRingBuffer::~AudioRingBuffer() {
     27   for (auto buf : buffers_)
     28     WebRtc_FreeBuffer(buf);
     29 }
     30 
     31 void AudioRingBuffer::Write(const float* const* data, size_t channels,
     32                             size_t frames) {
     33   RTC_DCHECK_EQ(buffers_.size(), channels);
     34   for (size_t i = 0; i < channels; ++i) {
     35     const size_t written = WebRtc_WriteBuffer(buffers_[i], data[i], frames);
     36     RTC_CHECK_EQ(written, frames);
     37   }
     38 }
     39 
     40 void AudioRingBuffer::Read(float* const* data, size_t channels, size_t frames) {
     41   RTC_DCHECK_EQ(buffers_.size(), channels);
     42   for (size_t i = 0; i < channels; ++i) {
     43     const size_t read =
     44         WebRtc_ReadBuffer(buffers_[i], nullptr, data[i], frames);
     45     RTC_CHECK_EQ(read, frames);
     46   }
     47 }
     48 
     49 size_t AudioRingBuffer::ReadFramesAvailable() const {
     50   // All buffers have the same amount available.
     51   return WebRtc_available_read(buffers_[0]);
     52 }
     53 
     54 size_t AudioRingBuffer::WriteFramesAvailable() const {
     55   // All buffers have the same amount available.
     56   return WebRtc_available_write(buffers_[0]);
     57 }
     58 
     59 void AudioRingBuffer::MoveReadPositionForward(size_t frames) {
     60   for (auto buf : buffers_) {
     61     const size_t moved =
     62         static_cast<size_t>(WebRtc_MoveReadPtr(buf, static_cast<int>(frames)));
     63     RTC_CHECK_EQ(moved, frames);
     64   }
     65 }
     66 
     67 void AudioRingBuffer::MoveReadPositionBackward(size_t frames) {
     68   for (auto buf : buffers_) {
     69     const size_t moved = static_cast<size_t>(
     70         -WebRtc_MoveReadPtr(buf, -static_cast<int>(frames)));
     71     RTC_CHECK_EQ(moved, frames);
     72   }
     73 }
     74 
     75 }  // namespace webrtc
     76