1 /* 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 18 namespace webrtc { 19 20 class 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 const bool use_voip_channel_mapping_adjustments_; 40 41 // Result transformation of input channels to output channels 42 std::vector<std::vector<float>>* matrix_; 43 44 // Input and output channel layout provided during construction. 45 ChannelLayout input_layout_; 46 int input_channels_; 47 ChannelLayout output_layout_; 48 int output_channels_; 49 50 // Helper variable for tracking which inputs are currently unaccounted, 51 // should be empty after construction completes. 52 std::vector<Channels> unaccounted_inputs_; 53 54 // Helper methods for managing unaccounted input channels. 55 void AccountFor(Channels ch); 56 bool IsUnaccounted(Channels ch) const; 57 58 // Helper methods for checking if |ch| exists in either |input_layout_| or 59 // |output_layout_| respectively. 60 bool HasInputChannel(Channels ch) const; 61 bool HasOutputChannel(Channels ch) const; 62 63 // Helper methods for updating |matrix_| with the proper value for 64 // mixing |input_ch| into |output_ch|. MixWithoutAccounting() does not 65 // remove the channel from |unaccounted_inputs_|. 66 void Mix(Channels input_ch, Channels output_ch, float scale); 67 void MixWithoutAccounting(Channels input_ch, Channels output_ch, float scale); 68 69 // Delete the copy constructor and assignment operator. 70 ChannelMixingMatrix(const ChannelMixingMatrix& other) = delete; 71 ChannelMixingMatrix& operator=(const ChannelMixingMatrix& other) = delete; 72 }; 73 74 } // namespace webrtc 75 76 #endif // AUDIO_UTILITY_CHANNEL_MIXING_MATRIX_H_ 77