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

Side by Side Diff: content/renderer/renderer_blink_platform_impl.cc

Issue 2501863003: Support for AudioContextOptions latencyHint. (Closed)
Patch Set: Created 4 years, 1 month 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/renderer_blink_platform_impl.h" 5 #include "content/renderer/renderer_blink_platform_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 #include "media/blink/webcontentdecryptionmodule_impl.h" 79 #include "media/blink/webcontentdecryptionmodule_impl.h"
80 #include "media/filters/stream_parser_factory.h" 80 #include "media/filters/stream_parser_factory.h"
81 #include "mojo/common/common_type_converters.h" 81 #include "mojo/common/common_type_converters.h"
82 #include "mojo/public/cpp/bindings/associated_group.h" 82 #include "mojo/public/cpp/bindings/associated_group.h"
83 #include "services/service_manager/public/cpp/interface_provider.h" 83 #include "services/service_manager/public/cpp/interface_provider.h"
84 #include "storage/common/database/database_identifier.h" 84 #include "storage/common/database/database_identifier.h"
85 #include "storage/common/quota/quota_types.h" 85 #include "storage/common/quota/quota_types.h"
86 #include "third_party/WebKit/public/platform/BlameContext.h" 86 #include "third_party/WebKit/public/platform/BlameContext.h"
87 #include "third_party/WebKit/public/platform/FilePathConversion.h" 87 #include "third_party/WebKit/public/platform/FilePathConversion.h"
88 #include "third_party/WebKit/public/platform/URLConversion.h" 88 #include "third_party/WebKit/public/platform/URLConversion.h"
89 #include "third_party/WebKit/public/platform/WebAudioLatencyHint.h"
89 #include "third_party/WebKit/public/platform/WebBlobRegistry.h" 90 #include "third_party/WebKit/public/platform/WebBlobRegistry.h"
90 #include "third_party/WebKit/public/platform/WebDeviceLightListener.h" 91 #include "third_party/WebKit/public/platform/WebDeviceLightListener.h"
91 #include "third_party/WebKit/public/platform/WebFileInfo.h" 92 #include "third_party/WebKit/public/platform/WebFileInfo.h"
92 #include "third_party/WebKit/public/platform/WebGamepads.h" 93 #include "third_party/WebKit/public/platform/WebGamepads.h"
93 #include "third_party/WebKit/public/platform/WebMediaStreamCenter.h" 94 #include "third_party/WebKit/public/platform/WebMediaStreamCenter.h"
94 #include "third_party/WebKit/public/platform/WebMediaStreamCenterClient.h" 95 #include "third_party/WebKit/public/platform/WebMediaStreamCenterClient.h"
95 #include "third_party/WebKit/public/platform/WebPluginListBuilder.h" 96 #include "third_party/WebKit/public/platform/WebPluginListBuilder.h"
96 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" 97 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
97 #include "third_party/WebKit/public/platform/WebURL.h" 98 #include "third_party/WebKit/public/platform/WebURL.h"
98 #include "third_party/WebKit/public/platform/WebVector.h" 99 #include "third_party/WebKit/public/platform/WebVector.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 #define WebScrollbarBehaviorImpl blink::WebScrollbarBehavior 135 #define WebScrollbarBehaviorImpl blink::WebScrollbarBehavior
135 #endif 136 #endif
136 137
137 #if defined(ENABLE_WEBRTC) 138 #if defined(ENABLE_WEBRTC)
138 #include "content/renderer/media/rtc_certificate_generator.h" 139 #include "content/renderer/media/rtc_certificate_generator.h"
139 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" 140 #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
140 #endif 141 #endif
141 142
142 using blink::Platform; 143 using blink::Platform;
143 using blink::WebAudioDevice; 144 using blink::WebAudioDevice;
145 using blink::WebAudioLatencyHint;
144 using blink::WebBlobRegistry; 146 using blink::WebBlobRegistry;
145 using blink::WebCanvasCaptureHandler; 147 using blink::WebCanvasCaptureHandler;
146 using blink::WebDatabaseObserver; 148 using blink::WebDatabaseObserver;
147 using blink::WebFileInfo; 149 using blink::WebFileInfo;
148 using blink::WebFileSystem; 150 using blink::WebFileSystem;
149 using blink::WebGamepad; 151 using blink::WebGamepad;
150 using blink::WebGamepads; 152 using blink::WebGamepads;
151 using blink::WebIDBFactory; 153 using blink::WebIDBFactory;
152 using blink::WebImageCaptureFrameGrabber; 154 using blink::WebImageCaptureFrameGrabber;
153 using blink::WebMIDIAccessor; 155 using blink::WebMIDIAccessor;
(...skipping 25 matching lines...) Expand all
179 media::AudioParameters GetAudioHardwareParams() { 181 media::AudioParameters GetAudioHardwareParams() {
180 blink::WebLocalFrame* const web_frame = 182 blink::WebLocalFrame* const web_frame =
181 blink::WebLocalFrame::frameForCurrentContext(); 183 blink::WebLocalFrame::frameForCurrentContext();
182 RenderFrame* const render_frame = RenderFrame::FromWebFrame(web_frame); 184 RenderFrame* const render_frame = RenderFrame::FromWebFrame(web_frame);
183 return AudioDeviceFactory::GetOutputDeviceInfo(render_frame->GetRoutingID(), 185 return AudioDeviceFactory::GetOutputDeviceInfo(render_frame->GetRoutingID(),
184 0, std::string(), 186 0, std::string(),
185 web_frame->getSecurityOrigin()) 187 web_frame->getSecurityOrigin())
186 .output_params(); 188 .output_params();
187 } 189 }
188 190
191 AudioDeviceFactory::SourceType GetLatencyHintSourceType(
192 WebAudioLatencyHint::Category latency_category) {
193 switch (latency_category) {
194 case WebAudioLatencyHint::CategoryInteractive:
195 return AudioDeviceFactory::kSourceWebAudioInteractive;
196 case WebAudioLatencyHint::CategoryBalanced:
197 return AudioDeviceFactory::kSourceWebAudioBalanced;
198 case WebAudioLatencyHint::CategoryPlayback:
199 return AudioDeviceFactory::kSourceWebAudioPlayback;
200 }
201 NOTREACHED();
202 return AudioDeviceFactory::kSourceWebAudioInteractive;
203 }
204
205 // Calculate mixer output parameters based on mixer input parameters and
o1ka 2016/11/15 22:44:27 I don't think we need it here. And WebAudioDevice
Andrew MacPherson 2016/11/16 10:58:29 Sounds good, I will remove this function entirely
206 // hardware parameters for audio output.
207 media::AudioParameters GetLatencyParams(
208 const media::AudioParameters& input_params,
209 const media::AudioParameters& hardware_params,
210 media::AudioLatency::LatencyType latency) {
211 int output_sample_rate = input_params.sample_rate();
o1ka 2016/11/15 22:44:27 (explanation of how this mixer code differs from w
212 bool valid_not_fake_hardware_params =
213 hardware_params.format() != media::AudioParameters::AUDIO_FAKE &&
214 hardware_params.IsValid();
215 int preferred_high_latency_output_buffer_size = 0;
216
217 #if !defined(OS_CHROMEOS)
218 // On ChromeOS as well as when a fake device is used, we can rely on the
219 // playback device to handle resampling, so don't waste cycles on it here.
220 // On other systems if hardware parameters are valid and the device is not
221 // fake, resample to hardware sample rate. Otherwise, pass the input one and
222 // let the browser side handle automatic fallback.
o1ka 2016/11/15 22:44:27 (explanation of how this mixer code differs from w
223 if (valid_not_fake_hardware_params) {
224 output_sample_rate = hardware_params.sample_rate();
225 preferred_high_latency_output_buffer_size =
226 hardware_params.frames_per_buffer();
227 }
228 #endif
229
230 int output_buffer_size = 0;
231
232 // Adjust output buffer size according to the latency requirement.
233 switch (latency) {
234 case media::AudioLatency::LATENCY_INTERACTIVE:
235 output_buffer_size = media::AudioLatency::GetInteractiveBufferSize(
236 hardware_params.frames_per_buffer());
237 break;
238 case media::AudioLatency::LATENCY_RTC:
239 output_buffer_size = media::AudioLatency::GetRtcBufferSize(
240 output_sample_rate, valid_not_fake_hardware_params
241 ? hardware_params.frames_per_buffer()
242 : 0);
243 break;
244 case media::AudioLatency::LATENCY_PLAYBACK:
245 output_buffer_size = media::AudioLatency::GetHighLatencyBufferSize(
246 output_sample_rate, preferred_high_latency_output_buffer_size);
247 break;
248 case media::AudioLatency::LATENCY_EXACT_MS:
249 // TODO(olka): add support when WebAudio requires it.
250 default:
251 NOTREACHED();
252 }
253
254 DCHECK_NE(output_buffer_size, 0);
255
256 // Force to 16-bit output for now since we know that works everywhere;
257 // ChromeOS does not support other bit depths.
258 media::AudioParameters params(input_params.format(),
259 input_params.channel_layout(),
260 output_sample_rate, 16, output_buffer_size);
261
262 // Specify the latency info to be passed to the browser side.
263 params.set_latency_tag(latency);
264 return params;
265 }
266
189 } // namespace 267 } // namespace
190 268
191 //------------------------------------------------------------------------------ 269 //------------------------------------------------------------------------------
192 270
193 class RendererBlinkPlatformImpl::FileUtilities : public WebFileUtilitiesImpl { 271 class RendererBlinkPlatformImpl::FileUtilities : public WebFileUtilitiesImpl {
194 public: 272 public:
195 explicit FileUtilities(ThreadSafeSender* sender) 273 explicit FileUtilities(ThreadSafeSender* sender)
196 : thread_safe_sender_(sender) {} 274 : thread_safe_sender_(sender) {}
197 bool getFileInfo(const WebString& path, WebFileInfo& result) override; 275 bool getFileInfo(const WebString& path, WebFileInfo& result) override;
198 276
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 722
645 unsigned RendererBlinkPlatformImpl::audioHardwareOutputChannels() { 723 unsigned RendererBlinkPlatformImpl::audioHardwareOutputChannels() {
646 return GetAudioHardwareParams().channels(); 724 return GetAudioHardwareParams().channels();
647 } 725 }
648 726
649 WebDatabaseObserver* RendererBlinkPlatformImpl::databaseObserver() { 727 WebDatabaseObserver* RendererBlinkPlatformImpl::databaseObserver() {
650 return web_database_observer_impl_.get(); 728 return web_database_observer_impl_.get();
651 } 729 }
652 730
653 WebAudioDevice* RendererBlinkPlatformImpl::createAudioDevice( 731 WebAudioDevice* RendererBlinkPlatformImpl::createAudioDevice(
654 size_t buffer_size,
655 unsigned input_channels, 732 unsigned input_channels,
656 unsigned channels, 733 unsigned channels,
657 double sample_rate, 734 const blink::WebAudioLatencyHint& latency_hint,
658 WebAudioDevice::RenderCallback* callback, 735 WebAudioDevice::RenderCallback* callback,
659 const blink::WebString& input_device_id, 736 const blink::WebString& input_device_id,
660 const blink::WebSecurityOrigin& security_origin) { 737 const blink::WebSecurityOrigin& security_origin) {
661 // Use a mock for testing.
662 blink::WebAudioDevice* mock_device =
663 GetContentClient()->renderer()->OverrideCreateAudioDevice(sample_rate);
664 if (mock_device)
665 return mock_device;
666
667 // The |channels| does not exactly identify the channel layout of the 738 // The |channels| does not exactly identify the channel layout of the
668 // device. The switch statement below assigns a best guess to the channel 739 // device. The switch statement below assigns a best guess to the channel
669 // layout based on number of channels. 740 // layout based on number of channels.
670 media::ChannelLayout layout = media::CHANNEL_LAYOUT_UNSUPPORTED; 741 media::ChannelLayout layout = media::CHANNEL_LAYOUT_UNSUPPORTED;
671 switch (channels) { 742 switch (channels) {
672 case 1: 743 case 1:
673 layout = media::CHANNEL_LAYOUT_MONO; 744 layout = media::CHANNEL_LAYOUT_MONO;
674 break; 745 break;
675 case 2: 746 case 2:
676 layout = media::CHANNEL_LAYOUT_STEREO; 747 layout = media::CHANNEL_LAYOUT_STEREO;
(...skipping 25 matching lines...) Expand all
702 int session_id = 0; 773 int session_id = 0;
703 if (input_device_id.isNull() || 774 if (input_device_id.isNull() ||
704 !base::StringToInt(base::UTF16ToUTF8( 775 !base::StringToInt(base::UTF16ToUTF8(
705 base::StringPiece16(input_device_id)), &session_id)) { 776 base::StringPiece16(input_device_id)), &session_id)) {
706 if (input_channels > 0) 777 if (input_channels > 0)
707 DLOG(WARNING) << "createAudioDevice(): request for audio input ignored"; 778 DLOG(WARNING) << "createAudioDevice(): request for audio input ignored";
708 779
709 input_channels = 0; 780 input_channels = 0;
710 } 781 }
711 782
783 media::AudioParameters input_params(
784 media::AudioParameters::AUDIO_PCM_LOW_LATENCY, layout,
785 static_cast<int>(GetAudioHardwareParams().sample_rate()), 16,
786 GetAudioHardwareParams().frames_per_buffer());
787
788 AudioDeviceFactory::SourceType source_type(
789 GetLatencyHintSourceType(latency_hint.category()));
790 media::AudioParameters params(
791 GetLatencyParams(input_params, GetAudioHardwareParams(),
o1ka 2016/11/15 22:44:27 I think we just do not need to pass parameters to
Andrew MacPherson 2016/11/16 10:58:29 Will fix in the next commit, thanks!
792 AudioDeviceFactory::GetSourceLatencyType(source_type)));
793
712 // For CHANNEL_LAYOUT_DISCRETE, pass the explicit channel count along with 794 // For CHANNEL_LAYOUT_DISCRETE, pass the explicit channel count along with
713 // the channel layout when creating an |AudioParameters| object. 795 // the channel layout when creating an |AudioParameters| object.
714 media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
715 layout, static_cast<int>(sample_rate), 16,
716 buffer_size);
717 params.set_channels_for_discrete(channels); 796 params.set_channels_for_discrete(channels);
718 797
798 // Use a mock for testing.
799 blink::WebAudioDevice* mock_device =
800 GetContentClient()->renderer()->OverrideCreateAudioDevice(
801 params.sample_rate(), params.frames_per_buffer());
802 if (mock_device)
803 return mock_device;
804
719 return new RendererWebAudioDeviceImpl( 805 return new RendererWebAudioDeviceImpl(
720 params, callback, session_id, static_cast<url::Origin>(security_origin)); 806 params, source_type, callback, session_id,
807 static_cast<url::Origin>(security_origin));
721 } 808 }
722 809
723 bool RendererBlinkPlatformImpl::loadAudioResource( 810 bool RendererBlinkPlatformImpl::loadAudioResource(
724 blink::WebAudioBus* destination_bus, 811 blink::WebAudioBus* destination_bus,
725 const char* audio_file_data, 812 const char* audio_file_data,
726 size_t data_size) { 813 size_t data_size) {
727 return DecodeAudioFileData( 814 return DecodeAudioFileData(
728 destination_bus, audio_file_data, data_size); 815 destination_bus, audio_file_data, data_size);
729 } 816 }
730 817
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
1290 return &trial_token_validator_; 1377 return &trial_token_validator_;
1291 } 1378 }
1292 1379
1293 void RendererBlinkPlatformImpl::workerContextCreated( 1380 void RendererBlinkPlatformImpl::workerContextCreated(
1294 const v8::Local<v8::Context>& worker) { 1381 const v8::Local<v8::Context>& worker) {
1295 GetContentClient()->renderer()->DidInitializeWorkerContextOnWorkerThread( 1382 GetContentClient()->renderer()->DidInitializeWorkerContextOnWorkerThread(
1296 worker); 1383 worker);
1297 } 1384 }
1298 1385
1299 } // namespace content 1386 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698