blob: e9cbb245b5cc40f6b73b65d51e7938dfde11a095 [file] [log] [blame]
henrika2250b052019-07-04 11:27:52 +02001/*
2 * Copyright (c) 2019 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 AUDIO_UTILITY_CHANNEL_MIXING_MATRIX_H_
12#define AUDIO_UTILITY_CHANNEL_MIXING_MATRIX_H_
13
14#include <vector>
15
16#include "api/audio/channel_layout.h"
17
18namespace webrtc {
19
20class ChannelMixingMatrix {
21 public:
22 ChannelMixingMatrix(ChannelLayout input_layout,
23 int input_channels,
24 ChannelLayout output_layout,
25 int output_channels);
26
27 ~ChannelMixingMatrix();
28
29 // Create the transformation matrix of input channels to output channels.
30 // Updates the empty matrix with the transformation, and returns true
31 // if the transformation is just a remapping of channels (no mixing).
32 // The size of |matrix| is |output_channels| x |input_channels|, i.e., the
33 // number of rows equals the number of output channels and the number of
34 // columns corresponds to the number of input channels.
35 // This file is derived from Chromium's media/base/channel_mixing_matrix.h.
36 bool CreateTransformationMatrix(std::vector<std::vector<float>>* matrix);
37
38 private:
39 // Result transformation of input channels to output channels
40 std::vector<std::vector<float>>* matrix_;
41
42 // Input and output channel layout provided during construction.
43 ChannelLayout input_layout_;
44 int input_channels_;
45 ChannelLayout output_layout_;
46 int output_channels_;
47
48 // Helper variable for tracking which inputs are currently unaccounted,
49 // should be empty after construction completes.
50 std::vector<Channels> unaccounted_inputs_;
51
52 // Helper methods for managing unaccounted input channels.
53 void AccountFor(Channels ch);
54 bool IsUnaccounted(Channels ch) const;
55
56 // Helper methods for checking if |ch| exists in either |input_layout_| or
57 // |output_layout_| respectively.
58 bool HasInputChannel(Channels ch) const;
59 bool HasOutputChannel(Channels ch) const;
60
61 // Helper methods for updating |matrix_| with the proper value for
62 // mixing |input_ch| into |output_ch|. MixWithoutAccounting() does not
63 // remove the channel from |unaccounted_inputs_|.
64 void Mix(Channels input_ch, Channels output_ch, float scale);
65 void MixWithoutAccounting(Channels input_ch, Channels output_ch, float scale);
66
67 // Delete the copy constructor and assignment operator.
68 ChannelMixingMatrix(const ChannelMixingMatrix& other) = delete;
69 ChannelMixingMatrix& operator=(const ChannelMixingMatrix& other) = delete;
70};
71
72} // namespace webrtc
73
74#endif // AUDIO_UTILITY_CHANNEL_MIXING_MATRIX_H_