GLPlayer thread API implementation

This commit is contained in:
Víctor Manuel Jáquez Leal 2019-06-14 11:16:02 +02:00 committed by Fernando Jiménez Moreno
parent 59aacb0076
commit 38eb48441c

View file

@ -3,6 +3,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use canvas_traits::media::*; use canvas_traits::media::*;
use fnv::FnvHashMap;
use std::thread; use std::thread;
/// GL player threading API entry point that lives in the /// GL player threading API entry point that lives in the
@ -13,11 +14,19 @@ pub use crate::media_mode::GLPlayerThreads;
/// A GLPlayerThrx1ead manages the life cycle and message multiplexign of /// A GLPlayerThrx1ead manages the life cycle and message multiplexign of
/// a set of video players with GL render. /// a set of video players with GL render.
pub struct GLPlayerThread (); pub struct GLPlayerThread {
// Map of live players.
players: FnvHashMap<u64, GLPlayerSender<GLPlayerMsgForward>>,
/// Id generator for new WebGLContexts.
next_player_id: u64,
}
impl GLPlayerThread { impl GLPlayerThread {
pub fn new() -> Self { pub fn new() -> Self {
GLPlayerThread() GLPlayerThread {
players: Default::default(),
next_player_id: 1,
}
} }
pub fn start() -> GLPlayerSender<GLPlayerMsg> { pub fn start() -> GLPlayerSender<GLPlayerMsg> {
@ -25,7 +34,7 @@ impl GLPlayerThread {
thread::Builder::new() thread::Builder::new()
.name("GLPlayerThread".to_owned()) .name("GLPlayerThread".to_owned())
.spawn(move || { .spawn(move || {
let renderer = GLPlayerThread::new(); let mut renderer = GLPlayerThread::new();
loop { loop {
let msg = receiver.recv().unwrap(); let msg = receiver.recv().unwrap();
let exit = renderer.handle_msg(msg); let exit = renderer.handle_msg(msg);
@ -41,11 +50,31 @@ impl GLPlayerThread {
/// Handles a generic WebGLMsg message /// Handles a generic WebGLMsg message
#[inline] #[inline]
fn handle_msg(&self, msg: GLPlayerMsg) -> bool { fn handle_msg(&mut self, msg: GLPlayerMsg) -> bool {
trace!("processing {:?}", msg); trace!("processing {:?}", msg);
match msg { match msg {
GLPlayerMsg::RegisterPlayer(sender) => {
let id = self.next_player_id;
self.players.insert(id, sender.clone());
sender.send(GLPlayerMsgForward::PlayerId(id)).unwrap();
self.next_player_id += 1;
},
GLPlayerMsg::UnregisterPlayer(id) => {
if self.players.remove(&id).is_none() {
warn!("Tried to remove an unknown player");
}
},
GLPlayerMsg::Lock(id, handler_sender) => {
self.players.get(&id).map(|sender| {
sender.send(GLPlayerMsgForward::Lock(handler_sender)).ok();
});
},
GLPlayerMsg::Unlock(id) => {
self.players.get(&id).map(|sender| {
sender.send(GLPlayerMsgForward::Unlock()).ok();
});
},
GLPlayerMsg::Exit => return true, GLPlayerMsg::Exit => return true,
_ => (),
} }
false false