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

Unified Diff: media/audio/audio_output_device.cc

Issue 1122393004: Add support for switching the audio output device for HTMLMediaElements. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changes to MediaPlayers so that they invoke callbacks in the correct threads. First complete implem… Created 5 years, 7 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: media/audio/audio_output_device.cc
diff --git a/media/audio/audio_output_device.cc b/media/audio/audio_output_device.cc
index 960c84b11505d7d06d1ef0083202b898d7376129..1c4c825f5d08332039e871d475d381954517130f 100644
--- a/media/audio/audio_output_device.cc
+++ b/media/audio/audio_output_device.cc
@@ -5,6 +5,7 @@
#include "media/audio/audio_output_device.h"
#include "base/basictypes.h"
+#include "base/thread_task_runner_handle.h"
#include "base/threading/thread_restrictions.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
@@ -46,7 +47,8 @@ AudioOutputDevice::AudioOutputDevice(
state_(IDLE),
play_on_start_(true),
session_id_(-1),
- stopping_hack_(false) {
+ stopping_hack_(false),
+ next_switch_request_id_(0) {
CHECK(ipc_);
// The correctness of the code depends on the relative values assigned in the
@@ -118,6 +120,19 @@ bool AudioOutputDevice::SetVolume(double volume) {
return true;
}
+void AudioOutputDevice::SwitchOutputDevice(
+ const std::string& device_id,
+ const GURL& security_origin,
+ const base::Callback<void(int)>& callback) {
+ DVLOG(1) << __FUNCTION__ << "(" << device_id << ")";
+ task_runner()->PostTask(FROM_HERE,
+ base::Bind(&AudioOutputDevice::SwitchOutputDeviceOnIOThread,
+ this,
+ device_id,
+ security_origin,
+ callback));
+}
+
void AudioOutputDevice::CreateStreamOnIOThread(const AudioParameters& params) {
DCHECK(task_runner()->BelongsToCurrentThread());
if (state_ == IDLE) {
@@ -180,6 +195,18 @@ void AudioOutputDevice::SetVolumeOnIOThread(double volume) {
ipc_->SetVolume(volume);
}
+void AudioOutputDevice::SwitchOutputDeviceOnIOThread(
+ const std::string& device_id,
+ const GURL& security_origin,
+ const base::Callback<void(int)>& callback) {
+ DCHECK(task_runner()->BelongsToCurrentThread());
+ DVLOG(1) << __FUNCTION__ << "(" << device_id << "," << security_origin << ")";
+ if (state_ >= CREATING_STREAM) {
+ int request_id = AddSwitchRequest(callback);
+ ipc_->SwitchDevice(device_id, security_origin, request_id, callback);
+ }
+}
+
void AudioOutputDevice::OnStateChanged(AudioOutputIPCDelegate::State state) {
DCHECK(task_runner()->BelongsToCurrentThread());
@@ -256,6 +283,29 @@ void AudioOutputDevice::OnStreamCreated(
PlayOnIOThread();
}
+int AudioOutputDevice::AddSwitchRequest(
+ const base::Callback<void(int)>& callback) {
+ DCHECK(task_runner()->BelongsToCurrentThread());
+ DVLOG(1) << __PRETTY_FUNCTION__;
+ int request_id = next_switch_request_id_++;
+ switch_requests_[request_id] = callback;
+ return request_id;
+}
+
+void AudioOutputDevice::OnDeviceSwitched(
+ int request_id, AudioOutputIPCDelegate::DeviceSwitchResult result) {
+ DCHECK(task_runner()->BelongsToCurrentThread());
+ DVLOG(1) << __PRETTY_FUNCTION__
+ << "(" << request_id << ", " << result << ")";
+ auto request = switch_requests_.find(request_id);
+ if (request == switch_requests_.end()) {
+ return;
+ }
+
+ request->second.Run(result);
+ switch_requests_.erase(request);
+}
+
void AudioOutputDevice::OnIPCClosed() {
DCHECK(task_runner()->BelongsToCurrentThread());
state_ = IPC_CLOSED;

Powered by Google App Engine
This is Rietveld 408576698