1 /*
2  *  Copyright (c) 2014 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/channel_buffer.h"
12 
13 namespace webrtc {
14 
IFChannelBuffer(size_t num_frames,size_t num_channels,size_t num_bands)15 IFChannelBuffer::IFChannelBuffer(size_t num_frames,
16                                  size_t num_channels,
17                                  size_t num_bands)
18     : ivalid_(true),
19       ibuf_(num_frames, num_channels, num_bands),
20       fvalid_(true),
21       fbuf_(num_frames, num_channels, num_bands) {}
22 
ibuf()23 ChannelBuffer<int16_t>* IFChannelBuffer::ibuf() {
24   RefreshI();
25   fvalid_ = false;
26   return &ibuf_;
27 }
28 
fbuf()29 ChannelBuffer<float>* IFChannelBuffer::fbuf() {
30   RefreshF();
31   ivalid_ = false;
32   return &fbuf_;
33 }
34 
ibuf_const() const35 const ChannelBuffer<int16_t>* IFChannelBuffer::ibuf_const() const {
36   RefreshI();
37   return &ibuf_;
38 }
39 
fbuf_const() const40 const ChannelBuffer<float>* IFChannelBuffer::fbuf_const() const {
41   RefreshF();
42   return &fbuf_;
43 }
44 
RefreshF() const45 void IFChannelBuffer::RefreshF() const {
46   if (!fvalid_) {
47     assert(ivalid_);
48     const int16_t* const* int_channels = ibuf_.channels();
49     float* const* float_channels = fbuf_.channels();
50     for (size_t i = 0; i < ibuf_.num_channels(); ++i) {
51       for (size_t j = 0; j < ibuf_.num_frames(); ++j) {
52         float_channels[i][j] = int_channels[i][j];
53       }
54     }
55     fvalid_ = true;
56   }
57 }
58 
RefreshI() const59 void IFChannelBuffer::RefreshI() const {
60   if (!ivalid_) {
61     assert(fvalid_);
62     int16_t* const* int_channels = ibuf_.channels();
63     const float* const* float_channels = fbuf_.channels();
64     for (size_t i = 0; i < ibuf_.num_channels(); ++i) {
65       FloatS16ToS16(float_channels[i],
66                     ibuf_.num_frames(),
67                     int_channels[i]);
68     }
69     ivalid_ = true;
70   }
71 }
72 
73 }  // namespace webrtc
74