// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_AUDIO_AUDIO_NODE_INPUT_H_
#define COBALT_AUDIO_AUDIO_NODE_INPUT_H_

#include <set>
#include <vector>

#include "base/memory/ref_counted.h"
#include "cobalt/audio/audio_buffer.h"
#include "cobalt/media/base/audio_bus.h"

namespace cobalt {
namespace audio {

class AudioNode;
class AudioNodeOutput;

// This represents the input feeding into the AudioNode.
// It may be connected to one or more AudioNodeOutputs.
// A connection to the input means connecting an output of an AudioNode
// (AudioNodeOutput) to an input of an AudioNode (AudioNodeInput).
// Each AudioNodeInput has a specific number of channels at any given time. This
// number can change depending on the connection(s) made to the input. If the
// input has no connections, then it has one channel which is silent.
class AudioNodeInput : public base::RefCountedThreadSafe<AudioNodeInput> {
  typedef media::AudioBus AudioBus;

 public:
  explicit AudioNodeInput(AudioNode* owner_node) : owner_node_(owner_node) {}
  ~AudioNodeInput();

  void Connect(AudioNodeOutput* output);
  void Disconnect(AudioNodeOutput* output);

  void DisconnectAll();

  // For each input, an AudioNode performs a mixing of all connections to that
  // input. FillAudioBus() performs that action. In the case of multiple
  // connections, it sums the result into |audio_bus|.
  void FillAudioBus(AudioBus* audio_bus, bool* silence, bool* all_finished);

 private:
  AudioNode* const owner_node_;
  std::set<AudioNodeOutput*> outputs_;
};

}  // namespace audio
}  // namespace cobalt

#endif  // COBALT_AUDIO_AUDIO_NODE_INPUT_H_
