#ifndef MEDIA_AUDIO_AUDIO_OUTPUT_RESAMPLER_H_
#define MEDIA_AUDIO_AUDIO_OUTPUT_RESAMPLER_H_
#include "base/containers/flat_map.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "media/audio/audio_debug_recording_helper.h"
#include "media/audio/audio_io.h"
#include "media/audio/audio_output_dispatcher.h"
#include "media/base/audio_parameters.h"
namespace media {
class AudioManager;
class AudioOutputDispatcherImpl;
class OnMoreDataConverter;
class MEDIA_EXPORT AudioOutputResampler : public AudioOutputDispatcher {
public:
using RegisterDebugRecordingSourceCallback =
base::RepeatingCallback<std::unique_ptr<AudioDebugRecorder>(
const AudioParameters&)>;
AudioOutputResampler(AudioManager* audio_manager,
const AudioParameters& input_params,
const AudioParameters& output_params,
const std::string& output_device_id,
base::TimeDelta close_delay,
const RegisterDebugRecordingSourceCallback&
register_debug_recording_source_callback);
AudioOutputResampler(const AudioOutputResampler&) = delete;
AudioOutputResampler& operator=(const AudioOutputResampler&) = delete;
~AudioOutputResampler() override;
AudioOutputProxy* CreateStreamProxy() override;
bool OpenStream() override;
bool StartStream(AudioOutputStream::AudioSourceCallback* callback,
AudioOutputProxy* stream_proxy) override;
void StopStream(AudioOutputProxy* stream_proxy) override;
void StreamVolumeSet(AudioOutputProxy* stream_proxy, double volume) override;
void CloseStream(AudioOutputProxy* stream_proxy) override;
void FlushStream(AudioOutputProxy* stream_proxy) override;
private:
using CallbackMap =
base::flat_map<AudioOutputProxy*, std::unique_ptr<OnMoreDataConverter>>;
void Reinitialize();
std::unique_ptr<AudioOutputDispatcherImpl> MakeDispatcher(
const std::string& output_device_id,
const AudioParameters& params);
void StopStreamInternal(const CallbackMap::value_type& item);
std::unique_ptr<AudioOutputDispatcherImpl> dispatcher_;
CallbackMap callbacks_;
const base::TimeDelta close_delay_;
const AudioParameters input_params_;
AudioParameters output_params_;
const AudioParameters original_output_params_;
const std::string device_id_;
base::RetainingOneShotTimer reinitialize_timer_;
RegisterDebugRecordingSourceCallback
register_debug_recording_source_callback_;
base::WeakPtrFactory<AudioOutputResampler> weak_factory_{this};
};
}
#endif