Home | History | Annotate | Download | only in base
      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 
     14 namespace media {
     15 
     16 class AudioBus;
     17 class 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.
     25 class 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