diff --git a/components/script/dom/audiocontext.rs b/components/script/dom/audiocontext.rs index 9b767a6da05..3ed6f3947ad 100644 --- a/components/script/dom/audiocontext.rs +++ b/components/script/dom/audiocontext.rs @@ -2,10 +2,10 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::baseaudiocontext::BaseAudioContext; +use dom::baseaudiocontext::{BaseAudioContext, BaseAudioContextOptions}; use dom::bindings::codegen::Bindings::AudioContextBinding; -use dom::bindings::codegen::Bindings::AudioContextBinding::AudioContextMethods; -use dom::bindings::codegen::Bindings::AudioContextBinding::{AudioContextOptions, AudioTimestamp}; +use dom::bindings::codegen::Bindings::AudioContextBinding::{AudioContextMethods, AudioContextOptions}; +use dom::bindings::codegen::Bindings::AudioContextBinding::{AudioContextLatencyCategory, AudioTimestamp}; use dom::bindings::error::Fallible; use dom::bindings::inheritance::Castable; use dom::bindings::num::Finite; @@ -15,6 +15,7 @@ use dom::globalscope::GlobalScope; use dom::promise::Promise; use dom::window::Window; use dom_struct::dom_struct; +use servo_media::audio::graph::{LatencyCategory, RealTimeAudioGraphOptions}; use std::rc::Rc; #[dom_struct] @@ -25,9 +26,9 @@ pub struct AudioContext { } impl AudioContext { - fn new_inherited(global: &GlobalScope, sample_rate: f32) -> AudioContext { + fn new_inherited(global: &GlobalScope, options: &AudioContextOptions) -> AudioContext { AudioContext { - context: BaseAudioContext::new_inherited(global, 2 /* channel_count */, sample_rate), + context: BaseAudioContext::new_inherited(global, BaseAudioContextOptions::AudioContext(options.into())), base_latency: 0., // TODO output_latency: 0., // TODO } @@ -38,7 +39,7 @@ impl AudioContext { options: &AudioContextOptions) -> DomRoot { let context = AudioContext::new_inherited( global, - *options.sampleRate.unwrap_or(Finite::wrap(0.)), + options, ); // TODO reflect_dom_object(Box::new(context), global, AudioContextBinding::Wrap) } @@ -79,3 +80,22 @@ impl AudioContextMethods for AudioContext { Promise::new(&self.global()) } } + +impl From for LatencyCategory { + fn from(category: AudioContextLatencyCategory) -> Self { + match category { + AudioContextLatencyCategory::Balanced => LatencyCategory::Balanced, + AudioContextLatencyCategory::Interactive => LatencyCategory::Interactive, + AudioContextLatencyCategory::Playback => LatencyCategory::Playback, + } + } +} + +impl<'a> From<&'a AudioContextOptions> for RealTimeAudioGraphOptions { + fn from(options: &AudioContextOptions) -> Self { + Self { + sample_rate: *options.sampleRate.unwrap_or(Finite::wrap(48000.)), + latency_hint: options.latencyHint.into(), + } + } +} diff --git a/components/script/dom/baseaudiocontext.rs b/components/script/dom/baseaudiocontext.rs index f8fa01bd0f4..554b4e67b4e 100644 --- a/components/script/dom/baseaudiocontext.rs +++ b/components/script/dom/baseaudiocontext.rs @@ -17,10 +17,16 @@ use dom::oscillatornode::OscillatorNode; use dom_struct::dom_struct; use servo_media::ServoMedia; use servo_media::audio::graph::AudioGraph; +use servo_media::audio::graph::{OfflineAudioGraphOptions, RealTimeAudioGraphOptions}; use servo_media::audio::graph_impl::NodeId; use servo_media::audio::node::AudioNodeType; use std::rc::Rc; +pub enum BaseAudioContextOptions { + AudioContext(RealTimeAudioGraphOptions), + OfflineAudioContext(OfflineAudioGraphOptions), +} + #[dom_struct] pub struct BaseAudioContext { reflector_: Reflector, @@ -37,12 +43,16 @@ impl BaseAudioContext { #[allow(unsafe_code)] pub fn new_inherited( global: &GlobalScope, - channel_count: u32, - sample_rate: f32, - ) -> BaseAudioContext { + options: BaseAudioContextOptions, + ) -> BaseAudioContext { + let options = match options { + BaseAudioContextOptions::AudioContext(options) => options, + BaseAudioContextOptions::OfflineAudioContext(_) => unimplemented!(), + }; + let sample_rate = options.sample_rate; let mut context = BaseAudioContext { reflector_: Reflector::new(), - audio_graph: ServoMedia::get().unwrap().create_audio_graph(), + audio_graph: ServoMedia::get().unwrap().create_audio_graph(Some(options.into())), destination: None, current_time: 0., sample_rate, @@ -50,7 +60,7 @@ impl BaseAudioContext { }; let mut options = unsafe { AudioNodeOptions::empty(global.get_cx()) }; - options.channelCount = Some(channel_count); + options.channelCount = Some(2); options.channelCountMode = Some(ChannelCountMode::Explicit); options.channelInterpretation = Some(ChannelInterpretation::Speakers);