// Copyright 2017 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 MEDIA_MOJO_SERVICES_MOJO_AUDIO_OUTPUT_STREAM_PROVIDER_H_ #define MEDIA_MOJO_SERVICES_MOJO_AUDIO_OUTPUT_STREAM_PROVIDER_H_ #include #include #include "base/sequence_checker.h" #include "media/audio/audio_output_delegate.h" #include "media/mojo/mojom/audio_output_stream.mojom.h" #include "media/mojo/services/media_mojo_export.h" #include "media/mojo/services/mojo_audio_output_stream.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" namespace media { // Provides a single AudioOutput, given the audio parameters to use. class MEDIA_MOJO_EXPORT MojoAudioOutputStreamProvider : public mojom::AudioOutputStreamProvider { public: using CreateDelegateCallback = base::OnceCallback( const AudioParameters& params, mojo::PendingRemote, AudioOutputDelegate::EventHandler*)>; using DeleterCallback = base::OnceCallback; // |create_delegate_callback| is used to obtain an AudioOutputDelegate for the // AudioOutput when it's initialized and |deleter_callback| is called when // this class should be removed (stream ended/error). |deleter_callback| is // required to destroy |this| synchronously. MojoAudioOutputStreamProvider( mojo::PendingReceiver pending_receiver, CreateDelegateCallback create_delegate_callback, DeleterCallback deleter_callback, std::unique_ptr observer); MojoAudioOutputStreamProvider(const MojoAudioOutputStreamProvider&) = delete; MojoAudioOutputStreamProvider& operator=( const MojoAudioOutputStreamProvider&) = delete; ~MojoAudioOutputStreamProvider() override; private: // mojom::AudioOutputStreamProvider implementation. void Acquire(const AudioParameters& params, mojo::PendingRemote provider_client) override; // Called when |audio_output_| had an error. void CleanUp(bool had_error); // Closes mojo connections, reports a bad message, and self-destructs. void BadMessage(const std::string& error); SEQUENCE_CHECKER(sequence_checker_); mojo::Receiver receiver_; CreateDelegateCallback create_delegate_callback_; DeleterCallback deleter_callback_; std::unique_ptr observer_; mojo::Receiver observer_receiver_; absl::optional audio_output_; mojo::Remote provider_client_; }; } // namespace media #endif // MEDIA_MOJO_SERVICES_MOJO_AUDIO_OUTPUT_STREAM_PROVIDER_H_