Add AudioContext constructors for media stream nodes

This commit is contained in:
Manish Goregaokar 2020-07-02 12:02:03 -07:00
parent 0b998a1d1c
commit 718304709e
4 changed files with 48 additions and 17 deletions

View file

@ -9,6 +9,7 @@ use crate::dom::bindings::codegen::Bindings::AudioContextBinding::{
use crate::dom::bindings::codegen::Bindings::AudioContextBinding::{ use crate::dom::bindings::codegen::Bindings::AudioContextBinding::{
AudioContextOptions, AudioTimestamp, 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::AudioContextState;
use crate::dom::bindings::codegen::Bindings::BaseAudioContextBinding::BaseAudioContextBinding::BaseAudioContextMethods; use crate::dom::bindings::codegen::Bindings::BaseAudioContextBinding::BaseAudioContextBinding::BaseAudioContextMethods;
use crate::dom::bindings::codegen::UnionTypes::AudioContextLatencyCategoryOrDouble; 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::bindings::root::DomRoot;
use crate::dom::htmlmediaelement::HTMLMediaElement; use crate::dom::htmlmediaelement::HTMLMediaElement;
use crate::dom::mediaelementaudiosourcenode::MediaElementAudioSourceNode; 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::promise::Promise;
use crate::dom::window::Window; use crate::dom::window::Window;
use crate::realms::InRealm; use crate::realms::InRealm;
@ -254,6 +260,33 @@ impl AudioContextMethods for AudioContext {
let window = global.as_window(); let window = global.as_window();
MediaElementAudioSourceNode::new(window, self, media_element) MediaElementAudioSourceNode::new(window, self, media_element)
} }
/// https://webaudio.github.io/web-audio-api/#dom-audiocontext-createmediastreamsource
fn CreateMediaStreamSource(
&self,
stream: &MediaStream,
) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
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<DomRoot<MediaStreamTrackAudioSourceNode>> {
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<DomRoot<MediaStreamAudioDestinationNode>> {
let global = self.global();
let window = global.as_window();
MediaStreamAudioDestinationNode::new(window, self, &AudioNodeOptions::empty())
}
} }
impl From<AudioContextLatencyCategory> for LatencyCategory { impl From<AudioContextLatencyCategory> for LatencyCategory {

View file

@ -27,10 +27,9 @@ impl MediaStreamAudioSourceNode {
#[allow(unrooted_must_root)] #[allow(unrooted_must_root)]
pub fn new_inherited( pub fn new_inherited(
context: &AudioContext, context: &AudioContext,
options: &MediaStreamAudioSourceOptions, stream: &MediaStream,
) -> Fallible<MediaStreamAudioSourceNode> { ) -> Fallible<MediaStreamAudioSourceNode> {
let track = options let track = stream
.mediaStream
.get_tracks() .get_tracks()
.iter() .iter()
.find(|t| t.ty() == MediaStreamType::Audio) .find(|t| t.ty() == MediaStreamType::Audio)
@ -45,7 +44,7 @@ impl MediaStreamAudioSourceNode {
)?; )?;
Ok(MediaStreamAudioSourceNode { Ok(MediaStreamAudioSourceNode {
node, node,
stream: Dom::from_ref(&options.mediaStream), stream: Dom::from_ref(&stream),
}) })
} }
@ -53,9 +52,9 @@ impl MediaStreamAudioSourceNode {
pub fn new( pub fn new(
window: &Window, window: &Window,
context: &AudioContext, context: &AudioContext,
options: &MediaStreamAudioSourceOptions, stream: &MediaStream,
) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> { ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
let node = MediaStreamAudioSourceNode::new_inherited(context, options)?; let node = MediaStreamAudioSourceNode::new_inherited(context, stream)?;
Ok(reflect_dom_object(Box::new(node), window)) Ok(reflect_dom_object(Box::new(node), window))
} }
@ -65,7 +64,7 @@ impl MediaStreamAudioSourceNode {
context: &AudioContext, context: &AudioContext,
options: &MediaStreamAudioSourceOptions, options: &MediaStreamAudioSourceOptions,
) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> { ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
MediaStreamAudioSourceNode::new(window, context, options) MediaStreamAudioSourceNode::new(window, context, &options.mediaStream)
} }
} }

View file

@ -24,11 +24,10 @@ impl MediaStreamTrackAudioSourceNode {
#[allow(unrooted_must_root)] #[allow(unrooted_must_root)]
pub fn new_inherited( pub fn new_inherited(
context: &AudioContext, context: &AudioContext,
options: &MediaStreamTrackAudioSourceOptions, track: &MediaStreamTrack,
) -> Fallible<MediaStreamTrackAudioSourceNode> { ) -> Fallible<MediaStreamTrackAudioSourceNode> {
let track = options.mediaStreamTrack.id();
let node = AudioNode::new_inherited( let node = AudioNode::new_inherited(
AudioNodeInit::MediaStreamSourceNode(track), AudioNodeInit::MediaStreamSourceNode(track.id()),
&context.upcast(), &context.upcast(),
Default::default(), Default::default(),
0, // inputs 0, // inputs
@ -36,7 +35,7 @@ impl MediaStreamTrackAudioSourceNode {
)?; )?;
Ok(MediaStreamTrackAudioSourceNode { Ok(MediaStreamTrackAudioSourceNode {
node, node,
track: Dom::from_ref(&options.mediaStreamTrack), track: Dom::from_ref(&track),
}) })
} }
@ -44,9 +43,9 @@ impl MediaStreamTrackAudioSourceNode {
pub fn new( pub fn new(
window: &Window, window: &Window,
context: &AudioContext, context: &AudioContext,
options: &MediaStreamTrackAudioSourceOptions, track: &MediaStreamTrack,
) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> { ) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
let node = MediaStreamTrackAudioSourceNode::new_inherited(context, options)?; let node = MediaStreamTrackAudioSourceNode::new_inherited(context, track)?;
Ok(reflect_dom_object(Box::new(node), window)) Ok(reflect_dom_object(Box::new(node), window))
} }
@ -56,6 +55,6 @@ impl MediaStreamTrackAudioSourceNode {
context: &AudioContext, context: &AudioContext,
options: &MediaStreamTrackAudioSourceOptions, options: &MediaStreamTrackAudioSourceOptions,
) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> { ) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
MediaStreamTrackAudioSourceNode::new(window, context, options) MediaStreamTrackAudioSourceNode::new(window, context, &options.mediaStreamTrack)
} }
} }

View file

@ -34,7 +34,7 @@ interface AudioContext : BaseAudioContext {
Promise<void> close(); Promise<void> close();
[Throws] MediaElementAudioSourceNode createMediaElementSource(HTMLMediaElement mediaElement); [Throws] MediaElementAudioSourceNode createMediaElementSource(HTMLMediaElement mediaElement);
// MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream); [Throws] MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream);
// MediaStreamTrackAudioSourceNode createMediaStreamTrackSource(MediaStreamTrack mediaStreamTrack); [Throws] MediaStreamTrackAudioSourceNode createMediaStreamTrackSource(MediaStreamTrack mediaStreamTrack);
// MediaStreamAudioDestinationNode createMediaStreamDestination(); [Throws] MediaStreamAudioDestinationNode createMediaStreamDestination();
}; };