mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
MediaElementAudioSourceNode: set audio renderer
This commit is contained in:
parent
03485d730f
commit
a72e46f9c8
3 changed files with 29 additions and 8 deletions
|
@ -79,6 +79,7 @@ use net_traits::{CoreResourceMsg, FetchChannels, FetchMetadata, FetchResponseLis
|
|||
use net_traits::{NetworkError, ResourceFetchTiming, ResourceTimingType};
|
||||
use script_layout_interface::HTMLMediaData;
|
||||
use servo_config::pref;
|
||||
use servo_media::player::audio::AudioRenderer;
|
||||
use servo_media::player::video::{VideoFrame, VideoFrameRenderer};
|
||||
use servo_media::player::{PlaybackState, Player, PlayerError, PlayerEvent, SeekLock, StreamType};
|
||||
use servo_media::{ClientContextId, ServoMedia, SupportsMediaType};
|
||||
|
@ -326,6 +327,8 @@ pub struct HTMLMediaElement {
|
|||
player: DomRefCell<Option<Arc<Mutex<dyn Player>>>>,
|
||||
#[ignore_malloc_size_of = "Arc"]
|
||||
video_renderer: Arc<Mutex<MediaFrameRenderer>>,
|
||||
#[ignore_malloc_size_of = "Arc"]
|
||||
audio_renderer: DomRefCell<Option<Arc<Mutex<dyn AudioRenderer>>>>,
|
||||
/// https://html.spec.whatwg.org/multipage/#show-poster-flag
|
||||
show_poster: Cell<bool>,
|
||||
/// https://html.spec.whatwg.org/multipage/#dom-media-duration
|
||||
|
@ -413,6 +416,7 @@ impl HTMLMediaElement {
|
|||
video_renderer: Arc::new(Mutex::new(MediaFrameRenderer::new(
|
||||
document.window().get_webrender_api_sender(),
|
||||
))),
|
||||
audio_renderer: Default::default(),
|
||||
show_poster: Cell::new(true),
|
||||
duration: Cell::new(f64::NAN),
|
||||
playback_position: Cell::new(0.),
|
||||
|
@ -1325,11 +1329,14 @@ impl HTMLMediaElement {
|
|||
|
||||
let window = window_from_node(self);
|
||||
let (action_sender, action_receiver) = ipc::channel::<PlayerEvent>().unwrap();
|
||||
let renderer: Option<Arc<Mutex<dyn VideoFrameRenderer>>> = match self.media_type_id() {
|
||||
let video_renderer: Option<Arc<Mutex<dyn VideoFrameRenderer>>> = match self.media_type_id()
|
||||
{
|
||||
HTMLMediaElementTypeId::HTMLAudioElement => None,
|
||||
HTMLMediaElementTypeId::HTMLVideoElement => Some(self.video_renderer.clone()),
|
||||
};
|
||||
|
||||
let audio_renderer = self.audio_renderer.borrow().as_ref().map(|r| r.clone());
|
||||
|
||||
let pipeline_id = window
|
||||
.pipeline_id()
|
||||
.expect("Cannot create player outside of a pipeline");
|
||||
|
@ -1339,8 +1346,8 @@ impl HTMLMediaElement {
|
|||
&client_context_id,
|
||||
stream_type,
|
||||
action_sender,
|
||||
renderer,
|
||||
None,
|
||||
video_renderer,
|
||||
audio_renderer,
|
||||
Box::new(window.get_player_context()),
|
||||
);
|
||||
|
||||
|
@ -1862,6 +1869,20 @@ impl HTMLMediaElement {
|
|||
None => return None,
|
||||
}
|
||||
}
|
||||
|
||||
/// By default the audio is rendered through the audio sink automatically
|
||||
/// selected by the servo-media Player instance. However, in some cases, like
|
||||
/// the WebAudio MediaElementAudioSourceNode, we need to set a custom audio
|
||||
/// renderer.
|
||||
pub fn set_audio_renderer(&self, audio_renderer: Arc<Mutex<dyn AudioRenderer>>) {
|
||||
*self.audio_renderer.borrow_mut() = Some(audio_renderer);
|
||||
if let Some(ref player) = *self.player.borrow() {
|
||||
if let Err(e) = player.lock().unwrap().stop() {
|
||||
eprintln!("Could not stop player {:?}", e);
|
||||
}
|
||||
self.media_element_load_algorithm();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// XXX Placeholder for [https://github.com/servo/servo/issues/22293]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue