#ifndef CHROMECAST_MEDIA_AUDIO_AUDIO_OUTPUT_SERVICE_OUTPUT_STREAM_CONNECTION_H_
#define CHROMECAST_MEDIA_AUDIO_AUDIO_OUTPUT_SERVICE_OUTPUT_STREAM_CONNECTION_H_
#include <cstdint>
#include <memory>
#include "base/memory/scoped_refptr.h"
#include "chromecast/common/mojom/audio_socket.mojom.h"
#include "chromecast/media/audio/audio_output_service/audio_output_service.pb.h"
#include "chromecast/media/audio/audio_output_service/output_connection.h"
#include "chromecast/media/audio/audio_output_service/output_socket.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
namespace net {
class IOBuffer;
}
namespace chromecast {
namespace media {
namespace audio_output_service {
class OutputStreamConnection : public OutputConnection,
public OutputSocket::Delegate {
public:
class Delegate {
public:
virtual void OnBackendInitialized(
const BackendInitializationStatus& status) = 0;
virtual void OnNextBuffer(int64_t media_timestamp_microseconds,
int64_t reference_timestamp_microseconds,
int64_t delay_microseconds,
int64_t delay_timestamp_microseconds) = 0;
protected:
virtual ~Delegate() = default;
};
OutputStreamConnection(
Delegate* delegate,
CmaBackendParams params,
mojo::PendingRemote<mojom::AudioSocketBroker> pending_socket_broker);
OutputStreamConnection(const OutputStreamConnection&) = delete;
OutputStreamConnection& operator=(const OutputStreamConnection&) = delete;
~OutputStreamConnection() override;
void Connect();
void SendAudioBuffer(scoped_refptr<net::IOBuffer> audio_buffer,
int buffer_size_bytes,
int64_t pts);
void StartPlayingFrom(int64_t start_pts);
void StopPlayback();
void SetPlaybackRate(float playback_rate);
void SetVolume(float volume);
void UpdateAudioConfig(const CmaBackendParams& params);
private:
void OnConnected(std::unique_ptr<OutputSocket> socket) override;
void OnConnectionFailed() override;
void OnConnectionError() override;
bool HandleMetadata(const Generic& message) override;
void SendHeartbeat();
Delegate* const delegate_;
CmaBackendParams params_;
std::unique_ptr<OutputSocket> socket_;
base::OneShotTimer heartbeat_timer_;
float volume_ = 1.0f;
float playback_rate_ = 1.0f;
bool sent_eos_ = false;
bool dropping_audio_ = false;
};
}
}
}
#endif