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

Side by Side Diff: content/renderer/media/audio_device_factory.cc

Issue 1666363005: Switching audio clients to using RestartableAudioRendererSink interface as a sink. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nit fixes Created 4 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/audio_device_factory.h" 5 #include "content/renderer/media/audio_device_factory.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "content/renderer/media/audio_input_message_filter.h" 8 #include "content/renderer/media/audio_input_message_filter.h"
9 #include "content/renderer/media/audio_message_filter.h" 9 #include "content/renderer/media/audio_message_filter.h"
10 #include "content/renderer/media/audio_renderer_mixer_manager.h"
11 #include "content/renderer/render_thread_impl.h"
10 #include "media/audio/audio_input_device.h" 12 #include "media/audio/audio_input_device.h"
11 #include "media/audio/audio_output_device.h" 13 #include "media/audio/audio_output_device.h"
14 #include "media/base/audio_renderer_mixer_input.h"
12 #include "url/origin.h" 15 #include "url/origin.h"
13 16
14 namespace content { 17 namespace content {
15 18
16 // static 19 // static
17 AudioDeviceFactory* AudioDeviceFactory::factory_ = NULL; 20 AudioDeviceFactory* AudioDeviceFactory::factory_ = NULL;
18 21
22 namespace {
23
24 // This is where we decide which audio will go to mixers and which one to
25 // AudioOutpuDevice directly.
26 bool IsMixable(AudioDeviceFactory::SourceType source_type) {
27 if (source_type == AudioDeviceFactory::kSourceMediaElement)
28 return true; // Must ALWAYS go through mixer.
29
30 // TODO(olka): make a decision for the rest of the sources basing on OS
31 // type and configuration parameters.
32 return false;
33 }
34
35 scoped_refptr<media::RestartableAudioRendererSink> NewMixableSink(
36 int render_frame_id,
37 const std::string& device_id,
38 const url::Origin& security_origin) {
39 RenderThreadImpl* render_thread = RenderThreadImpl::current();
40 return scoped_refptr<media::AudioRendererMixerInput>(
41 render_thread->GetAudioRendererMixerManager()->CreateInput(
42 render_frame_id, device_id, security_origin));
43 }
44
45 scoped_refptr<media::AudioRendererSink> NewUnmixableSink(
46 int render_frame_id,
47 int session_id,
48 const std::string& device_id,
49 const url::Origin& security_origin) {
50 return AudioDeviceFactory::NewOutputDevice(render_frame_id, session_id,
51 device_id, security_origin);
52 }
53
54 } // namespace
55
19 // static 56 // static
20 scoped_refptr<media::AudioOutputDevice> AudioDeviceFactory::NewOutputDevice( 57 scoped_refptr<media::AudioOutputDevice> AudioDeviceFactory::NewOutputDevice(
21 int render_frame_id, 58 int render_frame_id,
22 int session_id, 59 int session_id,
23 const std::string& device_id, 60 const std::string& device_id,
24 const url::Origin& security_origin) { 61 const url::Origin& security_origin) {
25 if (factory_) { 62 if (factory_) {
26 media::AudioOutputDevice* const device = factory_->CreateOutputDevice( 63 media::AudioOutputDevice* const device = factory_->CreateOutputDevice(
27 render_frame_id, session_id, device_id, security_origin); 64 render_frame_id, session_id, device_id, security_origin);
28 if (device) 65 if (device)
29 return device; 66 return device;
30 } 67 }
31 68
32 AudioMessageFilter* const filter = AudioMessageFilter::Get(); 69 AudioMessageFilter* const filter = AudioMessageFilter::Get();
33 scoped_refptr<media::AudioOutputDevice> device = new media::AudioOutputDevice( 70 scoped_refptr<media::AudioOutputDevice> device = new media::AudioOutputDevice(
34 filter->CreateAudioOutputIPC(render_frame_id), filter->io_task_runner(), 71 filter->CreateAudioOutputIPC(render_frame_id), filter->io_task_runner(),
35 session_id, device_id, security_origin); 72 session_id, device_id, security_origin);
36 device->RequestDeviceAuthorization(); 73 device->RequestDeviceAuthorization();
37 return device; 74 return device;
38 } 75 }
39 76
40 // static 77 // static
78 scoped_refptr<media::AudioRendererSink>
79 AudioDeviceFactory::NewAudioRendererSink(SourceType source_type,
80 int render_frame_id,
81 int session_id,
82 const std::string& device_id,
83 const url::Origin& security_origin) {
84 if (factory_) {
85 media::AudioRendererSink* const device = factory_->CreateAudioRendererSink(
86 source_type, render_frame_id, session_id, device_id, security_origin);
87 if (device)
88 return device;
89 }
90
91 if (IsMixable(source_type))
92 return NewMixableSink(render_frame_id, device_id, security_origin);
93
94 return NewUnmixableSink(render_frame_id, session_id, device_id,
95 security_origin);
96 }
97
98 // static
99 scoped_refptr<media::RestartableAudioRendererSink>
100 AudioDeviceFactory::NewRestartableAudioRendererSink(
101 SourceType source_type,
102 int render_frame_id,
103 int session_id,
104 const std::string& device_id,
105 const url::Origin& security_origin) {
106 if (factory_) {
107 media::RestartableAudioRendererSink* const device =
108 factory_->CreateRestartableAudioRendererSink(
109 source_type, render_frame_id, session_id, device_id,
110 security_origin);
111 if (device)
112 return device;
113 }
114
115 if (IsMixable(source_type))
116 return NewMixableSink(render_frame_id, device_id, security_origin);
117
118 // AudioOutputDevice is not RestartableAudioRendererSink, so we can't return
119 // anything for those who wants to create an unmixable sink.
120 NOTIMPLEMENTED();
121 return nullptr;
122 }
123
124 // static
41 scoped_refptr<media::AudioInputDevice> AudioDeviceFactory::NewInputDevice( 125 scoped_refptr<media::AudioInputDevice> AudioDeviceFactory::NewInputDevice(
42 int render_frame_id) { 126 int render_frame_id) {
43 if (factory_) { 127 if (factory_) {
44 media::AudioInputDevice* const device = 128 media::AudioInputDevice* const device =
45 factory_->CreateInputDevice(render_frame_id); 129 factory_->CreateInputDevice(render_frame_id);
46 if (device) 130 if (device)
47 return device; 131 return device;
48 } 132 }
49 133
50 AudioInputMessageFilter* const filter = AudioInputMessageFilter::Get(); 134 AudioInputMessageFilter* const filter = AudioInputMessageFilter::Get();
51 return new media::AudioInputDevice( 135 return new media::AudioInputDevice(
52 filter->CreateAudioInputIPC(render_frame_id), filter->io_task_runner()); 136 filter->CreateAudioInputIPC(render_frame_id), filter->io_task_runner());
53 } 137 }
54 138
139 // static
140 // TODO(http://crbug.com/587461): Find a better way to check if device exists
141 // and is authorized.
142 media::OutputDeviceStatus AudioDeviceFactory::GetOutputDeviceStatus(
143 int render_frame_id,
144 int session_id,
145 const std::string& device_id,
146 const url::Origin& security_origin) {
147 scoped_refptr<media::AudioOutputDevice> device =
148 NewOutputDevice(render_frame_id, session_id, device_id, security_origin);
149 media::OutputDeviceStatus status = device->GetDeviceStatus();
150
151 device->Stop(); // Must be stopped.
152 return status;
153 }
154
55 AudioDeviceFactory::AudioDeviceFactory() { 155 AudioDeviceFactory::AudioDeviceFactory() {
56 DCHECK(!factory_) << "Can't register two factories at once."; 156 DCHECK(!factory_) << "Can't register two factories at once.";
57 factory_ = this; 157 factory_ = this;
58 } 158 }
59 159
60 AudioDeviceFactory::~AudioDeviceFactory() { 160 AudioDeviceFactory::~AudioDeviceFactory() {
61 factory_ = NULL; 161 factory_ = NULL;
62 } 162 }
63 163
64 } // namespace content 164 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/audio_device_factory.h ('k') | content/renderer/media/audio_renderer_mixer_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698