web_engine_audio_device_factory.cc 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "fuchsia_web/webengine/renderer/web_engine_audio_device_factory.h"
  5. #include <fuchsia/media/cpp/fidl.h>
  6. #include "base/check.h"
  7. #include "content/public/renderer/render_frame.h"
  8. #include "fuchsia_web/webengine/mojom/web_engine_media_resource_provider.mojom.h"
  9. #include "fuchsia_web/webengine/renderer/web_engine_audio_output_device.h"
  10. #include "media/base/audio_renderer_sink.h"
  11. #include "mojo/public/cpp/bindings/pending_remote.h"
  12. #include "mojo/public/cpp/bindings/remote.h"
  13. #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
  14. #include "third_party/blink/public/web/web_local_frame.h"
  15. namespace {
  16. content::RenderFrame* GetRenderFrameForToken(
  17. const blink::LocalFrameToken& frame_token) {
  18. auto* web_frame = blink::WebLocalFrame::FromFrameToken(frame_token);
  19. if (!web_frame)
  20. return nullptr;
  21. return content::RenderFrame::FromWebFrame(web_frame);
  22. }
  23. } // namespace
  24. WebEngineAudioDeviceFactory::WebEngineAudioDeviceFactory() = default;
  25. WebEngineAudioDeviceFactory::~WebEngineAudioDeviceFactory() = default;
  26. scoped_refptr<media::AudioRendererSink>
  27. WebEngineAudioDeviceFactory::NewAudioRendererSink(
  28. blink::WebAudioDeviceSourceType source_type,
  29. const blink::LocalFrameToken& frame_token,
  30. const media::AudioSinkParameters& params) {
  31. bool allow_audio_consumer = true;
  32. switch (source_type) {
  33. case blink::WebAudioDeviceSourceType::kMediaElement:
  34. // MediaElement uses NewSwitchableAudioRendererSink().
  35. NOTREACHED();
  36. return nullptr;
  37. case blink::WebAudioDeviceSourceType::kWebRtc:
  38. case blink::WebAudioDeviceSourceType::kNonRtcAudioTrack:
  39. // AudioConsumer is not enabled for WebRTC streams yet.
  40. allow_audio_consumer = false;
  41. break;
  42. // kNone is used in AudioDeviceFactory::GetOutputDeviceInfo() to get
  43. // default output device params.
  44. case blink::WebAudioDeviceSourceType::kNone:
  45. break;
  46. // Create WebEngineAudioDeviceFactory for all WebAudio streams.
  47. case blink::WebAudioDeviceSourceType::kWebAudioInteractive:
  48. case blink::WebAudioDeviceSourceType::kWebAudioBalanced:
  49. case blink::WebAudioDeviceSourceType::kWebAudioPlayback:
  50. case blink::WebAudioDeviceSourceType::kWebAudioExact:
  51. break;
  52. }
  53. // AudioConsumer can be used only to output to the default device.
  54. if (!params.device_id.empty())
  55. allow_audio_consumer = false;
  56. mojo::Remote<mojom::WebEngineMediaResourceProvider> media_resource_provider;
  57. bool use_audio_consumer = false;
  58. if (allow_audio_consumer) {
  59. auto* render_frame = GetRenderFrameForToken(frame_token);
  60. CHECK(render_frame);
  61. // Connect WebEngineMediaResourceProvider.
  62. render_frame->GetBrowserInterfaceBroker()->GetInterface(
  63. media_resource_provider.BindNewPipeAndPassReceiver());
  64. bool result =
  65. media_resource_provider->ShouldUseAudioConsumer(&use_audio_consumer);
  66. DCHECK(result);
  67. }
  68. // If AudioConsumer is not enabled then fallback to AudioOutputDevice.
  69. if (!use_audio_consumer) {
  70. return AudioDeviceFactory::NewAudioRendererSink(source_type, frame_token,
  71. params);
  72. }
  73. // Connect AudioConsumer.
  74. fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer;
  75. media_resource_provider->CreateAudioConsumer(audio_consumer.NewRequest());
  76. return WebEngineAudioOutputDevice::CreateOnDefaultThread(
  77. std::move(audio_consumer));
  78. }