blob: bd896369ebf5b69533840aadc273af0344dbb048 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_AUDIO_PUBLIC_CPP_OUTPUT_DEVICE_H_
#define SERVICES_AUDIO_PUBLIC_CPP_OUTPUT_DEVICE_H_
#include <memory>
#include <string>
#include "media/base/audio_renderer_sink.h"
#include "media/mojo/mojom/audio_output_stream.mojom.h"
#include "media/mojo/mojom/audio_stream_factory.mojom.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace media {
class AudioDeviceThread;
class AudioOutputDeviceThreadCallback;
} // namespace media
namespace audio {
class OutputDevice {
public:
// media::AudioRendererSink::RenderCallback must outlive |this|.
OutputDevice(
mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory,
const media::AudioParameters& params,
media::AudioRendererSink::RenderCallback* callback,
const std::string& device_id);
// Blocking call; see base/threading/thread_restrictions.h.
~OutputDevice();
void Play();
void Pause();
void SetVolume(double volume);
private:
void StreamCreated(media::mojom::ReadWriteAudioDataPipePtr data_pipe);
void OnConnectionError();
void CleanUp(); // Blocking call.
SEQUENCE_CHECKER(sequence_checker_);
std::unique_ptr<media::AudioOutputDeviceThreadCallback> audio_callback_;
std::unique_ptr<media::AudioDeviceThread> audio_thread_;
media::AudioParameters audio_parameters_;
media::AudioRendererSink::RenderCallback* render_callback_;
mojo::Remote<media::mojom::AudioOutputStream> stream_;
mojo::Remote<media::mojom::AudioStreamFactory> stream_factory_;
base::WeakPtrFactory<OutputDevice> weak_factory_{this};
DISALLOW_COPY_AND_ASSIGN(OutputDevice);
};
} // namespace audio
#endif // SERVICES_AUDIO_PUBLIC_CPP_OUTPUT_DEVICE_H_