Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1079)

Unified Diff: content/renderer/pepper/pepper_platform_audio_output.h

Issue 2755613002: Support audio output device enumeration and selection in PPAPI (Closed)
Patch Set: Should not include local change to ppapi/generators/idl_outfile.py Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/pepper/pepper_platform_audio_output.h
diff --git a/content/renderer/pepper/pepper_platform_audio_output.h b/content/renderer/pepper/pepper_platform_audio_output.h
index ad218839f54227b0e16546a44216189e69c81911..e5b2f6cf4f3e0f212d2acf9c8e233e8e2ee9e584 100644
--- a/content/renderer/pepper/pepper_platform_audio_output.h
+++ b/content/renderer/pepper/pepper_platform_audio_output.h
@@ -10,17 +10,32 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "media/audio/audio_output_ipc.h"
-
-namespace media {
-class AudioParameters;
-}
+#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 AudioHelper;
+class PepperAudioOutputHost;
+
+// We need to support both public PPAPI |PPB_Audio| and the new
+// dev PPAPI |PPB_AudioOutput_Dev| at the same time, so that the
+// existing users of |PPB_Audio| won't be affected.
+// To achieve this, we have to keep references to both |AudioHelper|
+// object and |PepperAudioOutputHost| object, so we can dispatch
+// callbacks properly.
bbudge 2017/03/23 18:05:45 Your changes to this class risk breaking the old P
Xing 2017/03/29 21:14:32 New implementation has been moved to pepper_platfo
class PepperPlatformAudioOutput
: public media::AudioOutputIPCDelegate,
@@ -33,8 +48,18 @@ class PepperPlatformAudioOutput
int source_render_frame_id,
AudioHelper* client);
+ static PepperPlatformAudioOutput* 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.
bbudge 2017/03/23 18:05:45 nit: comment isn't necessary
Xing 2017/03/29 21:14:32 Done.
+ 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();
@@ -65,25 +90,55 @@ class PepperPlatformAudioOutput
~PepperPlatformAudioOutput() 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<PepperPlatformAudioOutput>;
PepperPlatformAudioOutput();
+ PepperPlatformAudioOutput(int render_frame_id,
+ const std::string& device_id,
+ const GURL& document_url,
+ base::TimeDelta authorization_timeout);
+ // Used for old Pepper audio interface.
bbudge 2017/03/23 18:05:45 nit: be specific, PPB_Audio
Xing 2017/03/29 21:14:32 Done.
bool Initialize(int sample_rate,
int frames_per_buffer,
int source_render_frame_id,
AudioHelper* client);
+ // Creates audio stream. Used for new Pepper audio output interface.
bbudge 2017/03/23 18:05:45 ditto: PPB_AudioOutput_Dev
Xing 2017/03/29 21:14:32 Done.
+ bool Initialize(int sample_rate,
+ int frames_per_buffer,
+ PepperAudioOutputHost* client);
+
// I/O thread backends to above functions.
+ // Used only by old Pepper audio interface.
bbudge 2017/03/23 18:05:45 ditto
Xing 2017/03/29 21:14:32 Done.
void InitializeOnIOThread(const media::AudioParameters& params);
+
+ void RequestDeviceAuthorizationOnIOThread();
bbudge 2017/03/23 18:05:44 I assume these are only used to support PPB_AudioO
Xing 2017/03/29 21:14:32 Done.
+ void CreateStreamOnIOThread(const media::AudioParameters& params);
void StartPlaybackOnIOThread();
void StopPlaybackOnIOThread();
void SetVolumeOnIOThread(double volume);
void ShutDownOnIOThread();
+ void NotifyStreamCreationFailed();
+
// The client to notify when the stream is created. THIS MUST ONLY BE
// ACCESSED ON THE MAIN THREAD.
AudioHelper* client_;
+ // TODO: This PepperAudioOutputHost client will eventually replace
bbudge 2017/03/23 18:05:45 nit: chromium style requires TODO(owner), e.g. TOD
Xing 2017/03/29 21:14:32 Removed this TODO comment, since future modificati
+ // AudioHelper client. Only one of them can be valid. We keep them
+ // for backward compatibility purpose.
+ PepperAudioOutputHost* host_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.
@@ -92,6 +147,40 @@ class PepperPlatformAudioOutput
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.
+ // Only used by Unified IO.
bbudge 2017/03/23 18:05:44 What is Unified IO?
Xing 2017/03/29 21:14:32 Removed.
+ 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(PepperPlatformAudioOutput);
};

Powered by Google App Engine
This is Rietveld 408576698