chromium/chromecast/media/audio/interleaved_channel_mixer.h

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMECAST_MEDIA_AUDIO_INTERLEAVED_CHANNEL_MIXER_H_
#define CHROMECAST_MEDIA_AUDIO_INTERLEAVED_CHANNEL_MIXER_H_

#include <vector>

#include "media/base/channel_layout.h"

namespace chromecast {
namespace media {

// Converts interleaved audio from one channel layout to another.
class InterleavedChannelMixer {
 public:
  InterleavedChannelMixer(::media::ChannelLayout input_layout,
                          int input_channel_count,
                          ::media::ChannelLayout output_layout,
                          int output_channel_count,
                          int max_frames);

  InterleavedChannelMixer(const InterleavedChannelMixer&) = delete;
  InterleavedChannelMixer& operator=(const InterleavedChannelMixer&) = delete;

  ~InterleavedChannelMixer();

  int input_channel_count() const { return input_channel_count_; }
  int output_channel_count() const { return output_channel_count_; }

  // Transforms the |input| audio from the input channel layout to the output
  // channel layout. Returns a pointer to the transformed data. Does not modify
  // the contents of |input|. The returned buffer is valid as long as |input|
  // is valid, or until |this| is destroyed, whichever is shorter.
  float* Transform(const float* input, int num_frames);

 private:
  const ::media::ChannelLayout input_layout_;
  const int input_channel_count_;
  const ::media::ChannelLayout output_layout_;
  const int output_channel_count_;
  const int max_frames_;

  // Transform matrix; stored in row-major order.
  std::vector<float> transform_;

  // Output buffer, if needed.
  std::vector<float> buffer_;
};

}  // namespace media
}  // namespace chromecast

#endif  // CHROMECAST_MEDIA_AUDIO_INTERLEAVED_CHANNEL_MIXER_H_