1 /*
2  *  Copyright (c) 2018 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 #ifndef MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_FRAME_VIEW_H_
12 #define MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_FRAME_VIEW_H_
13 
14 #include "api/array_view.h"
15 
16 namespace webrtc {
17 
18 // Class to pass audio data in T** format, where T is a numeric type.
19 template <class T>
20 class AudioFrameView {
21  public:
22   // |num_channels| and |channel_size| describe the T**
23   // |audio_samples|. |audio_samples| is assumed to point to a
24   // two-dimensional |num_channels * channel_size| array of floats.
AudioFrameView(T * const * audio_samples,size_t num_channels,size_t channel_size)25   AudioFrameView(T* const* audio_samples,
26                  size_t num_channels,
27                  size_t channel_size)
28       : audio_samples_(audio_samples),
29         num_channels_(num_channels),
30         channel_size_(channel_size) {}
31 
32   // Implicit cast to allow converting Frame<float> to
33   // Frame<const float>.
34   template <class U>
AudioFrameView(AudioFrameView<U> other)35   AudioFrameView(AudioFrameView<U> other)
36       : audio_samples_(other.data()),
37         num_channels_(other.num_channels()),
38         channel_size_(other.samples_per_channel()) {}
39 
40   AudioFrameView() = delete;
41 
num_channels()42   size_t num_channels() const { return num_channels_; }
43 
samples_per_channel()44   size_t samples_per_channel() const { return channel_size_; }
45 
channel(size_t idx)46   rtc::ArrayView<T> channel(size_t idx) {
47     RTC_DCHECK_LE(0, idx);
48     RTC_DCHECK_LE(idx, num_channels_);
49     return rtc::ArrayView<T>(audio_samples_[idx], channel_size_);
50   }
51 
channel(size_t idx)52   rtc::ArrayView<const T> channel(size_t idx) const {
53     RTC_DCHECK_LE(0, idx);
54     RTC_DCHECK_LE(idx, num_channels_);
55     return rtc::ArrayView<const T>(audio_samples_[idx], channel_size_);
56   }
57 
data()58   T* const* data() { return audio_samples_; }
59 
60  private:
61   T* const* audio_samples_;
62   size_t num_channels_;
63   size_t channel_size_;
64 };
65 }  // namespace webrtc
66 
67 #endif  // MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_FRAME_VIEW_H_
68