#ifndef CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_MIXER_H_
#define CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_MIXER_H_
#include <memory>
#include <set>
#include "base/functional/callback.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "media/audio/audio_io.h"
#include "media/base/audio_converter.h"
#include "media/base/audio_parameters.h"
namespace chromecast {
namespace media {
class CastAudioManager;
class CastAudioMixer : public ::media::AudioOutputStream::AudioSourceCallback {
public:
explicit CastAudioMixer(CastAudioManager* audio_manager);
CastAudioMixer(const CastAudioMixer&) = delete;
CastAudioMixer& operator=(const CastAudioMixer&) = delete;
~CastAudioMixer() override;
virtual ::media::AudioOutputStream* MakeStream(
const ::media::AudioParameters& params);
private:
class MixerProxyStream;
int OnMoreData(base::TimeDelta delay,
base::TimeTicks delay_timestamp,
const ::media::AudioGlitchInfo& glitch_info,
::media::AudioBus* dest) override;
void OnError(ErrorType type) override;
bool Register(MixerProxyStream* proxy_stream);
void Unregister(MixerProxyStream* proxy_stream);
void AddInput(::media::AudioConverter::InputCallback* input_callback);
void RemoveInput(::media::AudioConverter::InputCallback* input_callback);
void HandleError(ErrorType type);
CastAudioManager* const audio_manager_;
bool error_;
std::set<MixerProxyStream*> proxy_streams_;
std::unique_ptr<::media::AudioConverter> mixer_;
base::Lock mixer_lock_;
::media::AudioParameters output_params_;
::media::AudioOutputStream* output_stream_;
THREAD_CHECKER(audio_thread_checker_);
};
}
}
#endif