xref: /aosp_15_r20/external/webrtc/common_audio/channel_buffer.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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