chromium/chromecast/media/audio/cast_audio_bus.h

// Copyright 2020 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_CAST_AUDIO_BUS_H_
#define CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_BUS_H_

#include <memory>
#include <vector>

namespace chromecast {
namespace media {

// This class is a simplified version of ::media::AudioBus without any
// dependency on //media.
class CastAudioBus {
 public:
  // Creates a new CastAudioBus and allocates |channels| of length |frames|.
  static std::unique_ptr<CastAudioBus> Create(int channels, int frames);

  // Returns a raw pointer to the requested channel.
  float* channel(int channel) { return channel_data_[channel]; }
  const float* channel(int channel) const { return channel_data_[channel]; }

  // Returns the number of channels.
  int channels() const { return static_cast<int>(channel_data_.size()); }
  // Returns the number of frames.
  int frames() const { return frames_; }

  // Helper method for zeroing out all channels of audio data.
  void Zero();

  ~CastAudioBus();

 private:
  CastAudioBus(int channels, int frames);

  // Contiguous block of channel memory.
  std::unique_ptr<float[]> data_;

  // One float pointer per channel pointing to a contiguous block of memory for
  // that channel.
  std::vector<float*> channel_data_;
  int frames_;
};

}  // namespace media
}  // namespace chromecast

#endif  // CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_BUS_H_