Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement MediaStreamAudioDestinationNode, MediaStreamAudioSourceNode, MediaStreamTrackAudioSourceNode #27143

Merged
merged 10 commits into from Jul 3, 2020

Add AudioContext constructors for media stream nodes

  • Loading branch information
Manishearth committed Jul 2, 2020
commit 718304709e6be8d8dce3b3a4b20ddd2e0c3b64f2
@@ -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<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 {
@@ -27,10 +27,9 @@ impl MediaStreamAudioSourceNode {
#[allow(unrooted_must_root)]
pub fn new_inherited(
context: &AudioContext,
options: &MediaStreamAudioSourceOptions,
stream: &MediaStream,
) -> Fallible<MediaStreamAudioSourceNode> {
let track = options
.mediaStream
let track = stream
.get_tracks()
.iter()
.find(|t| t.ty() == MediaStreamType::Audio)
@@ -45,17 +44,17 @@ impl MediaStreamAudioSourceNode {
)?;
Ok(MediaStreamAudioSourceNode {
node,
stream: Dom::from_ref(&options.mediaStream),
stream: Dom::from_ref(&stream),
})
}

#[allow(unrooted_must_root)]
pub fn new(
window: &Window,
context: &AudioContext,
options: &MediaStreamAudioSourceOptions,
stream: &MediaStream,
) -> 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))
}

@@ -65,7 +64,7 @@ impl MediaStreamAudioSourceNode {
context: &AudioContext,
options: &MediaStreamAudioSourceOptions,
) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
MediaStreamAudioSourceNode::new(window, context, options)
MediaStreamAudioSourceNode::new(window, context, &options.mediaStream)
}
}

@@ -24,29 +24,28 @@ impl MediaStreamTrackAudioSourceNode {
#[allow(unrooted_must_root)]
pub fn new_inherited(
context: &AudioContext,
options: &MediaStreamTrackAudioSourceOptions,
track: &MediaStreamTrack,
) -> Fallible<MediaStreamTrackAudioSourceNode> {
let track = options.mediaStreamTrack.id();
let node = AudioNode::new_inherited(
AudioNodeInit::MediaStreamSourceNode(track),
AudioNodeInit::MediaStreamSourceNode(track.id()),
&context.upcast(),
Default::default(),
0, // inputs
1, // outputs
)?;
Ok(MediaStreamTrackAudioSourceNode {
node,
track: Dom::from_ref(&options.mediaStreamTrack),
track: Dom::from_ref(&track),
})
}

#[allow(unrooted_must_root)]
pub fn new(
window: &Window,
context: &AudioContext,
options: &MediaStreamTrackAudioSourceOptions,
track: &MediaStreamTrack,
) -> 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))
}

@@ -56,6 +55,6 @@ impl MediaStreamTrackAudioSourceNode {
context: &AudioContext,
options: &MediaStreamTrackAudioSourceOptions,
) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
MediaStreamTrackAudioSourceNode::new(window, context, options)
MediaStreamTrackAudioSourceNode::new(window, context, &options.mediaStreamTrack)
}
}
@@ -34,7 +34,7 @@ interface AudioContext : BaseAudioContext {
Promise<void> 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();
};
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.