1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef MEDIA_BASE_CHANNEL_MIXER_H_ 6#define MEDIA_BASE_CHANNEL_MIXER_H_ 7 8#include <vector> 9 10#include "base/basictypes.h" 11#include "media/base/channel_layout.h" 12#include "media/base/media_export.h" 13 14namespace media { 15 16class AudioBus; 17class AudioParameters; 18 19// ChannelMixer is for converting audio between channel layouts. The conversion 20// matrix is built upon construction and used during each Transform() call. The 21// algorithm works by generating a conversion matrix mapping each output channel 22// to list of input channels. The transform renders all of the output channels, 23// with each output channel rendered according to a weighted sum of the relevant 24// input channels as defined in the matrix. 25class MEDIA_EXPORT ChannelMixer { 26 public: 27 ChannelMixer(ChannelLayout input_layout, ChannelLayout output_layout); 28 ChannelMixer(const AudioParameters& input, const AudioParameters& output); 29 ~ChannelMixer(); 30 31 // Transforms all channels from |input| into |output| channels. 32 void Transform(const AudioBus* input, AudioBus* output); 33 34 private: 35 void Initialize(ChannelLayout input_layout, int input_channels, 36 ChannelLayout output_layout, int output_channels); 37 38 // 2D matrix of output channels to input channels. 39 std::vector< std::vector<float> > matrix_; 40 41 // Optimization case for when we can simply remap the input channels to output 42 // channels and don't need to do a multiply-accumulate loop over |matrix_|. 43 bool remapping_; 44 45 DISALLOW_COPY_AND_ASSIGN(ChannelMixer); 46}; 47 48} // namespace media 49 50#endif // MEDIA_BASE_CHANNEL_MIXER_H_ 51