#ifndef SERVICES_AUDIO_MIXING_GRAPH_H_
#define SERVICES_AUDIO_MIXING_GRAPH_H_
#include <memory>
#include "base/functional/callback.h"
#include "base/time/time.h"
#include "media/audio/audio_io.h"
#include "media/base/audio_bus.h"
#include "media/base/audio_converter.h"
#include "media/base/audio_parameters.h"
namespace audio {
class MixingGraph : public media::AudioOutputStream::AudioSourceCallback {
public:
using InputCallback = media::AudioConverter::InputCallback;
using OnMoreDataCallback =
base::RepeatingCallback<void(const media::AudioBus&, base::TimeDelta)>;
using OnErrorCallback = base::RepeatingCallback<void(
media::AudioOutputStream::AudioSourceCallback::ErrorType)>;
using CreateCallback = base::OnceCallback<std::unique_ptr<MixingGraph>(
const media::AudioParameters& output_params,
OnMoreDataCallback on_more_data_cb,
OnErrorCallback on_error_cb)>;
class Input : public InputCallback {
public:
Input() = default;
~Input() override = default;
Input(const Input&) = delete;
Input& operator=(const Input&) = delete;
virtual const media::AudioParameters& GetParams() const = 0;
virtual void SetVolume(double volume) = 0;
virtual void Start(
media::AudioOutputStream::AudioSourceCallback* source_callback) = 0;
virtual void Stop() = 0;
};
static std::unique_ptr<MixingGraph> Create(
const media::AudioParameters& output_params,
OnMoreDataCallback on_more_data_cb,
OnErrorCallback on_error_cb);
MixingGraph() = default;
MixingGraph(const MixingGraph&) = delete;
MixingGraph& operator=(const MixingGraph&) = delete;
virtual std::unique_ptr<Input> CreateInput(
const media::AudioParameters& params) = 0;
protected:
friend class SyncMixingGraphInput;
virtual void AddInput(Input* node) = 0;
virtual void RemoveInput(Input* node) = 0;
};
}
#endif