#ifndef MEDIA_AUDIO_FUCHSIA_AUDIO_OUTPUT_STREAM_FUCHSIA_H_
#define MEDIA_AUDIO_FUCHSIA_AUDIO_OUTPUT_STREAM_FUCHSIA_H_
#include <fuchsia/media/cpp/fidl.h>
#include <optional>
#include "base/memory/raw_ptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "media/audio/audio_io.h"
#include "media/base/audio_parameters.h"
namespace media {
class AudioManagerFuchsia;
class AudioOutputStreamFuchsia : public AudioOutputStream {
public:
AudioOutputStreamFuchsia(AudioManagerFuchsia* manager,
const AudioParameters& parameters);
AudioOutputStreamFuchsia(const AudioOutputStreamFuchsia&) = delete;
AudioOutputStreamFuchsia& operator=(const AudioOutputStreamFuchsia&) = delete;
bool Open() override;
void Start(AudioSourceCallback* callback) override;
void Stop() override;
void Flush() override;
void SetVolume(double volume) override;
void GetVolume(double* volume) override;
void Close() override;
private:
~AudioOutputStreamFuchsia() override;
bool is_started() { return callback_ != nullptr; }
size_t GetMinBufferSize();
bool InitializePayloadBuffer();
base::TimeTicks GetCurrentStreamTime();
void OnMinLeadTimeChanged(int64_t min_lead_time);
void OnRendererError(zx_status_t status);
void ReportError();
void OnPauseComplete(int64_t reference_time, int64_t media_time);
void PumpSamples();
void SchedulePumpSamples();
raw_ptr<AudioManagerFuchsia> manager_;
AudioParameters parameters_;
fuchsia::media::AudioRendererPtr audio_renderer_;
std::unique_ptr<AudioBus> audio_bus_;
base::WritableSharedMemoryMapping payload_buffer_;
size_t payload_buffer_pos_ = 0;
raw_ptr<AudioSourceCallback> callback_ = nullptr;
double volume_ = 1.0;
bool pause_pending_ = false;
base::TimeTicks reference_time_;
int64_t stream_position_samples_;
std::optional<base::TimeDelta> min_lead_time_;
base::DeadlineTimer timer_;
};
}
#endif