1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "common_audio/channel_buffer.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <cstdint>
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker #include "common_audio/include/audio_util.h"
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
19*d9f75844SAndroid Build Coastguard Worker
IFChannelBuffer(size_t num_frames,size_t num_channels,size_t num_bands)20*d9f75844SAndroid Build Coastguard Worker IFChannelBuffer::IFChannelBuffer(size_t num_frames,
21*d9f75844SAndroid Build Coastguard Worker size_t num_channels,
22*d9f75844SAndroid Build Coastguard Worker size_t num_bands)
23*d9f75844SAndroid Build Coastguard Worker : ivalid_(true),
24*d9f75844SAndroid Build Coastguard Worker ibuf_(num_frames, num_channels, num_bands),
25*d9f75844SAndroid Build Coastguard Worker fvalid_(true),
26*d9f75844SAndroid Build Coastguard Worker fbuf_(num_frames, num_channels, num_bands) {}
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker IFChannelBuffer::~IFChannelBuffer() = default;
29*d9f75844SAndroid Build Coastguard Worker
ibuf()30*d9f75844SAndroid Build Coastguard Worker ChannelBuffer<int16_t>* IFChannelBuffer::ibuf() {
31*d9f75844SAndroid Build Coastguard Worker RefreshI();
32*d9f75844SAndroid Build Coastguard Worker fvalid_ = false;
33*d9f75844SAndroid Build Coastguard Worker return &ibuf_;
34*d9f75844SAndroid Build Coastguard Worker }
35*d9f75844SAndroid Build Coastguard Worker
fbuf()36*d9f75844SAndroid Build Coastguard Worker ChannelBuffer<float>* IFChannelBuffer::fbuf() {
37*d9f75844SAndroid Build Coastguard Worker RefreshF();
38*d9f75844SAndroid Build Coastguard Worker ivalid_ = false;
39*d9f75844SAndroid Build Coastguard Worker return &fbuf_;
40*d9f75844SAndroid Build Coastguard Worker }
41*d9f75844SAndroid Build Coastguard Worker
ibuf_const() const42*d9f75844SAndroid Build Coastguard Worker const ChannelBuffer<int16_t>* IFChannelBuffer::ibuf_const() const {
43*d9f75844SAndroid Build Coastguard Worker RefreshI();
44*d9f75844SAndroid Build Coastguard Worker return &ibuf_;
45*d9f75844SAndroid Build Coastguard Worker }
46*d9f75844SAndroid Build Coastguard Worker
fbuf_const() const47*d9f75844SAndroid Build Coastguard Worker const ChannelBuffer<float>* IFChannelBuffer::fbuf_const() const {
48*d9f75844SAndroid Build Coastguard Worker RefreshF();
49*d9f75844SAndroid Build Coastguard Worker return &fbuf_;
50*d9f75844SAndroid Build Coastguard Worker }
51*d9f75844SAndroid Build Coastguard Worker
RefreshF() const52*d9f75844SAndroid Build Coastguard Worker void IFChannelBuffer::RefreshF() const {
53*d9f75844SAndroid Build Coastguard Worker if (!fvalid_) {
54*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(ivalid_);
55*d9f75844SAndroid Build Coastguard Worker fbuf_.set_num_channels(ibuf_.num_channels());
56*d9f75844SAndroid Build Coastguard Worker const int16_t* const* int_channels = ibuf_.channels();
57*d9f75844SAndroid Build Coastguard Worker float* const* float_channels = fbuf_.channels();
58*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i < ibuf_.num_channels(); ++i) {
59*d9f75844SAndroid Build Coastguard Worker for (size_t j = 0; j < ibuf_.num_frames(); ++j) {
60*d9f75844SAndroid Build Coastguard Worker float_channels[i][j] = int_channels[i][j];
61*d9f75844SAndroid Build Coastguard Worker }
62*d9f75844SAndroid Build Coastguard Worker }
63*d9f75844SAndroid Build Coastguard Worker fvalid_ = true;
64*d9f75844SAndroid Build Coastguard Worker }
65*d9f75844SAndroid Build Coastguard Worker }
66*d9f75844SAndroid Build Coastguard Worker
RefreshI() const67*d9f75844SAndroid Build Coastguard Worker void IFChannelBuffer::RefreshI() const {
68*d9f75844SAndroid Build Coastguard Worker if (!ivalid_) {
69*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(fvalid_);
70*d9f75844SAndroid Build Coastguard Worker int16_t* const* int_channels = ibuf_.channels();
71*d9f75844SAndroid Build Coastguard Worker ibuf_.set_num_channels(fbuf_.num_channels());
72*d9f75844SAndroid Build Coastguard Worker const float* const* float_channels = fbuf_.channels();
73*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i < fbuf_.num_channels(); ++i) {
74*d9f75844SAndroid Build Coastguard Worker FloatS16ToS16(float_channels[i], ibuf_.num_frames(), int_channels[i]);
75*d9f75844SAndroid Build Coastguard Worker }
76*d9f75844SAndroid Build Coastguard Worker ivalid_ = true;
77*d9f75844SAndroid Build Coastguard Worker }
78*d9f75844SAndroid Build Coastguard Worker }
79*d9f75844SAndroid Build Coastguard Worker
80*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
81