Index: content/renderer/pepper/pepper_platform_audio_output_dev.h |
diff --git a/content/renderer/pepper/pepper_platform_audio_output_dev.h b/content/renderer/pepper/pepper_platform_audio_output_dev.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..50d4537ac9b790e0b500021ca7443b491c14d133 |
--- /dev/null |
+++ b/content/renderer/pepper/pepper_platform_audio_output_dev.h |
@@ -0,0 +1,162 @@ |
+// Copyright (c) 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 CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_OUTPUT_DEV_H_ |
+#define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_OUTPUT_DEV_H_ |
+ |
+#include <memory> |
+ |
+#include "base/macros.h" |
+#include "base/memory/ref_counted.h" |
+#include "media/audio/audio_output_ipc.h" |
+#include "media/base/audio_parameters.h" |
+#include "media/base/output_device_info.h" |
+ |
+namespace base { |
+class OneShotTimer; |
+class SingleThreadTaskRunner; |
+} |
+ |
+namespace { |
+#if defined(OS_WIN) || defined(OS_MACOSX) |
+const int64_t kMaxAuthorizationTimeoutMs = 4000; |
+#else |
+const int64_t kMaxAuthorizationTimeoutMs = 0; // No timeout. |
+#endif |
+} |
+ |
+namespace content { |
+class PepperAudioOutputHost; |
+ |
+// This class is used to support new PPAPI |PPB_AudioOutput_Dev|, while |
+// |PepperPlatformAudioOutput| is to support old PPAPI |PPB_Audio|. |
+class PepperPlatformAudioOutputDev |
+ : public media::AudioOutputIPCDelegate, |
+ public base::RefCountedThreadSafe<PepperPlatformAudioOutputDev> { |
+ public: |
+ // Factory function, returns NULL on failure. StreamCreated() will be called |
+ // when the stream is created. |
+ static PepperPlatformAudioOutputDev* Create(int render_frame_id, |
+ const std::string& device_id, |
+ const GURL& document_url, |
+ int sample_rate, |
+ int frames_per_buffer, |
+ PepperAudioOutputHost* client); |
+ |
+ // The following three methods are all called on main thread. |
+ |
+ // Request authorization to use the device. |
+ void RequestDeviceAuthorization(); |
+ |
+ // Starts the playback. Returns false on error or if called before the |
+ // stream is created or after the stream is closed. |
+ bool StartPlayback(); |
+ |
+ // Stops the playback. Returns false on error or if called before the stream |
+ // is created or after the stream is closed. |
+ bool StopPlayback(); |
+ |
+ // Sets the volume. Returns false on error or if called before the stream |
+ // is created or after the stream is closed. |
+ bool SetVolume(double volume); |
+ |
+ // Closes the stream. Make sure to call this before the object is |
+ // destructed. |
+ void ShutDown(); |
+ |
+ // media::AudioOutputIPCDelegate implementation. |
+ void OnError() override; |
+ void OnDeviceAuthorized(media::OutputDeviceStatus device_status, |
+ const media::AudioParameters& output_params, |
+ const std::string& matched_device_id) override; |
+ void OnStreamCreated(base::SharedMemoryHandle handle, |
+ base::SyncSocket::Handle socket_handle, |
+ int length) override; |
+ void OnIPCClosed() override; |
+ |
+ protected: |
+ ~PepperPlatformAudioOutputDev() override; |
+ |
+ private: |
+ enum State { |
+ IPC_CLOSED, // No more IPCs can take place. |
+ IDLE, // Not started. |
+ AUTHORIZING, // Sent device authorization request, waiting for reply. |
+ AUTHORIZED, // Successful device authorization received. |
+ CREATING_STREAM, // Waiting for OnStreamCreated() to be called back. |
+ PAUSED, // Paused. OnStreamCreated() has been called. Can Play()/Stop(). |
+ PLAYING, // Playing back. Can Pause()/Stop(). |
+ }; |
+ |
+ friend class base::RefCountedThreadSafe<PepperPlatformAudioOutputDev>; |
+ |
+ PepperPlatformAudioOutputDev(); |
+ PepperPlatformAudioOutputDev(int render_frame_id, |
+ const std::string& device_id, |
+ const GURL& document_url, |
+ base::TimeDelta authorization_timeout); |
+ |
+ // Creates audio stream. Used for new Pepper audio output interface |
+ // |PPB_AudioOutput_Dev|. |
+ bool Initialize(int sample_rate, |
+ int frames_per_buffer, |
+ PepperAudioOutputHost* client); |
+ |
+ void RequestDeviceAuthorizationOnIOThread(); |
+ void CreateStreamOnIOThread(const media::AudioParameters& params); |
+ void StartPlaybackOnIOThread(); |
+ void StopPlaybackOnIOThread(); |
+ void SetVolumeOnIOThread(double volume); |
+ void ShutDownOnIOThread(); |
+ |
+ void NotifyStreamCreationFailed(); |
+ |
+ PepperAudioOutputHost* client_; |
+ |
+ // Used to send/receive IPC. THIS MUST ONLY BE ACCESSED ON THE |
+ // I/O thread except to send messages and get the message loop. |
+ std::unique_ptr<media::AudioOutputIPC> ipc_; |
+ |
+ scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; |
+ scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; |
+ |
+ // The frame containing the Pepper widget. |
+ int render_frame_id_; |
+ |
+ // Initialized on the main thread and accessed on the I/O thread afterwards. |
+ media::AudioParameters params_; |
+ |
+ // Current state (must only be accessed from the IO thread). |
+ State state_; |
+ |
+ // State of Start() calls before OnDeviceAuthorized() is called. |
+ bool start_on_authorized_; |
+ |
+ // State of StartPlayback() calls before OnStreamCreated() is called. |
+ bool play_on_start_; |
+ |
+ // The media session ID used to identify which output device to be started. |
+ int session_id_; |
+ |
+ // ID of hardware output device to be used (provided session_id_ is zero) |
+ const std::string device_id_; |
+ const url::Origin security_origin_; |
+ |
+ // If |device_id_| is empty and |session_id_| is not, |matched_device_id_| is |
+ // received in OnDeviceAuthorized(). |
+ std::string matched_device_id_; |
+ |
+ base::WaitableEvent did_receive_auth_; |
+ media::AudioParameters output_params_; |
+ media::OutputDeviceStatus device_status_; |
+ |
+ const base::TimeDelta auth_timeout_; |
+ std::unique_ptr<base::OneShotTimer> auth_timeout_action_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PepperPlatformAudioOutputDev); |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_OUTPUT_DEV_H_ |