diff --git a/components/script/dom/audiocontext.rs b/components/script/dom/audiocontext.rs index f7fb005f18d4..9a5160773f99 100644 --- a/components/script/dom/audiocontext.rs +++ b/components/script/dom/audiocontext.rs @@ -9,6 +9,7 @@ use crate::dom::bindings::codegen::Bindings::AudioContextBinding::{ use crate::dom::bindings::codegen::Bindings::AudioContextBinding::{ AudioContextOptions, AudioTimestamp, }; +use crate::dom::bindings::codegen::Bindings::AudioNodeBinding::AudioNodeOptions; use crate::dom::bindings::codegen::Bindings::BaseAudioContextBinding::AudioContextState; use crate::dom::bindings::codegen::Bindings::BaseAudioContextBinding::BaseAudioContextBinding::BaseAudioContextMethods; use crate::dom::bindings::codegen::UnionTypes::AudioContextLatencyCategoryOrDouble; @@ -20,6 +21,11 @@ use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::htmlmediaelement::HTMLMediaElement; use crate::dom::mediaelementaudiosourcenode::MediaElementAudioSourceNode; +use crate::dom::mediastream::MediaStream; +use crate::dom::mediastreamaudiodestinationnode::MediaStreamAudioDestinationNode; +use crate::dom::mediastreamaudiosourcenode::MediaStreamAudioSourceNode; +use crate::dom::mediastreamtrack::MediaStreamTrack; +use crate::dom::mediastreamtrackaudiosourcenode::MediaStreamTrackAudioSourceNode; use crate::dom::promise::Promise; use crate::dom::window::Window; use crate::realms::InRealm; @@ -254,6 +260,33 @@ impl AudioContextMethods for AudioContext { let window = global.as_window(); MediaElementAudioSourceNode::new(window, self, media_element) } + + /// https://webaudio.github.io/web-audio-api/#dom-audiocontext-createmediastreamsource + fn CreateMediaStreamSource( + &self, + stream: &MediaStream, + ) -> Fallible> { + let global = self.global(); + let window = global.as_window(); + MediaStreamAudioSourceNode::new(window, self, stream) + } + + /// https://webaudio.github.io/web-audio-api/#dom-audiocontext-createmediastreamtracksource + fn CreateMediaStreamTrackSource( + &self, + track: &MediaStreamTrack, + ) -> Fallible> { + let global = self.global(); + let window = global.as_window(); + MediaStreamTrackAudioSourceNode::new(window, self, track) + } + + /// https://webaudio.github.io/web-audio-api/#dom-audiocontext-createmediastreamdestination + fn CreateMediaStreamDestination(&self) -> Fallible> { + let global = self.global(); + let window = global.as_window(); + MediaStreamAudioDestinationNode::new(window, self, &AudioNodeOptions::empty()) + } } impl From for LatencyCategory { diff --git a/components/script/dom/mediastreamaudiosourcenode.rs b/components/script/dom/mediastreamaudiosourcenode.rs index dc0803adec39..f6925af75c37 100644 --- a/components/script/dom/mediastreamaudiosourcenode.rs +++ b/components/script/dom/mediastreamaudiosourcenode.rs @@ -27,10 +27,9 @@ impl MediaStreamAudioSourceNode { #[allow(unrooted_must_root)] pub fn new_inherited( context: &AudioContext, - options: &MediaStreamAudioSourceOptions, + stream: &MediaStream, ) -> Fallible { - let track = options - .mediaStream + let track = stream .get_tracks() .iter() .find(|t| t.ty() == MediaStreamType::Audio) @@ -45,7 +44,7 @@ impl MediaStreamAudioSourceNode { )?; Ok(MediaStreamAudioSourceNode { node, - stream: Dom::from_ref(&options.mediaStream), + stream: Dom::from_ref(&stream), }) } @@ -53,9 +52,9 @@ impl MediaStreamAudioSourceNode { pub fn new( window: &Window, context: &AudioContext, - options: &MediaStreamAudioSourceOptions, + stream: &MediaStream, ) -> Fallible> { - let node = MediaStreamAudioSourceNode::new_inherited(context, options)?; + let node = MediaStreamAudioSourceNode::new_inherited(context, stream)?; Ok(reflect_dom_object(Box::new(node), window)) } @@ -65,7 +64,7 @@ impl MediaStreamAudioSourceNode { context: &AudioContext, options: &MediaStreamAudioSourceOptions, ) -> Fallible> { - MediaStreamAudioSourceNode::new(window, context, options) + MediaStreamAudioSourceNode::new(window, context, &options.mediaStream) } } diff --git a/components/script/dom/mediastreamtrackaudiosourcenode.rs b/components/script/dom/mediastreamtrackaudiosourcenode.rs index 14cc99df0563..6399ee5f6a4f 100644 --- a/components/script/dom/mediastreamtrackaudiosourcenode.rs +++ b/components/script/dom/mediastreamtrackaudiosourcenode.rs @@ -24,11 +24,10 @@ impl MediaStreamTrackAudioSourceNode { #[allow(unrooted_must_root)] pub fn new_inherited( context: &AudioContext, - options: &MediaStreamTrackAudioSourceOptions, + track: &MediaStreamTrack, ) -> Fallible { - let track = options.mediaStreamTrack.id(); let node = AudioNode::new_inherited( - AudioNodeInit::MediaStreamSourceNode(track), + AudioNodeInit::MediaStreamSourceNode(track.id()), &context.upcast(), Default::default(), 0, // inputs @@ -36,7 +35,7 @@ impl MediaStreamTrackAudioSourceNode { )?; Ok(MediaStreamTrackAudioSourceNode { node, - track: Dom::from_ref(&options.mediaStreamTrack), + track: Dom::from_ref(&track), }) } @@ -44,9 +43,9 @@ impl MediaStreamTrackAudioSourceNode { pub fn new( window: &Window, context: &AudioContext, - options: &MediaStreamTrackAudioSourceOptions, + track: &MediaStreamTrack, ) -> Fallible> { - let node = MediaStreamTrackAudioSourceNode::new_inherited(context, options)?; + let node = MediaStreamTrackAudioSourceNode::new_inherited(context, track)?; Ok(reflect_dom_object(Box::new(node), window)) } @@ -56,6 +55,6 @@ impl MediaStreamTrackAudioSourceNode { context: &AudioContext, options: &MediaStreamTrackAudioSourceOptions, ) -> Fallible> { - MediaStreamTrackAudioSourceNode::new(window, context, options) + MediaStreamTrackAudioSourceNode::new(window, context, &options.mediaStreamTrack) } } diff --git a/components/script/dom/webidls/AudioContext.webidl b/components/script/dom/webidls/AudioContext.webidl index cd9e18edfa03..09d6693b690c 100644 --- a/components/script/dom/webidls/AudioContext.webidl +++ b/components/script/dom/webidls/AudioContext.webidl @@ -34,7 +34,7 @@ interface AudioContext : BaseAudioContext { Promise close(); [Throws] MediaElementAudioSourceNode createMediaElementSource(HTMLMediaElement mediaElement); - // MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream); - // MediaStreamTrackAudioSourceNode createMediaStreamTrackSource(MediaStreamTrack mediaStreamTrack); - // MediaStreamAudioDestinationNode createMediaStreamDestination(); + [Throws] MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream); + [Throws] MediaStreamTrackAudioSourceNode createMediaStreamTrackSource(MediaStreamTrack mediaStreamTrack); + [Throws] MediaStreamAudioDestinationNode createMediaStreamDestination(); };