#ifndef CHROMECAST_MEDIA_AUDIO_MIXER_SERVICE_LOOPBACK_CONNECTION_H_
#define CHROMECAST_MEDIA_AUDIO_MIXER_SERVICE_LOOPBACK_CONNECTION_H_
#include <cstdint>
#include <memory>
#include "base/memory/scoped_refptr.h"
#include "chromecast/media/audio/mixer_service/loopback_interrupt_reason.h"
#include "chromecast/media/audio/mixer_service/mixer_connection.h"
#include "chromecast/media/audio/mixer_service/mixer_socket.h"
#include "chromecast/public/media/decoder_config.h"
namespace chromecast {
namespace media {
namespace mixer_service {
class Generic;
class LoopbackConnection : public MixerConnection,
public MixerSocket::Delegate {
public:
class Delegate {
public:
virtual void OnLoopbackAudio(int64_t timestamp,
media::SampleFormat sample_format,
int sample_rate,
int num_channels,
uint8_t* data,
int length) = 0;
virtual void OnLoopbackInterrupted(LoopbackInterruptReason reason) = 0;
protected:
virtual ~Delegate() = default;
};
explicit LoopbackConnection(Delegate* delegate);
LoopbackConnection(Delegate* delegate,
std::unique_ptr<MixerSocket> connected_socket_for_test);
LoopbackConnection(const LoopbackConnection&) = delete;
LoopbackConnection& operator=(const LoopbackConnection&) = delete;
~LoopbackConnection() override;
void Connect();
private:
void OnConnected(std::unique_ptr<MixerSocket> socket) override;
void OnConnectionError() override;
bool HandleMetadata(const Generic& message) override;
bool HandleAudioData(char* data, size_t size, int64_t timestamp) override;
Delegate* const delegate_;
std::unique_ptr<MixerSocket> socket_;
media::SampleFormat format_ = kUnknownSampleFormat;
int sample_rate_ = 0;
int num_channels_ = 0;
};
}
}
}
#endif