From 1323a8758d8cab74195b6d32e5c51d33af6565d6 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 11 Jul 2018 15:34:20 -0700 Subject: [PATCH 1/6] Split out gstreamer stuff into separate crate --- Cargo.lock | 11 +++++++- Cargo.toml | 2 +- servo-media-gstreamer/Cargo.toml | 24 +++++++++++++++++ .../src}/audio_decoder.rs | 2 +- .../src}/audio_sink.rs | 10 +++---- servo-media-gstreamer/src/lib.rs | 26 +++++++++++++++++++ servo-media/Cargo.toml | 17 ------------ servo-media/src/audio/context.rs | 22 +++++++++++----- servo-media/src/audio/render_thread.rs | 12 ++++----- servo-media/src/backends/gstreamer/mod.rs | 5 ---- servo-media/src/backends/mod.rs | 2 -- servo-media/src/lib.rs | 7 ++--- 12 files changed, 91 insertions(+), 49 deletions(-) create mode 100644 servo-media-gstreamer/Cargo.toml rename {servo-media/src/backends/gstreamer => servo-media-gstreamer/src}/audio_decoder.rs (98%) rename {servo-media/src/backends/gstreamer => servo-media-gstreamer/src}/audio_sink.rs (96%) create mode 100644 servo-media-gstreamer/src/lib.rs delete mode 100644 servo-media/src/backends/gstreamer/mod.rs delete mode 100644 servo-media/src/backends/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 7fa4aa93..a540f436 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -420,7 +420,7 @@ dependencies = [ ] [[package]] -name = "servo_media" +name = "servo-media-gstreamer" version = "0.1.0" dependencies = [ "byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -428,6 +428,15 @@ dependencies = [ "gstreamer-app 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-audio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "servo_media 0.1.0", +] + +[[package]] +name = "servo_media" +version = "0.1.0" +dependencies = [ + "byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", "petgraph 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "servo_media_derive 0.1.0", diff --git a/Cargo.toml b/Cargo.toml index 07f18d87..54df0b9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["servo-media", "servo-media-derive", "examples"] +members = ["servo-media", "servo-media-derive", "servo-media-gstreamer", "examples"] license = "MPL-2.0" diff --git a/servo-media-gstreamer/Cargo.toml b/servo-media-gstreamer/Cargo.toml new file mode 100644 index 00000000..8a528df4 --- /dev/null +++ b/servo-media-gstreamer/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "servo-media-gstreamer" +version = "0.1.0" +authors = ["Manish Goregaokar "] + + + +[dependencies.byte-slice-cast] +version = "0.1" + +[dependencies.gstreamer] +version = "0.11" + +[dependencies.gstreamer-app] +version = "0.11.2" + +[dependencies.gstreamer-audio] +version = "0.11" + +[dependencies.num-traits] +version = "0.1" + +[dependencies.servo_media] +path = "../servo-media" \ No newline at end of file diff --git a/servo-media/src/backends/gstreamer/audio_decoder.rs b/servo-media-gstreamer/src/audio_decoder.rs similarity index 98% rename from servo-media/src/backends/gstreamer/audio_decoder.rs rename to servo-media-gstreamer/src/audio_decoder.rs index d1cca275..983e2c74 100644 --- a/servo-media/src/backends/gstreamer/audio_decoder.rs +++ b/servo-media-gstreamer/src/audio_decoder.rs @@ -1,6 +1,6 @@ use super::gst_app::{AppSink, AppSinkCallbacks, AppSrc}; use super::gst_audio; -use audio::decoder::{AudioDecoder, AudioDecoderCallbacks, AudioDecoderOptions}; +use servo_media::audio::decoder::{AudioDecoder, AudioDecoderCallbacks, AudioDecoderOptions}; use byte_slice_cast::*; use gst; use gst::buffer::{MappedBuffer, Readable}; diff --git a/servo-media/src/backends/gstreamer/audio_sink.rs b/servo-media-gstreamer/src/audio_sink.rs similarity index 96% rename from servo-media/src/backends/gstreamer/audio_sink.rs rename to servo-media-gstreamer/src/audio_sink.rs index 686dd84b..5443761e 100644 --- a/servo-media/src/backends/gstreamer/audio_sink.rs +++ b/servo-media-gstreamer/src/audio_sink.rs @@ -1,8 +1,8 @@ -use super::gst_app::{AppSrc, AppSrcCallbacks}; -use super::gst_audio; -use audio::block::{Chunk, FRAMES_PER_BLOCK}; -use audio::render_thread::AudioRenderThreadMsg; -use audio::sink::AudioSink; +use gst_app::{AppSrc, AppSrcCallbacks}; +use gst_audio; +use servo_media::audio::block::{Chunk, FRAMES_PER_BLOCK}; +use servo_media::audio::render_thread::AudioRenderThreadMsg; +use servo_media::audio::sink::AudioSink; use byte_slice_cast::*; use gst; use gst::prelude::*; diff --git a/servo-media-gstreamer/src/lib.rs b/servo-media-gstreamer/src/lib.rs new file mode 100644 index 00000000..8b6a4e67 --- /dev/null +++ b/servo-media-gstreamer/src/lib.rs @@ -0,0 +1,26 @@ +use servo_media::audio::context::AudioBackend; + +extern crate gstreamer_app as gst_app; +extern crate gstreamer_audio as gst_audio; +extern crate gstreamer as gst; + +extern crate servo_media; + +extern crate num_traits; +extern crate byte_slice_cast; + +pub mod audio_decoder; +pub mod audio_sink; + +pub struct GStreamerBackend; + +impl AudioBackend for GStreamerBackend { + type Decoder = audio_decoder::GStreamerAudioDecoder; + type Sink = audio_sink::GStreamerAudioSink; + fn make_decoder() -> Self::Decoder { + audio_decoder::GStreamerAudioDecoder::new() + } + fn make_sink() -> Result { + audio_sink::GStreamerAudioSink::new() + } +} \ No newline at end of file diff --git a/servo-media/Cargo.toml b/servo-media/Cargo.toml index 46b443e5..e9eafebe 100644 --- a/servo-media/Cargo.toml +++ b/servo-media/Cargo.toml @@ -17,28 +17,11 @@ version = "0.4.12" features = ["stable_graph"] [dependencies.byte-slice-cast] -optional = true version = "0.1" -[dependencies.gstreamer] -optional = true -version = "0.11" - -[dependencies.gstreamer-app] -optional = true -version = "0.11.2" - -[dependencies.gstreamer-audio] -optional = true -version = "0.11" [dependencies.num-traits] -optional = true version = "0.1" -[features] -default = ["gst"] -gst = ["gstreamer", "gstreamer-audio", "gstreamer-app", "byte-slice-cast", "num-traits"] - [lib] name = "servo_media" diff --git a/servo-media/src/audio/context.rs b/servo-media/src/audio/context.rs index 64d8a42b..d2cef29d 100644 --- a/servo-media/src/audio/context.rs +++ b/servo-media/src/audio/context.rs @@ -1,3 +1,5 @@ +use std::marker::PhantomData; +use audio::sink::AudioSink; use audio::decoder::{AudioDecoder, AudioDecoderCallbacks, AudioDecoderOptions}; use audio::graph::{AudioGraph, InputPort, NodeId, OutputPort, PortId}; use audio::node::{AudioNodeMessage, AudioNodeInit}; @@ -99,7 +101,7 @@ impl Default for AudioContextOptions { } /// Representation of an audio context on the control thread. -pub struct AudioContext { +pub struct AudioContext { /// Rendering thread communication channel. sender: Sender, /// State of the audio context on the control thread. @@ -109,9 +111,10 @@ pub struct AudioContext { /// The identifier of an AudioDestinationNode with a single input /// representing the final destination for all audio. dest_node: NodeId, + backend: PhantomData, } -impl AudioContext { +impl AudioContext { /// Constructs a new audio context. pub fn new(options: AudioContextOptions) -> Self { let options = match options { @@ -127,7 +130,7 @@ impl AudioContext { Builder::new() .name("AudioRenderThread".to_owned()) .spawn(move || { - AudioRenderThread::start(receiver, sender_, options.sample_rate, graph) + AudioRenderThread::::start(receiver, sender_, options.sample_rate, graph) .expect("Could not start AudioRenderThread"); }) .unwrap(); @@ -136,6 +139,7 @@ impl AudioContext { state: Cell::new(ProcessingState::Suspended), sample_rate, dest_node, + backend: PhantomData, } } @@ -224,8 +228,7 @@ impl AudioContext { Builder::new() .name("AudioDecoder".to_owned()) .spawn(move || { - #[cfg(feature = "gst")] - let audio_decoder = GStreamerAudioDecoder::new(); + let audio_decoder = B::make_decoder(); audio_decoder.decode(data, callbacks, Some(options)); }) @@ -233,9 +236,16 @@ impl AudioContext { } } -impl Drop for AudioContext { +impl Drop for AudioContext { fn drop(&mut self) { let (tx, _) = mpsc::channel(); let _ = self.sender.send(AudioRenderThreadMsg::Close(tx)); } } + +pub trait AudioBackend { + type Decoder: AudioDecoder; + type Sink: AudioSink; + fn make_decoder() -> Self::Decoder; + fn make_sink() -> Result; +} diff --git a/servo-media/src/audio/render_thread.rs b/servo-media/src/audio/render_thread.rs index 45a9fda5..de69f469 100644 --- a/servo-media/src/audio/render_thread.rs +++ b/servo-media/src/audio/render_thread.rs @@ -1,3 +1,4 @@ +use audio::context::AudioBackend; use audio::block::{Chunk, Tick, FRAMES_PER_BLOCK}; use audio::buffer_source_node::AudioBufferSourceNode; use audio::channel_node::{ChannelMergerNode, ChannelSplitterNode}; @@ -32,16 +33,16 @@ pub enum AudioRenderThreadMsg { DisconnectOutputBetweenTo(PortId, PortId), } -pub struct AudioRenderThread { +pub struct AudioRenderThread { pub graph: AudioGraph, - pub sink: Box, + pub sink: B::Sink, pub state: ProcessingState, pub sample_rate: f32, pub current_time: f64, pub current_frame: Tick, } -impl AudioRenderThread { +impl AudioRenderThread { /// Start the audio render thread pub fn start( event_queue: Receiver, @@ -49,12 +50,11 @@ impl AudioRenderThread { sample_rate: f32, graph: AudioGraph, ) -> Result<(), ()> { - #[cfg(feature = "gst")] - let sink = GStreamerAudioSink::new()?; + let sink = B::make_sink()?; let mut graph = Self { graph, - sink: Box::new(sink), + sink, state: ProcessingState::Suspended, sample_rate, current_time: 0., diff --git a/servo-media/src/backends/gstreamer/mod.rs b/servo-media/src/backends/gstreamer/mod.rs deleted file mode 100644 index aab71930..00000000 --- a/servo-media/src/backends/gstreamer/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -extern crate gstreamer_app as gst_app; -extern crate gstreamer_audio as gst_audio; - -pub mod audio_decoder; -pub mod audio_sink; diff --git a/servo-media/src/backends/mod.rs b/servo-media/src/backends/mod.rs deleted file mode 100644 index f854ec87..00000000 --- a/servo-media/src/backends/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -#[cfg(feature = "gst")] -pub mod gstreamer; diff --git a/servo-media/src/lib.rs b/servo-media/src/lib.rs index 110091f2..fd36075b 100644 --- a/servo-media/src/lib.rs +++ b/servo-media/src/lib.rs @@ -1,14 +1,12 @@ #![feature(fnbox)] +use audio::context::AudioBackend; use std::sync::{self, Once}; use std::sync::{Arc, Mutex}; #[macro_use] extern crate servo_media_derive; -#[cfg(feature = "gst")] -extern crate gstreamer as gst; - extern crate byte_slice_cast; extern crate num_traits; extern crate petgraph; @@ -16,7 +14,6 @@ extern crate smallvec; #[macro_use] pub mod audio; -mod backends; use audio::context::{AudioContext, AudioContextOptions}; @@ -44,7 +41,7 @@ impl ServoMedia { } } - pub fn create_audio_context(&self, options: AudioContextOptions) -> AudioContext { + pub fn create_audio_context(&self, options: AudioContextOptions) -> AudioContext { AudioContext::new(options) } } From 22a85d6f4d723ad53133855fb520093f2945cfb7 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 11 Jul 2018 16:02:41 -0700 Subject: [PATCH 2/6] Move audio module to its own crate --- Cargo.lock | 26 ++- Cargo.toml | 2 +- examples/Cargo.toml | 2 +- servo-media-audio/Cargo.toml | 29 +++ {servo-media => servo-media-audio}/build.rs | 0 .../audio => servo-media-audio/src}/block.rs | 4 +- .../src}/buffer_source_node.rs | 8 +- .../src}/channel_node.rs | 10 +- .../src}/context.rs | 13 +- .../src}/decoder.rs | 0 .../src}/destination_node.rs | 6 +- .../src}/gain_node.rs | 12 +- .../audio => servo-media-audio/src}/graph.rs | 6 +- .../mod.rs => servo-media-audio/src/lib.rs | 9 + .../audio => servo-media-audio/src}/macros.rs | 4 +- servo-media-audio/src/mod.rs | 0 .../audio => servo-media-audio/src}/node.rs | 12 +- servo-media-audio/src/node.rs.orig | 182 ++++++++++++++++++ .../src}/oscillator_node.rs | 8 +- .../audio => servo-media-audio/src}/param.rs | 4 +- .../src}/render_thread.rs | 24 +-- .../audio => servo-media-audio/src}/sink.rs | 4 +- servo-media-derive/src/lib.rs | 8 +- servo-media-gstreamer/Cargo.toml | 4 +- servo-media-gstreamer/src/audio_decoder.rs | 2 +- servo-media-gstreamer/src/audio_sink.rs | 6 +- servo-media-gstreamer/src/lib.rs | 9 +- servo-media/Cargo.toml | 29 +-- servo-media/src/lib.rs | 23 +-- 29 files changed, 328 insertions(+), 118 deletions(-) create mode 100644 servo-media-audio/Cargo.toml rename {servo-media => servo-media-audio}/build.rs (100%) rename {servo-media/src/audio => servo-media-audio/src}/block.rs (99%) rename {servo-media/src/audio => servo-media-audio/src}/buffer_source_node.rs (96%) rename {servo-media/src/audio => servo-media-audio/src}/channel_node.rs (92%) rename {servo-media/src/audio => servo-media-audio/src}/context.rs (96%) rename {servo-media/src/audio => servo-media-audio/src}/decoder.rs (100%) rename {servo-media/src/audio => servo-media-audio/src}/destination_node.rs (87%) rename {servo-media/src/audio => servo-media-audio/src}/gain_node.rs (88%) rename {servo-media/src/audio => servo-media-audio/src}/graph.rs (99%) rename servo-media/src/audio/mod.rs => servo-media-audio/src/lib.rs (62%) rename {servo-media/src/audio => servo-media-audio/src}/macros.rs (83%) create mode 100644 servo-media-audio/src/mod.rs rename {servo-media/src/audio => servo-media-audio/src}/node.rs (94%) create mode 100644 servo-media-audio/src/node.rs.orig rename {servo-media/src/audio => servo-media-audio/src}/oscillator_node.rs (95%) rename {servo-media/src/audio => servo-media-audio/src}/param.rs (99%) rename {servo-media/src/audio => servo-media-audio/src}/render_thread.rs (92%) rename {servo-media/src/audio => servo-media-audio/src}/sink.rs (83%) diff --git a/Cargo.lock b/Cargo.lock index a540f436..e5940f40 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -83,7 +83,7 @@ name = "examples" version = "0.1.0" dependencies = [ "rand 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "servo_media 0.1.0", + "servo-media 0.1.0", ] [[package]] @@ -420,19 +420,15 @@ dependencies = [ ] [[package]] -name = "servo-media-gstreamer" +name = "servo-media" version = "0.1.0" dependencies = [ - "byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gstreamer 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", - "gstreamer-app 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", - "gstreamer-audio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", - "servo_media 0.1.0", + "servo-media-audio 0.1.0", + "servo-media-gstreamer 0.1.0", ] [[package]] -name = "servo_media" +name = "servo-media-audio" version = "0.1.0" dependencies = [ "byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -444,6 +440,18 @@ dependencies = [ "zip 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "servo-media-gstreamer" +version = "0.1.0" +dependencies = [ + "byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-app 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-audio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "servo-media-audio 0.1.0", +] + [[package]] name = "servo_media_derive" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 54df0b9e..3c6a50bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["servo-media", "servo-media-derive", "servo-media-gstreamer", "examples"] +members = ["servo-media", "servo-media-derive", "servo-media-audio", "servo-media-gstreamer", "examples"] license = "MPL-2.0" diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 500122ba..eea16acc 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -5,7 +5,7 @@ license = "MPL-2.0" [dependencies] rand = "0.5.0" -servo_media = { path = "../servo-media" } +servo-media = { path = "../servo-media" } [[bin]] name = "audio_decoder" diff --git a/servo-media-audio/Cargo.toml b/servo-media-audio/Cargo.toml new file mode 100644 index 00000000..2eabf7f2 --- /dev/null +++ b/servo-media-audio/Cargo.toml @@ -0,0 +1,29 @@ +[package] +authors = ["Fernando Jiménez Moreno "] +license = "MPL-2.0" +name = "servo-media-audio" +version = "0.1.0" + + +[lib] +name = "servo_media_audio" + + +[build-dependencies] +regex = "1.0" +zip = "0.3.1" + +[dependencies] +smallvec = "0.6.1" +servo_media_derive = { path = "../servo-media-derive" } + +[dependencies.petgraph] +version = "0.4.12" +features = ["stable_graph"] + +[dependencies.byte-slice-cast] +version = "0.1" + + +[dependencies.num-traits] +version = "0.1" diff --git a/servo-media/build.rs b/servo-media-audio/build.rs similarity index 100% rename from servo-media/build.rs rename to servo-media-audio/build.rs diff --git a/servo-media/src/audio/block.rs b/servo-media-audio/src/block.rs similarity index 99% rename from servo-media/src/audio/block.rs rename to servo-media-audio/src/block.rs index fcc2288a..ffa1f803 100644 --- a/servo-media/src/audio/block.rs +++ b/servo-media-audio/src/block.rs @@ -1,6 +1,6 @@ use std::f32::consts::SQRT_2; -use audio::node::ChannelInterpretation; -use audio::graph::PortIndex; +use node::ChannelInterpretation; +use graph::PortIndex; use byte_slice_cast::*; use smallvec::SmallVec; use std::ops::*; diff --git a/servo-media/src/audio/buffer_source_node.rs b/servo-media-audio/src/buffer_source_node.rs similarity index 96% rename from servo-media/src/audio/buffer_source_node.rs rename to servo-media-audio/src/buffer_source_node.rs index 3b7a2dcb..d8fd2fcf 100644 --- a/servo-media/src/audio/buffer_source_node.rs +++ b/servo-media-audio/src/buffer_source_node.rs @@ -1,7 +1,7 @@ -use audio::node::{AudioNodeType, ChannelInfo}; -use audio::block::{Block, Chunk, Tick, FRAMES_PER_BLOCK}; -use audio::node::{AudioNodeEngine, AudioScheduledSourceNodeMessage, BlockInfo}; -use audio::param::{Param, ParamType}; +use node::{AudioNodeType, ChannelInfo}; +use block::{Block, Chunk, Tick, FRAMES_PER_BLOCK}; +use node::{AudioNodeEngine, AudioScheduledSourceNodeMessage, BlockInfo}; +use param::{Param, ParamType}; /// Control messages directed to AudioBufferSourceNodes. #[derive(Debug, Clone)] diff --git a/servo-media/src/audio/channel_node.rs b/servo-media-audio/src/channel_node.rs similarity index 92% rename from servo-media/src/audio/channel_node.rs rename to servo-media-audio/src/channel_node.rs index 4d3b126b..5ad7548a 100644 --- a/servo-media/src/audio/channel_node.rs +++ b/servo-media-audio/src/channel_node.rs @@ -1,8 +1,8 @@ -use audio::block::FRAMES_PER_BLOCK_USIZE; -use audio::node::AudioNodeType; -use audio::node::{AudioNodeEngine, ChannelCountMode, ChannelInfo, ChannelInterpretation}; -use audio::block::{Block, Chunk}; -use audio::node::BlockInfo; +use block::FRAMES_PER_BLOCK_USIZE; +use node::AudioNodeType; +use node::{AudioNodeEngine, ChannelCountMode, ChannelInfo, ChannelInterpretation}; +use block::{Block, Chunk}; +use node::BlockInfo; #[derive(Copy, Clone, Debug)] pub struct ChannelNodeOptions { diff --git a/servo-media/src/audio/context.rs b/servo-media-audio/src/context.rs similarity index 96% rename from servo-media/src/audio/context.rs rename to servo-media-audio/src/context.rs index d2cef29d..c5736510 100644 --- a/servo-media/src/audio/context.rs +++ b/servo-media-audio/src/context.rs @@ -1,10 +1,10 @@ use std::marker::PhantomData; -use audio::sink::AudioSink; -use audio::decoder::{AudioDecoder, AudioDecoderCallbacks, AudioDecoderOptions}; -use audio::graph::{AudioGraph, InputPort, NodeId, OutputPort, PortId}; -use audio::node::{AudioNodeMessage, AudioNodeInit}; -use audio::render_thread::AudioRenderThread; -use audio::render_thread::AudioRenderThreadMsg; +use sink::AudioSink; +use decoder::{AudioDecoder, AudioDecoderCallbacks, AudioDecoderOptions}; +use graph::{AudioGraph, InputPort, NodeId, OutputPort, PortId}; +use node::{AudioNodeMessage, AudioNodeInit}; +use render_thread::AudioRenderThread; +use render_thread::AudioRenderThreadMsg; use std::cell::Cell; use std::sync::mpsc::{self, Sender}; use std::thread::Builder; @@ -248,4 +248,5 @@ pub trait AudioBackend { type Sink: AudioSink; fn make_decoder() -> Self::Decoder; fn make_sink() -> Result; + fn init(); } diff --git a/servo-media/src/audio/decoder.rs b/servo-media-audio/src/decoder.rs similarity index 100% rename from servo-media/src/audio/decoder.rs rename to servo-media-audio/src/decoder.rs diff --git a/servo-media/src/audio/destination_node.rs b/servo-media-audio/src/destination_node.rs similarity index 87% rename from servo-media/src/audio/destination_node.rs rename to servo-media-audio/src/destination_node.rs index 7fe3757e..a4ac02cc 100644 --- a/servo-media/src/audio/destination_node.rs +++ b/servo-media-audio/src/destination_node.rs @@ -1,6 +1,6 @@ -use audio::node::{AudioNodeType, ChannelCountMode, ChannelInfo}; -use audio::node::{AudioNodeEngine, BlockInfo}; -use audio::block::Chunk; +use node::{AudioNodeType, ChannelCountMode, ChannelInfo}; +use node::{AudioNodeEngine, BlockInfo}; +use block::Chunk; #[derive(AudioNodeCommon)] pub(crate) struct DestinationNode { diff --git a/servo-media/src/audio/gain_node.rs b/servo-media-audio/src/gain_node.rs similarity index 88% rename from servo-media/src/audio/gain_node.rs rename to servo-media-audio/src/gain_node.rs index 498fd3db..b06554ca 100644 --- a/servo-media/src/audio/gain_node.rs +++ b/servo-media-audio/src/gain_node.rs @@ -1,9 +1,9 @@ -use audio::node::{AudioNodeType, ChannelInfo}; -use audio::block::Chunk; -use audio::block::Tick; -use audio::node::AudioNodeEngine; -use audio::node::BlockInfo; -use audio::param::{Param, ParamType}; +use node::{AudioNodeType, ChannelInfo}; +use block::Chunk; +use block::Tick; +use node::AudioNodeEngine; +use node::BlockInfo; +use param::{Param, ParamType}; #[derive(Copy, Clone, Debug)] pub struct GainNodeOptions { diff --git a/servo-media/src/audio/graph.rs b/servo-media-audio/src/graph.rs similarity index 99% rename from servo-media/src/audio/graph.rs rename to servo-media-audio/src/graph.rs index efdb08ee..dd56d87b 100644 --- a/servo-media/src/audio/graph.rs +++ b/servo-media-audio/src/graph.rs @@ -1,7 +1,7 @@ use smallvec::SmallVec; -use audio::block::{Block, Chunk}; -use audio::destination_node::DestinationNode; -use audio::node::{AudioNodeEngine, BlockInfo, ChannelCountMode}; +use block::{Block, Chunk}; +use destination_node::DestinationNode; +use node::{AudioNodeEngine, BlockInfo, ChannelCountMode}; use petgraph::Direction; use petgraph::graph::DefaultIx; use petgraph::stable_graph::NodeIndex; diff --git a/servo-media/src/audio/mod.rs b/servo-media-audio/src/lib.rs similarity index 62% rename from servo-media/src/audio/mod.rs rename to servo-media-audio/src/lib.rs index 8bc2e32e..474eabfb 100644 --- a/servo-media/src/audio/mod.rs +++ b/servo-media-audio/src/lib.rs @@ -1,3 +1,12 @@ +#![feature(fnbox)] + +#[macro_use] +extern crate servo_media_derive; + +extern crate byte_slice_cast; +extern crate num_traits; +extern crate petgraph; +extern crate smallvec; #[macro_use] pub mod macros; diff --git a/servo-media/src/audio/macros.rs b/servo-media-audio/src/macros.rs similarity index 83% rename from servo-media/src/audio/macros.rs rename to servo-media-audio/src/macros.rs index 74dae718..a7ff531c 100644 --- a/servo-media/src/audio/macros.rs +++ b/servo-media-audio/src/macros.rs @@ -5,9 +5,9 @@ macro_rules! make_message_handler( $node:ident: $handler:ident ),+ ) => ( - fn message_specific(&mut self, msg: ::audio::node::AudioNodeMessage, sample_rate: f32) { + fn message_specific(&mut self, msg: ::node::AudioNodeMessage, sample_rate: f32) { match msg { - $(::audio::node::AudioNodeMessage::$node(m) => self.$handler(m, sample_rate)),+, + $(::node::AudioNodeMessage::$node(m) => self.$handler(m, sample_rate)),+, _ => (), } } diff --git a/servo-media-audio/src/mod.rs b/servo-media-audio/src/mod.rs new file mode 100644 index 00000000..e69de29b diff --git a/servo-media/src/audio/node.rs b/servo-media-audio/src/node.rs similarity index 94% rename from servo-media/src/audio/node.rs rename to servo-media-audio/src/node.rs index 1dfdde48..09f1e3d4 100644 --- a/servo-media/src/audio/node.rs +++ b/servo-media-audio/src/node.rs @@ -1,9 +1,9 @@ -use audio::param::{Param, ParamType, UserAutomationEvent}; -use audio::channel_node::ChannelNodeOptions; -use audio::block::{Chunk, Tick}; -use audio::buffer_source_node::{AudioBufferSourceNodeMessage, AudioBufferSourceNodeOptions}; -use audio::gain_node::GainNodeOptions; -use audio::oscillator_node::OscillatorNodeOptions; +use param::{Param, ParamType, UserAutomationEvent}; +use channel_node::ChannelNodeOptions; +use block::{Chunk, Tick}; +use buffer_source_node::{AudioBufferSourceNodeMessage, AudioBufferSourceNodeOptions}; +use gain_node::GainNodeOptions; +use oscillator_node::OscillatorNodeOptions; /// Information required to construct an audio node #[derive(Debug, Clone)] diff --git a/servo-media-audio/src/node.rs.orig b/servo-media-audio/src/node.rs.orig new file mode 100644 index 00000000..7e2ea2a1 --- /dev/null +++ b/servo-media-audio/src/node.rs.orig @@ -0,0 +1,182 @@ +<<<<<<< HEAD +use audio::param::{Param, ParamType}; +||||||| parent of 8a3d52e... Switch over to ParamIds for everything +use audio::param::Param; +use audio::param::ParamId; +======= +use audio::param::{Param, ParamType, UserAutomationEvent}; +>>>>>>> 8a3d52e... Switch over to ParamIds for everything +use audio::channel_node::ChannelNodeOptions; +use audio::block::{Chunk, Tick}; +use audio::buffer_source_node::{AudioBufferSourceNodeMessage, AudioBufferSourceNodeOptions}; +use audio::gain_node::GainNodeOptions; +use audio::oscillator_node::OscillatorNodeOptions; + +/// Type of AudioNodeEngine. +#[derive(Debug, Clone)] +pub enum AudioNodeType { + AnalyserNode, + BiquadFilterNode, + AudioBuffer, + AudioBufferSourceNode(AudioBufferSourceNodeOptions), + ChannelMergerNode(ChannelNodeOptions), + ChannelSplitterNode(ChannelNodeOptions), + ConstantSourceNode, + ConvolverNode, + DelayNode, + DestinationNode, + DynamicsCompressionNode, + GainNode(GainNodeOptions), + IIRFilterNode, + OscillatorNode(OscillatorNodeOptions), + PannerNode, + PeriodicWave, + ScriptProcessorNode, + StereoPannerNode, + WaveShaperNode, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum ChannelCountMode { + Max, + ClampedMax, + Explicit +} + + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum ChannelInterpretation { + Discrete, + Speakers +} + +#[derive(Copy, Clone)] +pub struct BlockInfo { + pub sample_rate: f32, + pub frame: Tick, + pub time: f64, +} + +impl BlockInfo { + /// Given the current block, calculate the absolute zero-relative + /// tick of the given tick + pub fn absolute_tick(&self, tick: Tick) -> Tick { + self.frame + tick + } +} + + +pub struct ChannelInfo { + pub count: u8, + pub mode: ChannelCountMode, + pub interpretation: ChannelInterpretation, +} + +impl Default for ChannelInfo { + fn default() -> Self { + ChannelInfo { + count: 2, + mode: ChannelCountMode::Max, + interpretation: ChannelInterpretation::Speakers, + } + } +} + + +pub trait AudioNodeCommon { + fn channel_info(&self) -> &ChannelInfo; + + fn channel_info_mut(&mut self) -> &mut ChannelInfo; +} + +/// This trait represents the common features of all audio nodes. +pub trait AudioNodeEngine: Send + AudioNodeCommon { + fn node_type(&self) -> &'static str; + + fn process(&mut self, inputs: Chunk, info: &BlockInfo) -> Chunk; + + fn message(&mut self, msg: AudioNodeMessage, sample_rate: f32) { + match msg { + AudioNodeMessage::SetChannelCount(c) => self.set_channel_count(c), + AudioNodeMessage::SetChannelMode(c) => self.set_channel_count_mode(c), + AudioNodeMessage::SetChannelInterpretation(c) => self.set_channel_interpretation(c), + AudioNodeMessage::SetParam(id, event) => { + self.get_param(id).insert_event(event.to_event(sample_rate)) + } + _ => self.message_specific(msg, sample_rate), + } + } + + /// Messages specific to this node + fn message_specific(&mut self, _: AudioNodeMessage, _sample_rate: f32) {} + + fn input_count(&self) -> u32 { + 1 + } + fn output_count(&self) -> u32 { + 1 + } + + /// Number of input channels for each input port + fn channel_count(&self) -> u8 { + self.channel_info().count + } + + fn channel_count_mode(&self) -> ChannelCountMode { + self.channel_info().mode + } + + fn channel_interpretation(&self) -> ChannelInterpretation { + self.channel_info().interpretation + } + + fn set_channel_interpretation(&mut self, i: ChannelInterpretation) { + self.channel_info_mut().interpretation = i + } + fn set_channel_count(&mut self, c: u8) { + self.channel_info_mut().count = c; + } + fn set_channel_count_mode(&mut self, m: ChannelCountMode) { + self.channel_info_mut().mode = m; + } + + /// If we're the destination node, extract the contained data + fn destination_data(&mut self) -> Option { + None + } + + fn get_param(&mut self, _: ParamType) -> &mut Param { + panic!("No params on node {}", self.node_type()) + } +} + +#[derive(Clone, Debug)] +pub enum AudioNodeMessage { + AudioBufferSourceNode(AudioBufferSourceNodeMessage), + AudioScheduledSourceNode(AudioScheduledSourceNodeMessage), + SetChannelCount(u8), + SetChannelMode(ChannelCountMode), + SetChannelInterpretation(ChannelInterpretation), + SetParam(ParamType, UserAutomationEvent) +} + +/// This trait represents the common features of the source nodes such as +/// AudioBufferSourceNode, ConstantSourceNode and OscillatorNode. +/// https://webaudio.github.io/web-audio-api/#AudioScheduledSourceNode +pub trait AudioScheduledSourceNode { + /// Schedules a sound to playback at an exact time. + /// Returns true if the scheduling request is processed succesfully. + fn start(&mut self, tick: Tick) -> bool; + /// Schedules a sound to stop playback at an exact time. + /// Returns true if the scheduling request is processed successfully. + fn stop(&mut self, tick: Tick) -> bool; +} + +/// Type of message directed to AudioScheduledSourceNodes. +#[derive(Debug, Clone)] +pub enum AudioScheduledSourceNodeMessage { + /// Schedules a sound to playback at an exact time. + Start(f64), + /// Schedules a sound to stop playback at an exact time. + Stop(f64), +} diff --git a/servo-media/src/audio/oscillator_node.rs b/servo-media-audio/src/oscillator_node.rs similarity index 95% rename from servo-media/src/audio/oscillator_node.rs rename to servo-media-audio/src/oscillator_node.rs index 2b7b7515..789bfcf7 100644 --- a/servo-media/src/audio/oscillator_node.rs +++ b/servo-media-audio/src/oscillator_node.rs @@ -1,7 +1,7 @@ -use audio::node::{AudioNodeType, ChannelInfo}; -use audio::block::{Chunk, Tick}; -use audio::node::{AudioNodeEngine, AudioScheduledSourceNodeMessage, BlockInfo}; -use audio::param::{Param, ParamType}; +use node::{AudioNodeType, ChannelInfo}; +use block::{Chunk, Tick}; +use node::{AudioNodeEngine, AudioScheduledSourceNodeMessage, BlockInfo}; +use param::{Param, ParamType}; use num_traits::cast::NumCast; #[derive(Copy, Clone, Debug)] diff --git a/servo-media/src/audio/param.rs b/servo-media-audio/src/param.rs similarity index 99% rename from servo-media/src/audio/param.rs rename to servo-media-audio/src/param.rs index ea3782a2..fa97d353 100644 --- a/servo-media/src/audio/param.rs +++ b/servo-media-audio/src/param.rs @@ -1,5 +1,5 @@ -use audio::block::Tick; -use audio::node::BlockInfo; +use block::Tick; +use node::BlockInfo; #[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)] pub enum ParamType { diff --git a/servo-media/src/audio/render_thread.rs b/servo-media-audio/src/render_thread.rs similarity index 92% rename from servo-media/src/audio/render_thread.rs rename to servo-media-audio/src/render_thread.rs index de69f469..fb2db071 100644 --- a/servo-media/src/audio/render_thread.rs +++ b/servo-media-audio/src/render_thread.rs @@ -1,15 +1,15 @@ -use audio::context::AudioBackend; -use audio::block::{Chunk, Tick, FRAMES_PER_BLOCK}; -use audio::buffer_source_node::AudioBufferSourceNode; -use audio::channel_node::{ChannelMergerNode, ChannelSplitterNode}; -use audio::context::{ProcessingState, StateChangeResult}; -use audio::destination_node::DestinationNode; -use audio::gain_node::GainNode; -use audio::graph::{AudioGraph, NodeId, PortId, InputPort, OutputPort}; -use audio::node::BlockInfo; -use audio::node::{AudioNodeEngine, AudioNodeMessage, AudioNodeInit}; -use audio::oscillator_node::OscillatorNode; -use audio::sink::AudioSink; +use context::AudioBackend; +use block::{Chunk, Tick, FRAMES_PER_BLOCK}; +use buffer_source_node::AudioBufferSourceNode; +use channel_node::{ChannelMergerNode, ChannelSplitterNode}; +use context::{ProcessingState, StateChangeResult}; +use destination_node::DestinationNode; +use gain_node::GainNode; +use graph::{AudioGraph, NodeId, PortId, InputPort, OutputPort}; +use node::BlockInfo; +use node::{AudioNodeEngine, AudioNodeMessage, AudioNodeInit}; +use oscillator_node::OscillatorNode; +use sink::AudioSink; use std::sync::mpsc::{Receiver, Sender}; #[cfg(feature = "gst")] diff --git a/servo-media/src/audio/sink.rs b/servo-media-audio/src/sink.rs similarity index 83% rename from servo-media/src/audio/sink.rs rename to servo-media-audio/src/sink.rs index d0ee3450..0279b60f 100644 --- a/servo-media/src/audio/sink.rs +++ b/servo-media-audio/src/sink.rs @@ -1,5 +1,5 @@ -use audio::block::Chunk; -use audio::render_thread::AudioRenderThreadMsg; +use block::Chunk; +use render_thread::AudioRenderThreadMsg; use std::sync::mpsc::Sender; pub trait AudioSink { diff --git a/servo-media-derive/src/lib.rs b/servo-media-derive/src/lib.rs index b01bbece..6cf94863 100644 --- a/servo-media-derive/src/lib.rs +++ b/servo-media-derive/src/lib.rs @@ -16,7 +16,7 @@ pub fn audio_scheduled_source_node(input: TokenStream) -> TokenStream { fn impl_audio_scheduled_source_node(ast: &syn::DeriveInput) -> quote::Tokens { let name = &ast.ident; quote! { - use audio::node::AudioScheduledSourceNode; + use node::AudioScheduledSourceNode; impl #name { pub fn should_play_at(&self, tick: Tick) -> (bool, bool) { @@ -68,12 +68,12 @@ pub fn channel_info(input: TokenStream) -> TokenStream { let ast = syn::parse_derive_input(&s).unwrap(); let name = &ast.ident; let gen = quote! { - impl ::audio::node::AudioNodeCommon for #name { - fn channel_info(&self) -> &::audio::node::ChannelInfo { + impl ::node::AudioNodeCommon for #name { + fn channel_info(&self) -> &::node::ChannelInfo { &self.channel_info } - fn channel_info_mut(&mut self) -> &mut ::audio::node::ChannelInfo { + fn channel_info_mut(&mut self) -> &mut ::node::ChannelInfo { &mut self.channel_info } } diff --git a/servo-media-gstreamer/Cargo.toml b/servo-media-gstreamer/Cargo.toml index 8a528df4..b27d8c4e 100644 --- a/servo-media-gstreamer/Cargo.toml +++ b/servo-media-gstreamer/Cargo.toml @@ -20,5 +20,5 @@ version = "0.11" [dependencies.num-traits] version = "0.1" -[dependencies.servo_media] -path = "../servo-media" \ No newline at end of file +[dependencies.servo-media-audio] +path = "../servo-media-audio" diff --git a/servo-media-gstreamer/src/audio_decoder.rs b/servo-media-gstreamer/src/audio_decoder.rs index 983e2c74..44cc7a16 100644 --- a/servo-media-gstreamer/src/audio_decoder.rs +++ b/servo-media-gstreamer/src/audio_decoder.rs @@ -1,6 +1,6 @@ use super::gst_app::{AppSink, AppSinkCallbacks, AppSrc}; use super::gst_audio; -use servo_media::audio::decoder::{AudioDecoder, AudioDecoderCallbacks, AudioDecoderOptions}; +use servo_media_audio::decoder::{AudioDecoder, AudioDecoderCallbacks, AudioDecoderOptions}; use byte_slice_cast::*; use gst; use gst::buffer::{MappedBuffer, Readable}; diff --git a/servo-media-gstreamer/src/audio_sink.rs b/servo-media-gstreamer/src/audio_sink.rs index 5443761e..ea8718a1 100644 --- a/servo-media-gstreamer/src/audio_sink.rs +++ b/servo-media-gstreamer/src/audio_sink.rs @@ -1,8 +1,8 @@ use gst_app::{AppSrc, AppSrcCallbacks}; use gst_audio; -use servo_media::audio::block::{Chunk, FRAMES_PER_BLOCK}; -use servo_media::audio::render_thread::AudioRenderThreadMsg; -use servo_media::audio::sink::AudioSink; +use servo_media_audio::block::{Chunk, FRAMES_PER_BLOCK}; +use servo_media_audio::render_thread::AudioRenderThreadMsg; +use servo_media_audio::sink::AudioSink; use byte_slice_cast::*; use gst; use gst::prelude::*; diff --git a/servo-media-gstreamer/src/lib.rs b/servo-media-gstreamer/src/lib.rs index 8b6a4e67..a33c3789 100644 --- a/servo-media-gstreamer/src/lib.rs +++ b/servo-media-gstreamer/src/lib.rs @@ -1,14 +1,16 @@ -use servo_media::audio::context::AudioBackend; + extern crate gstreamer_app as gst_app; extern crate gstreamer_audio as gst_audio; extern crate gstreamer as gst; -extern crate servo_media; +extern crate servo_media_audio; extern crate num_traits; extern crate byte_slice_cast; +use servo_media_audio::context::AudioBackend; + pub mod audio_decoder; pub mod audio_sink; @@ -23,4 +25,7 @@ impl AudioBackend for GStreamerBackend { fn make_sink() -> Result { audio_sink::GStreamerAudioSink::new() } + fn init() { + gst::init().unwrap(); + } } \ No newline at end of file diff --git a/servo-media/Cargo.toml b/servo-media/Cargo.toml index e9eafebe..8205a48c 100644 --- a/servo-media/Cargo.toml +++ b/servo-media/Cargo.toml @@ -1,27 +1,14 @@ [package] -authors = ["Fernando Jiménez Moreno "] -license = "MPL-2.0" -name = "servo_media" +name = "servo-media" version = "0.1.0" +authors = ["Manish Goregaokar "] -[build-dependencies] -regex = "1.0" -zip = "0.3.1" - -[dependencies] -smallvec = "0.6.1" -servo_media_derive = { path = "../servo-media-derive" } - -[dependencies.petgraph] -version = "0.4.12" -features = ["stable_graph"] - -[dependencies.byte-slice-cast] -version = "0.1" +[lib] +name = "servo_media" +[dependencies.servo-media-audio] +path = "../servo-media-audio" -[dependencies.num-traits] -version = "0.1" -[lib] -name = "servo_media" +[dependencies.servo-media-gstreamer] +path = "../servo-media-gstreamer" \ No newline at end of file diff --git a/servo-media/src/lib.rs b/servo-media/src/lib.rs index fd36075b..a95f712d 100644 --- a/servo-media/src/lib.rs +++ b/servo-media/src/lib.rs @@ -1,21 +1,11 @@ -#![feature(fnbox)] - -use audio::context::AudioBackend; +pub extern crate servo_media_audio as audio; +extern crate servo_media_gstreamer; +use servo_media_gstreamer::GStreamerBackend; use std::sync::{self, Once}; use std::sync::{Arc, Mutex}; -#[macro_use] -extern crate servo_media_derive; - -extern crate byte_slice_cast; -extern crate num_traits; -extern crate petgraph; -extern crate smallvec; - -#[macro_use] -pub mod audio; -use audio::context::{AudioContext, AudioContextOptions}; +use audio::context::{AudioBackend, AudioContext, AudioContextOptions}; pub struct ServoMedia {} @@ -24,8 +14,7 @@ static mut INSTANCE: *mut Mutex>> = 0 as *mut _; impl ServoMedia { pub fn new() -> Self { - #[cfg(feature = "gst")] - gst::init().unwrap(); + GStreamerBackend::init(); Self {} } @@ -41,7 +30,7 @@ impl ServoMedia { } } - pub fn create_audio_context(&self, options: AudioContextOptions) -> AudioContext { + pub fn create_audio_context(&self, options: AudioContextOptions) -> AudioContext { AudioContext::new(options) } } From 2809d60c47c6c34775ff2f97839fa8ea7e3c81c8 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 11 Jul 2018 16:16:50 -0700 Subject: [PATCH 3/6] Put build script in appropriate position --- servo-media-audio/Cargo.toml | 5 ----- servo-media-gstreamer/Cargo.toml | 3 +++ {servo-media-audio => servo-media-gstreamer}/build.rs | 0 3 files changed, 3 insertions(+), 5 deletions(-) rename {servo-media-audio => servo-media-gstreamer}/build.rs (100%) diff --git a/servo-media-audio/Cargo.toml b/servo-media-audio/Cargo.toml index 2eabf7f2..bd82c711 100644 --- a/servo-media-audio/Cargo.toml +++ b/servo-media-audio/Cargo.toml @@ -8,11 +8,6 @@ version = "0.1.0" [lib] name = "servo_media_audio" - -[build-dependencies] -regex = "1.0" -zip = "0.3.1" - [dependencies] smallvec = "0.6.1" servo_media_derive = { path = "../servo-media-derive" } diff --git a/servo-media-gstreamer/Cargo.toml b/servo-media-gstreamer/Cargo.toml index b27d8c4e..4735a394 100644 --- a/servo-media-gstreamer/Cargo.toml +++ b/servo-media-gstreamer/Cargo.toml @@ -4,6 +4,9 @@ version = "0.1.0" authors = ["Manish Goregaokar "] +[build-dependencies] +regex = "1.0" +zip = "0.3.1" [dependencies.byte-slice-cast] version = "0.1" diff --git a/servo-media-audio/build.rs b/servo-media-gstreamer/build.rs similarity index 100% rename from servo-media-audio/build.rs rename to servo-media-gstreamer/build.rs From e59ced58933c17dc610851ab15164668e78fe9dd Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 11 Jul 2018 16:18:43 -0700 Subject: [PATCH 4/6] Move AudioBackend to global position --- Cargo.lock | 4 ++-- servo-media-audio/src/context.rs | 10 +--------- servo-media-audio/src/lib.rs | 9 +++++++++ servo-media-audio/src/render_thread.rs | 2 +- servo-media-gstreamer/src/lib.rs | 2 +- servo-media/src/lib.rs | 3 ++- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e5940f40..4ccc7914 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -434,10 +434,8 @@ dependencies = [ "byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", "petgraph 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "servo_media_derive 0.1.0", "smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zip 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -449,7 +447,9 @@ dependencies = [ "gstreamer-app 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-audio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "servo-media-audio 0.1.0", + "zip 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/servo-media-audio/src/context.rs b/servo-media-audio/src/context.rs index c5736510..fa1f2545 100644 --- a/servo-media-audio/src/context.rs +++ b/servo-media-audio/src/context.rs @@ -1,5 +1,5 @@ +use AudioBackend; use std::marker::PhantomData; -use sink::AudioSink; use decoder::{AudioDecoder, AudioDecoderCallbacks, AudioDecoderOptions}; use graph::{AudioGraph, InputPort, NodeId, OutputPort, PortId}; use node::{AudioNodeMessage, AudioNodeInit}; @@ -242,11 +242,3 @@ impl Drop for AudioContext { let _ = self.sender.send(AudioRenderThreadMsg::Close(tx)); } } - -pub trait AudioBackend { - type Decoder: AudioDecoder; - type Sink: AudioSink; - fn make_decoder() -> Self::Decoder; - fn make_sink() -> Result; - fn init(); -} diff --git a/servo-media-audio/src/lib.rs b/servo-media-audio/src/lib.rs index 474eabfb..467f6e96 100644 --- a/servo-media-audio/src/lib.rs +++ b/servo-media-audio/src/lib.rs @@ -23,3 +23,12 @@ pub mod oscillator_node; pub mod param; pub mod render_thread; pub mod sink; + + +pub trait AudioBackend { + type Decoder: decoder::AudioDecoder; + type Sink: sink::AudioSink; + fn make_decoder() -> Self::Decoder; + fn make_sink() -> Result; + fn init(); +} diff --git a/servo-media-audio/src/render_thread.rs b/servo-media-audio/src/render_thread.rs index fb2db071..309dd4fa 100644 --- a/servo-media-audio/src/render_thread.rs +++ b/servo-media-audio/src/render_thread.rs @@ -1,4 +1,4 @@ -use context::AudioBackend; +use AudioBackend; use block::{Chunk, Tick, FRAMES_PER_BLOCK}; use buffer_source_node::AudioBufferSourceNode; use channel_node::{ChannelMergerNode, ChannelSplitterNode}; diff --git a/servo-media-gstreamer/src/lib.rs b/servo-media-gstreamer/src/lib.rs index a33c3789..83d43fcd 100644 --- a/servo-media-gstreamer/src/lib.rs +++ b/servo-media-gstreamer/src/lib.rs @@ -9,7 +9,7 @@ extern crate servo_media_audio; extern crate num_traits; extern crate byte_slice_cast; -use servo_media_audio::context::AudioBackend; +use servo_media_audio::AudioBackend; pub mod audio_decoder; pub mod audio_sink; diff --git a/servo-media/src/lib.rs b/servo-media/src/lib.rs index a95f712d..21d0882d 100644 --- a/servo-media/src/lib.rs +++ b/servo-media/src/lib.rs @@ -5,7 +5,8 @@ use std::sync::{self, Once}; use std::sync::{Arc, Mutex}; -use audio::context::{AudioBackend, AudioContext, AudioContextOptions}; +use audio::AudioBackend; +use audio::context::{AudioContext, AudioContextOptions}; pub struct ServoMedia {} From 69c97b53db997d55f06a1975c6a83b7d55fe4dd9 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 11 Jul 2018 16:32:24 -0700 Subject: [PATCH 5/6] Switch backends based on platform --- servo-media/Cargo.toml | 2 +- servo-media/src/lib.rs | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/servo-media/Cargo.toml b/servo-media/Cargo.toml index d5cb28d1..2deb4034 100644 --- a/servo-media/Cargo.toml +++ b/servo-media/Cargo.toml @@ -10,5 +10,5 @@ name = "servo_media" path = "../servo-media-audio" -[dependencies.servo-media-gstreamer] +[target.'cfg(not(target_os = "android"))'.dependencies.servo-media-gstreamer] path = "../servo-media-gstreamer" diff --git a/servo-media/src/lib.rs b/servo-media/src/lib.rs index e606bdee..6b4d6853 100644 --- a/servo-media/src/lib.rs +++ b/servo-media/src/lib.rs @@ -1,6 +1,6 @@ pub extern crate servo_media_audio as audio; +#[cfg(not(target_os = "android"))] extern crate servo_media_gstreamer; -use servo_media_gstreamer::GStreamerBackend; use std::sync::{self, Once}; use std::sync::{Arc, Mutex}; @@ -13,9 +13,14 @@ pub struct ServoMedia; static INITIALIZER: Once = sync::ONCE_INIT; static mut INSTANCE: *mut Mutex>> = 0 as *mut _; +#[cfg(not(target_os = "android"))] +pub type Backend = servo_media_gstreamer::GStreamerBackend; +#[cfg(target_os = "android")] +pub type Backend = audio::DummyBackend; + impl ServoMedia { pub fn new() -> Self { - GStreamerBackend::init(); + Backend::init(); Self {} } @@ -31,7 +36,8 @@ impl ServoMedia { } } - pub fn create_audio_context(&self, options: AudioContextOptions) -> AudioContext { + + pub fn create_audio_context(&self, options: AudioContextOptions) -> AudioContext { AudioContext::new(options) } } From 479d2fdfb2c0a9c243b7f077d53b9bd1b12c22e2 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 11 Jul 2018 16:35:56 -0700 Subject: [PATCH 6/6] Better organize crates --- Cargo.toml | 2 +- {servo-media-audio => audio}/Cargo.toml | 0 {servo-media-audio => audio}/src/block.rs | 0 {servo-media-audio => audio}/src/buffer_source_node.rs | 0 {servo-media-audio => audio}/src/channel_node.rs | 0 {servo-media-audio => audio}/src/context.rs | 0 {servo-media-audio => audio}/src/decoder.rs | 0 {servo-media-audio => audio}/src/destination_node.rs | 0 {servo-media-audio => audio}/src/gain_node.rs | 0 {servo-media-audio => audio}/src/graph.rs | 0 {servo-media-audio => audio}/src/lib.rs | 0 {servo-media-audio => audio}/src/macros.rs | 0 {servo-media-audio => audio}/src/mod.rs | 0 {servo-media-audio => audio}/src/node.rs | 0 {servo-media-audio => audio}/src/oscillator_node.rs | 0 {servo-media-audio => audio}/src/param.rs | 0 {servo-media-audio => audio}/src/render_thread.rs | 0 {servo-media-audio => audio}/src/sink.rs | 0 {servo-media-gstreamer => backends/gstreamer}/Cargo.toml | 2 +- {servo-media-gstreamer => backends/gstreamer}/build.rs | 0 .../gstreamer}/src/audio_decoder.rs | 0 .../gstreamer}/src/audio_sink.rs | 0 {servo-media-gstreamer => backends/gstreamer}/src/lib.rs | 0 servo-media/Cargo.toml | 4 ++-- 24 files changed, 4 insertions(+), 4 deletions(-) rename {servo-media-audio => audio}/Cargo.toml (100%) rename {servo-media-audio => audio}/src/block.rs (100%) rename {servo-media-audio => audio}/src/buffer_source_node.rs (100%) rename {servo-media-audio => audio}/src/channel_node.rs (100%) rename {servo-media-audio => audio}/src/context.rs (100%) rename {servo-media-audio => audio}/src/decoder.rs (100%) rename {servo-media-audio => audio}/src/destination_node.rs (100%) rename {servo-media-audio => audio}/src/gain_node.rs (100%) rename {servo-media-audio => audio}/src/graph.rs (100%) rename {servo-media-audio => audio}/src/lib.rs (100%) rename {servo-media-audio => audio}/src/macros.rs (100%) rename {servo-media-audio => audio}/src/mod.rs (100%) rename {servo-media-audio => audio}/src/node.rs (100%) rename {servo-media-audio => audio}/src/oscillator_node.rs (100%) rename {servo-media-audio => audio}/src/param.rs (100%) rename {servo-media-audio => audio}/src/render_thread.rs (100%) rename {servo-media-audio => audio}/src/sink.rs (100%) rename {servo-media-gstreamer => backends/gstreamer}/Cargo.toml (93%) rename {servo-media-gstreamer => backends/gstreamer}/build.rs (100%) rename {servo-media-gstreamer => backends/gstreamer}/src/audio_decoder.rs (100%) rename {servo-media-gstreamer => backends/gstreamer}/src/audio_sink.rs (100%) rename {servo-media-gstreamer => backends/gstreamer}/src/lib.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index 3c6a50bf..c267ce76 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["servo-media", "servo-media-derive", "servo-media-audio", "servo-media-gstreamer", "examples"] +members = ["servo-media", "servo-media-derive", "audio", "backends/gstreamer", "examples"] license = "MPL-2.0" diff --git a/servo-media-audio/Cargo.toml b/audio/Cargo.toml similarity index 100% rename from servo-media-audio/Cargo.toml rename to audio/Cargo.toml diff --git a/servo-media-audio/src/block.rs b/audio/src/block.rs similarity index 100% rename from servo-media-audio/src/block.rs rename to audio/src/block.rs diff --git a/servo-media-audio/src/buffer_source_node.rs b/audio/src/buffer_source_node.rs similarity index 100% rename from servo-media-audio/src/buffer_source_node.rs rename to audio/src/buffer_source_node.rs diff --git a/servo-media-audio/src/channel_node.rs b/audio/src/channel_node.rs similarity index 100% rename from servo-media-audio/src/channel_node.rs rename to audio/src/channel_node.rs diff --git a/servo-media-audio/src/context.rs b/audio/src/context.rs similarity index 100% rename from servo-media-audio/src/context.rs rename to audio/src/context.rs diff --git a/servo-media-audio/src/decoder.rs b/audio/src/decoder.rs similarity index 100% rename from servo-media-audio/src/decoder.rs rename to audio/src/decoder.rs diff --git a/servo-media-audio/src/destination_node.rs b/audio/src/destination_node.rs similarity index 100% rename from servo-media-audio/src/destination_node.rs rename to audio/src/destination_node.rs diff --git a/servo-media-audio/src/gain_node.rs b/audio/src/gain_node.rs similarity index 100% rename from servo-media-audio/src/gain_node.rs rename to audio/src/gain_node.rs diff --git a/servo-media-audio/src/graph.rs b/audio/src/graph.rs similarity index 100% rename from servo-media-audio/src/graph.rs rename to audio/src/graph.rs diff --git a/servo-media-audio/src/lib.rs b/audio/src/lib.rs similarity index 100% rename from servo-media-audio/src/lib.rs rename to audio/src/lib.rs diff --git a/servo-media-audio/src/macros.rs b/audio/src/macros.rs similarity index 100% rename from servo-media-audio/src/macros.rs rename to audio/src/macros.rs diff --git a/servo-media-audio/src/mod.rs b/audio/src/mod.rs similarity index 100% rename from servo-media-audio/src/mod.rs rename to audio/src/mod.rs diff --git a/servo-media-audio/src/node.rs b/audio/src/node.rs similarity index 100% rename from servo-media-audio/src/node.rs rename to audio/src/node.rs diff --git a/servo-media-audio/src/oscillator_node.rs b/audio/src/oscillator_node.rs similarity index 100% rename from servo-media-audio/src/oscillator_node.rs rename to audio/src/oscillator_node.rs diff --git a/servo-media-audio/src/param.rs b/audio/src/param.rs similarity index 100% rename from servo-media-audio/src/param.rs rename to audio/src/param.rs diff --git a/servo-media-audio/src/render_thread.rs b/audio/src/render_thread.rs similarity index 100% rename from servo-media-audio/src/render_thread.rs rename to audio/src/render_thread.rs diff --git a/servo-media-audio/src/sink.rs b/audio/src/sink.rs similarity index 100% rename from servo-media-audio/src/sink.rs rename to audio/src/sink.rs diff --git a/servo-media-gstreamer/Cargo.toml b/backends/gstreamer/Cargo.toml similarity index 93% rename from servo-media-gstreamer/Cargo.toml rename to backends/gstreamer/Cargo.toml index 4735a394..6e6de856 100644 --- a/servo-media-gstreamer/Cargo.toml +++ b/backends/gstreamer/Cargo.toml @@ -24,4 +24,4 @@ version = "0.11" version = "0.1" [dependencies.servo-media-audio] -path = "../servo-media-audio" +path = "../../audio" diff --git a/servo-media-gstreamer/build.rs b/backends/gstreamer/build.rs similarity index 100% rename from servo-media-gstreamer/build.rs rename to backends/gstreamer/build.rs diff --git a/servo-media-gstreamer/src/audio_decoder.rs b/backends/gstreamer/src/audio_decoder.rs similarity index 100% rename from servo-media-gstreamer/src/audio_decoder.rs rename to backends/gstreamer/src/audio_decoder.rs diff --git a/servo-media-gstreamer/src/audio_sink.rs b/backends/gstreamer/src/audio_sink.rs similarity index 100% rename from servo-media-gstreamer/src/audio_sink.rs rename to backends/gstreamer/src/audio_sink.rs diff --git a/servo-media-gstreamer/src/lib.rs b/backends/gstreamer/src/lib.rs similarity index 100% rename from servo-media-gstreamer/src/lib.rs rename to backends/gstreamer/src/lib.rs diff --git a/servo-media/Cargo.toml b/servo-media/Cargo.toml index 2deb4034..7b916c92 100644 --- a/servo-media/Cargo.toml +++ b/servo-media/Cargo.toml @@ -7,8 +7,8 @@ authors = ["Manish Goregaokar "] name = "servo_media" [dependencies.servo-media-audio] -path = "../servo-media-audio" +path = "../audio" [target.'cfg(not(target_os = "android"))'.dependencies.servo-media-gstreamer] -path = "../servo-media-gstreamer" +path = "../backends/gstreamer"