[media] Clean up audio output device SetSinkId() plumbing.

- Use std::unique_ptr to pass ownership of WebSetSinkIdCallbacks.
- Use base::OnceCallback in //content since the callback can only be
  invoked once.
- Remove //media wrapper for std::unique_ptr<WebSetSinkIdCallbacks>.
- Remove the default case from the //content to Blink callback
  mapping and handle the previously missed enumerator value
  OUTPUT_DEVICE_STATUS_ERROR_TIMED_OUT.

Change-Id: I2695ba1f8b0e715a85e1dbfb4814410bd18188a3
Reviewed-on: https://chromium-review.googlesource.com/c/1297304
Commit-Queue: Daniel Cheng <[email protected]>
Reviewed-by: Dale Curtis <[email protected]>
Reviewed-by: Dmitry Gozman <[email protected]>
Cr-Commit-Position: refs/heads/master@{#602241}
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index 9696bbb0c..6f54a1d 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -95,8 +95,8 @@
 
 void SetSinkIdOnMediaThread(scoped_refptr<WebAudioSourceProviderImpl> sink,
                             const std::string& device_id,
-                            const OutputDeviceStatusCB& callback) {
-  sink->SwitchOutputDevice(device_id, callback);
+                            OutputDeviceStatusCB callback) {
+  sink->SwitchOutputDevice(device_id, std::move(callback));
 }
 
 bool IsBackgroundSuspendEnabled(WebMediaPlayerDelegate* delegate) {
@@ -878,16 +878,17 @@
                                                           std::move(callback));
 }
 
-void WebMediaPlayerImpl::SetSinkId(const blink::WebString& sink_id,
-                                   blink::WebSetSinkIdCallbacks* web_callback) {
+void WebMediaPlayerImpl::SetSinkId(
+    const blink::WebString& sink_id,
+    std::unique_ptr<blink::WebSetSinkIdCallbacks> web_callback) {
   DCHECK(main_task_runner_->BelongsToCurrentThread());
   DVLOG(1) << __func__;
 
   media::OutputDeviceStatusCB callback =
-      media::ConvertToOutputDeviceStatusCB(web_callback);
+      media::ConvertToOutputDeviceStatusCB(std::move(web_callback));
   media_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&SetSinkIdOnMediaThread, audio_source_provider_,
-                                sink_id.Utf8(), callback));
+                                sink_id.Utf8(), std::move(callback)));
 }
 
 STATIC_ASSERT_ENUM(WebMediaPlayer::kPreloadNone, MultibufferDataSource::NONE);