Index: content/renderer/media/renderer_webaudiodevice_impl.cc |
diff --git a/content/renderer/media/renderer_webaudiodevice_impl.cc b/content/renderer/media/renderer_webaudiodevice_impl.cc |
index 553747ef1e8012cd69d26eb7cc5243cbd015788a..2b3d9b7f62f4811e71b4dfcb33b3899cec57579c 100644 |
--- a/content/renderer/media/renderer_webaudiodevice_impl.cc |
+++ b/content/renderer/media/renderer_webaudiodevice_impl.cc |
@@ -41,13 +41,43 @@ AudioDeviceFactory::SourceType GetLatencyHintSourceType( |
case WebAudioLatencyHint::kCategoryPlayback: |
return AudioDeviceFactory::kSourceWebAudioPlayback; |
case WebAudioLatencyHint::kCategoryExact: |
- // TODO implement CategoryExact |
- return AudioDeviceFactory::kSourceWebAudioInteractive; |
+ return AudioDeviceFactory::kSourceWebAudioExact; |
} |
NOTREACHED(); |
return AudioDeviceFactory::kSourceWebAudioInteractive; |
} |
+int GetOutputBufferSize(const blink::WebAudioLatencyHint& latency_hint, |
+ media::AudioLatency::LatencyType latency, |
+ const media::AudioParameters& hardware_params) { |
+ // Adjust output buffer size according to the latency requirement. |
+ switch (latency) { |
+ case media::AudioLatency::LATENCY_INTERACTIVE: |
+ return media::AudioLatency::GetInteractiveBufferSize( |
+ hardware_params.frames_per_buffer()); |
+ break; |
+ case media::AudioLatency::LATENCY_RTC: |
+ return media::AudioLatency::GetRtcBufferSize( |
+ hardware_params.sample_rate(), hardware_params.frames_per_buffer()); |
+ break; |
+ case media::AudioLatency::LATENCY_PLAYBACK: |
+ return media::AudioLatency::GetHighLatencyBufferSize( |
+ hardware_params.sample_rate(), 0); |
+ break; |
+ case media::AudioLatency::LATENCY_EXACT_MS: |
+ // TODO(andrew.macpherson@soundtrap.com): http://crbug.com/708917 |
+ return std::min(4096, |
+ media::AudioLatency::GetExactBufferSize( |
+ base::TimeDelta::FromSecondsD(latency_hint.Seconds()), |
+ hardware_params.sample_rate(), |
+ hardware_params.frames_per_buffer())); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+ return 0; |
+} |
+ |
int FrameIdFromCurrentContext() { |
// Assumption: This method is being invoked within a V8 call stack. CHECKs |
// will fail in the call to frameForCurrentContext() otherwise. |
@@ -104,36 +134,16 @@ RendererWebAudioDeviceImpl::RendererWebAudioDeviceImpl( |
DCHECK(client_callback_); |
DCHECK_NE(frame_id_, MSG_ROUTING_NONE); |
- media::AudioParameters hardware_params(device_params_cb.Run( |
+ const media::AudioParameters hardware_params(device_params_cb.Run( |
frame_id_, session_id_, std::string(), security_origin_)); |
- int output_buffer_size = 0; |
- |
- media::AudioLatency::LatencyType latency = |
+ const media::AudioLatency::LatencyType latency = |
AudioDeviceFactory::GetSourceLatencyType( |
GetLatencyHintSourceType(latency_hint_.Category())); |
- // Adjust output buffer size according to the latency requirement. |
- switch (latency) { |
- case media::AudioLatency::LATENCY_INTERACTIVE: |
- output_buffer_size = media::AudioLatency::GetInteractiveBufferSize( |
- hardware_params.frames_per_buffer()); |
- break; |
- case media::AudioLatency::LATENCY_RTC: |
- output_buffer_size = media::AudioLatency::GetRtcBufferSize( |
- hardware_params.sample_rate(), hardware_params.frames_per_buffer()); |
- break; |
- case media::AudioLatency::LATENCY_PLAYBACK: |
- output_buffer_size = media::AudioLatency::GetHighLatencyBufferSize( |
- hardware_params.sample_rate(), 0); |
- break; |
- case media::AudioLatency::LATENCY_EXACT_MS: |
- // TODO(olka): add support when WebAudio requires it. |
- default: |
- NOTREACHED(); |
- } |
- |
- DCHECK_NE(output_buffer_size, 0); |
+ const int output_buffer_size = |
+ GetOutputBufferSize(latency_hint_, latency, hardware_params); |
+ DCHECK_NE(0, output_buffer_size); |
sink_params_.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, layout, |
hardware_params.sample_rate(), 16, output_buffer_size); |