| // 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_H_ |
| #define MEDIA_MOJO_SERVICES_MOJO_AUDIO_OUTPUT_STREAM_H_ |
| |
| #include <memory> |
| |
| #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 "mojo/public/cpp/bindings/pending_remote.h" |
| #include "mojo/public/cpp/bindings/receiver.h" |
| |
| namespace media { |
| |
| // This class handles IPC for single audio output stream by delegating method |
| // calls to its AudioOutputDelegate. |
| class MEDIA_MOJO_EXPORT MojoAudioOutputStream |
| : public mojom::AudioOutputStream, |
| public AudioOutputDelegate::EventHandler { |
| public: |
| using StreamCreatedCallback = |
| base::OnceCallback<void(mojo::PendingRemote<mojom::AudioOutputStream>, |
| media::mojom::ReadWriteAudioDataPipePtr)>; |
| using CreateDelegateCallback = |
| base::OnceCallback<std::unique_ptr<AudioOutputDelegate>( |
| AudioOutputDelegate::EventHandler*)>; |
| using DeleterCallback = base::OnceCallback<void(bool)>; |
| |
| // |create_delegate_callback| is used to obtain an AudioOutputDelegate for the |
| // stream in the constructor. |stream_created_callback| is called when the |
| // stream has been initialized. |deleter_callback| is called when this class |
| // should be removed (stream ended/error). Its argument indicates if an error |
| // was encountered (false indicates that the remote end closed the stream). |
| // |deleter_callback| is required to destroy |this| synchronously. |
| MojoAudioOutputStream(CreateDelegateCallback create_delegate_callback, |
| StreamCreatedCallback stream_created_callback, |
| DeleterCallback deleter_callback); |
| |
| MojoAudioOutputStream(const MojoAudioOutputStream&) = delete; |
| MojoAudioOutputStream& operator=(const MojoAudioOutputStream&) = delete; |
| |
| ~MojoAudioOutputStream() override; |
| |
| private: |
| // mojom::AudioOutputStream implementation. |
| void Play() override; |
| void Pause() override; |
| void Flush() override; |
| void SetVolume(double volume) override; |
| |
| // AudioOutputDelegate::EventHandler implementation. |
| void OnStreamCreated( |
| int stream_id, |
| base::UnsafeSharedMemoryRegion shared_memory_region, |
| std::unique_ptr<base::CancelableSyncSocket> foreign_socket) override; |
| void OnStreamError(int stream_id) override; |
| |
| void StreamConnectionLost(); |
| |
| SEQUENCE_CHECKER(sequence_checker_); |
| |
| StreamCreatedCallback stream_created_callback_; |
| DeleterCallback deleter_callback_; |
| mojo::Receiver<AudioOutputStream> receiver_{this}; |
| std::unique_ptr<AudioOutputDelegate> delegate_; |
| base::WeakPtrFactory<MojoAudioOutputStream> weak_factory_{this}; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_MOJO_SERVICES_MOJO_AUDIO_OUTPUT_STREAM_H_ |