xref: /aosp_15_r20/external/webrtc/modules/audio_coding/neteq/audio_multi_vector.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2012 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_CODING_NETEQ_AUDIO_MULTI_VECTOR_H_
12 #define MODULES_AUDIO_CODING_NETEQ_AUDIO_MULTI_VECTOR_H_
13 
14 #include <stdint.h>
15 #include <string.h>
16 
17 #include <vector>
18 
19 #include "api/array_view.h"
20 #include "modules/audio_coding/neteq/audio_vector.h"
21 
22 namespace webrtc {
23 
24 class AudioMultiVector {
25  public:
26   // Creates an empty AudioMultiVector with `N` audio channels. `N` must be
27   // larger than 0.
28   explicit AudioMultiVector(size_t N);
29 
30   // Creates an AudioMultiVector with `N` audio channels, each channel having
31   // an initial size. `N` must be larger than 0.
32   AudioMultiVector(size_t N, size_t initial_size);
33 
34   virtual ~AudioMultiVector();
35 
36   AudioMultiVector(const AudioMultiVector&) = delete;
37   AudioMultiVector& operator=(const AudioMultiVector&) = delete;
38 
39   // Deletes all values and make the vector empty.
40   virtual void Clear();
41 
42   // Clears the vector and inserts `length` zeros into each channel.
43   virtual void Zeros(size_t length);
44 
45   // Copies all values from this vector to `copy_to`. Any contents in `copy_to`
46   // are deleted. After the operation is done, `copy_to` will be an exact
47   // replica of this object. The source and the destination must have the same
48   // number of channels.
49   virtual void CopyTo(AudioMultiVector* copy_to) const;
50 
51   // Appends the contents of `append_this` to the end of this object. The array
52   // is assumed to be channel-interleaved. The length must be an even multiple
53   // of this object's number of channels. The length of this object is increased
54   // with the length of the array divided by the number of channels.
55   void PushBackInterleaved(rtc::ArrayView<const int16_t> append_this);
56 
57   // Appends the contents of AudioMultiVector `append_this` to this object. The
58   // length of this object is increased with the length of `append_this`.
59   virtual void PushBack(const AudioMultiVector& append_this);
60 
61   // Appends the contents of AudioMultiVector `append_this` to this object,
62   // taken from `index` up until the end of `append_this`. The length of this
63   // object is increased.
64   virtual void PushBackFromIndex(const AudioMultiVector& append_this,
65                                  size_t index);
66 
67   // Removes `length` elements from the beginning of this object, from each
68   // channel.
69   virtual void PopFront(size_t length);
70 
71   // Removes `length` elements from the end of this object, from each
72   // channel.
73   virtual void PopBack(size_t length);
74 
75   // Reads `length` samples from each channel and writes them interleaved to
76   // `destination`. The total number of elements written to `destination` is
77   // returned, i.e., `length` * number of channels. If the AudioMultiVector
78   // contains less than `length` samples per channel, this is reflected in the
79   // return value.
80   virtual size_t ReadInterleaved(size_t length, int16_t* destination) const;
81 
82   // Like ReadInterleaved() above, but reads from `start_index` instead of from
83   // the beginning.
84   virtual size_t ReadInterleavedFromIndex(size_t start_index,
85                                           size_t length,
86                                           int16_t* destination) const;
87 
88   // Like ReadInterleaved() above, but reads from the end instead of from
89   // the beginning.
90   virtual size_t ReadInterleavedFromEnd(size_t length,
91                                         int16_t* destination) const;
92 
93   // Overwrites each channel in this AudioMultiVector with values taken from
94   // `insert_this`. The values are taken from the beginning of `insert_this` and
95   // are inserted starting at `position`. `length` values are written into each
96   // channel. If `length` and `position` are selected such that the new data
97   // extends beyond the end of the current AudioVector, the vector is extended
98   // to accommodate the new data. `length` is limited to the length of
99   // `insert_this`.
100   virtual void OverwriteAt(const AudioMultiVector& insert_this,
101                            size_t length,
102                            size_t position);
103 
104   // Appends `append_this` to the end of the current vector. Lets the two
105   // vectors overlap by `fade_length` samples (per channel), and cross-fade
106   // linearly in this region.
107   virtual void CrossFade(const AudioMultiVector& append_this,
108                          size_t fade_length);
109 
110   // Returns the number of channels.
111   virtual size_t Channels() const;
112 
113   // Returns the number of elements per channel in this AudioMultiVector.
114   virtual size_t Size() const;
115 
116   // Verify that each channel can hold at least `required_size` elements. If
117   // not, extend accordingly.
118   virtual void AssertSize(size_t required_size);
119 
120   virtual bool Empty() const;
121 
122   // Copies the data between two channels in the AudioMultiVector. The method
123   // does not add any new channel. Thus, `from_channel` and `to_channel` must
124   // both be valid channel numbers.
125   virtual void CopyChannel(size_t from_channel, size_t to_channel);
126 
127   // Accesses and modifies a channel (i.e., an AudioVector object) of this
128   // AudioMultiVector.
129   const AudioVector& operator[](size_t index) const;
130   AudioVector& operator[](size_t index);
131 
132  protected:
133   std::vector<AudioVector*> channels_;
134   size_t num_channels_;
135 };
136 
137 }  // namespace webrtc
138 #endif  // MODULES_AUDIO_CODING_NETEQ_AUDIO_MULTI_VECTOR_H_
139