desktop: Wrap Player in a new PlayerController
This commit is contained in:
parent
419330ecd5
commit
2de0b5e7e0
|
@ -2,6 +2,7 @@ use crate::cli::Opt;
|
||||||
use crate::custom_event::RuffleEvent;
|
use crate::custom_event::RuffleEvent;
|
||||||
use crate::executor::GlutinAsyncExecutor;
|
use crate::executor::GlutinAsyncExecutor;
|
||||||
use crate::gui::{GuiController, MovieView};
|
use crate::gui::{GuiController, MovieView};
|
||||||
|
use crate::player::PlayerController;
|
||||||
use crate::util::{
|
use crate::util::{
|
||||||
get_screen_size, parse_url, pick_file, winit_key_to_char, winit_to_ruffle_key_code,
|
get_screen_size, parse_url, pick_file, winit_key_to_char, winit_to_ruffle_key_code,
|
||||||
winit_to_ruffle_text_control,
|
winit_to_ruffle_text_control,
|
||||||
|
@ -9,7 +10,7 @@ use crate::util::{
|
||||||
use crate::{audio, navigator, storage, ui, CALLSTACK, RENDER_INFO, SWF_INFO};
|
use crate::{audio, navigator, storage, ui, CALLSTACK, RENDER_INFO, SWF_INFO};
|
||||||
use anyhow::{anyhow, Context, Error};
|
use anyhow::{anyhow, Context, Error};
|
||||||
use ruffle_core::backend::audio::AudioBackend;
|
use ruffle_core::backend::audio::AudioBackend;
|
||||||
use ruffle_core::{Player, PlayerBuilder, PlayerEvent, StageDisplayState};
|
use ruffle_core::{PlayerBuilder, PlayerEvent, StageDisplayState};
|
||||||
use ruffle_render::backend::{RenderBackend, ViewportDimensions};
|
use ruffle_render::backend::{RenderBackend, ViewportDimensions};
|
||||||
use ruffle_render_wgpu::backend::WgpuRenderBackend;
|
use ruffle_render_wgpu::backend::WgpuRenderBackend;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
@ -28,7 +29,7 @@ pub struct App {
|
||||||
event_loop_proxy: EventLoopProxy<RuffleEvent>,
|
event_loop_proxy: EventLoopProxy<RuffleEvent>,
|
||||||
executor: Arc<Mutex<GlutinAsyncExecutor>>,
|
executor: Arc<Mutex<GlutinAsyncExecutor>>,
|
||||||
gui: Arc<Mutex<GuiController>>,
|
gui: Arc<Mutex<GuiController>>,
|
||||||
player: Arc<Mutex<Player>>,
|
player: PlayerController,
|
||||||
min_window_size: LogicalSize<u32>,
|
min_window_size: LogicalSize<u32>,
|
||||||
max_window_size: PhysicalSize<u32>,
|
max_window_size: PhysicalSize<u32>,
|
||||||
}
|
}
|
||||||
|
@ -121,10 +122,10 @@ impl App {
|
||||||
.with_player_version(opt.player_version)
|
.with_player_version(opt.player_version)
|
||||||
.with_frame_rate(opt.frame_rate);
|
.with_frame_rate(opt.frame_rate);
|
||||||
|
|
||||||
let player = builder.build();
|
let player = PlayerController::new(builder.build());
|
||||||
|
|
||||||
CALLSTACK.with(|callstack| {
|
CALLSTACK.with(|callstack| {
|
||||||
*callstack.borrow_mut() = Some(player.lock().expect("Cannot reenter").callstack());
|
*callstack.borrow_mut() = Some(player.get().callstack());
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut app = Self {
|
let mut app = Self {
|
||||||
|
@ -162,11 +163,9 @@ impl App {
|
||||||
|
|
||||||
let mut parameters: Vec<(String, String)> = url.query_pairs().into_owned().collect();
|
let mut parameters: Vec<(String, String)> = url.query_pairs().into_owned().collect();
|
||||||
parameters.extend(self.opt.parameters());
|
parameters.extend(self.opt.parameters());
|
||||||
self.player.lock().expect("Player lock").fetch_root_movie(
|
self.player
|
||||||
url.to_string(),
|
.get()
|
||||||
parameters,
|
.fetch_root_movie(url.to_string(), parameters, Box::new(on_metadata));
|
||||||
Box::new(on_metadata),
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -198,10 +197,7 @@ impl App {
|
||||||
let mut check_redraw = false;
|
let mut check_redraw = false;
|
||||||
match event {
|
match event {
|
||||||
winit::event::Event::LoopDestroyed => {
|
winit::event::Event::LoopDestroyed => {
|
||||||
self.player
|
self.player.get().flush_shared_objects();
|
||||||
.lock()
|
|
||||||
.expect("Cannot reenter")
|
|
||||||
.flush_shared_objects();
|
|
||||||
crate::shutdown();
|
crate::shutdown();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -214,7 +210,7 @@ impl App {
|
||||||
let dt = new_time.duration_since(time).as_micros();
|
let dt = new_time.duration_since(time).as_micros();
|
||||||
if dt > 0 {
|
if dt > 0 {
|
||||||
time = new_time;
|
time = new_time;
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
player_lock.tick(dt as f64 / 1000.0);
|
player_lock.tick(dt as f64 / 1000.0);
|
||||||
next_frame_time = new_time + player_lock.time_til_next_frame();
|
next_frame_time = new_time + player_lock.time_til_next_frame();
|
||||||
check_redraw = true;
|
check_redraw = true;
|
||||||
|
@ -225,7 +221,7 @@ impl App {
|
||||||
winit::event::Event::RedrawRequested(_) => {
|
winit::event::Event::RedrawRequested(_) => {
|
||||||
// Don't render when minimized to avoid potential swap chain errors in `wgpu`.
|
// Don't render when minimized to avoid potential swap chain errors in `wgpu`.
|
||||||
if !minimized {
|
if !minimized {
|
||||||
let mut player = self.player.lock().expect("Cannot reenter");
|
let mut player = self.player.get();
|
||||||
player.render();
|
player.render();
|
||||||
let renderer = player
|
let renderer = player
|
||||||
.renderer_mut()
|
.renderer_mut()
|
||||||
|
@ -257,7 +253,7 @@ impl App {
|
||||||
minimized = size.width == 0 && size.height == 0;
|
minimized = size.width == 0 && size.height == 0;
|
||||||
|
|
||||||
let viewport_scale_factor = self.window.scale_factor();
|
let viewport_scale_factor = self.window.scale_factor();
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
player_lock.set_viewport_dimensions(ViewportDimensions {
|
player_lock.set_viewport_dimensions(ViewportDimensions {
|
||||||
width: size.width,
|
width: size.width,
|
||||||
height: size.height,
|
height: size.height,
|
||||||
|
@ -273,7 +269,7 @@ impl App {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
mouse_pos = position;
|
mouse_pos = position;
|
||||||
let event = PlayerEvent::MouseMove {
|
let event = PlayerEvent::MouseMove {
|
||||||
x: position.x,
|
x: position.x,
|
||||||
|
@ -289,7 +285,7 @@ impl App {
|
||||||
|
|
||||||
use ruffle_core::events::MouseButton as RuffleMouseButton;
|
use ruffle_core::events::MouseButton as RuffleMouseButton;
|
||||||
use winit::event::MouseButton;
|
use winit::event::MouseButton;
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
let x = mouse_pos.x;
|
let x = mouse_pos.x;
|
||||||
let y = mouse_pos.y;
|
let y = mouse_pos.y;
|
||||||
let button = match button {
|
let button = match button {
|
||||||
|
@ -318,7 +314,7 @@ impl App {
|
||||||
WindowEvent::MouseWheel { delta, .. } => {
|
WindowEvent::MouseWheel { delta, .. } => {
|
||||||
use ruffle_core::events::MouseWheelDelta;
|
use ruffle_core::events::MouseWheelDelta;
|
||||||
use winit::event::MouseScrollDelta;
|
use winit::event::MouseScrollDelta;
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
let delta = match delta {
|
let delta = match delta {
|
||||||
MouseScrollDelta::LineDelta(_, dy) => {
|
MouseScrollDelta::LineDelta(_, dy) => {
|
||||||
MouseWheelDelta::Lines(dy.into())
|
MouseWheelDelta::Lines(dy.into())
|
||||||
|
@ -330,14 +326,14 @@ impl App {
|
||||||
check_redraw = true;
|
check_redraw = true;
|
||||||
}
|
}
|
||||||
WindowEvent::CursorEntered { .. } => {
|
WindowEvent::CursorEntered { .. } => {
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
player_lock.set_mouse_in_stage(true);
|
player_lock.set_mouse_in_stage(true);
|
||||||
if player_lock.needs_render() {
|
if player_lock.needs_render() {
|
||||||
self.window.request_redraw();
|
self.window.request_redraw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WindowEvent::CursorLeft { .. } => {
|
WindowEvent::CursorLeft { .. } => {
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
player_lock.set_mouse_in_stage(false);
|
player_lock.set_mouse_in_stage(false);
|
||||||
player_lock.handle_event(PlayerEvent::MouseLeave);
|
player_lock.handle_event(PlayerEvent::MouseLeave);
|
||||||
check_redraw = true;
|
check_redraw = true;
|
||||||
|
@ -354,7 +350,7 @@ impl App {
|
||||||
..
|
..
|
||||||
} if modifiers.alt() => {
|
} if modifiers.alt() => {
|
||||||
if !fullscreen_down {
|
if !fullscreen_down {
|
||||||
self.player.lock().expect("Cannot reenter").update(|uc| {
|
self.player.get().update(|uc| {
|
||||||
uc.stage.toggle_display_state(uc);
|
uc.stage.toggle_display_state(uc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -372,13 +368,13 @@ impl App {
|
||||||
state: ElementState::Pressed,
|
state: ElementState::Pressed,
|
||||||
virtual_keycode: Some(VirtualKeyCode::Escape),
|
virtual_keycode: Some(VirtualKeyCode::Escape),
|
||||||
..
|
..
|
||||||
} => self.player.lock().expect("Cannot reenter").update(|uc| {
|
} => self.player.get().update(|uc| {
|
||||||
uc.stage.set_display_state(uc, StageDisplayState::Normal);
|
uc.stage.set_display_state(uc, StageDisplayState::Normal);
|
||||||
}),
|
}),
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
if let Some(key) = input.virtual_keycode {
|
if let Some(key) = input.virtual_keycode {
|
||||||
let key_code = winit_to_ruffle_key_code(key);
|
let key_code = winit_to_ruffle_key_code(key);
|
||||||
let key_char = winit_key_to_char(key, modifiers.shift());
|
let key_char = winit_key_to_char(key, modifiers.shift());
|
||||||
|
@ -407,7 +403,7 @@ impl App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WindowEvent::ReceivedCharacter(codepoint) => {
|
WindowEvent::ReceivedCharacter(codepoint) => {
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
let event = PlayerEvent::TextInput { codepoint };
|
let event = PlayerEvent::TextInput { codepoint };
|
||||||
player_lock.handle_event(event);
|
player_lock.handle_event(event);
|
||||||
check_redraw = true;
|
check_redraw = true;
|
||||||
|
@ -468,7 +464,7 @@ impl App {
|
||||||
}
|
}
|
||||||
|
|
||||||
let viewport_scale_factor = self.window.scale_factor();
|
let viewport_scale_factor = self.window.scale_factor();
|
||||||
let mut player_lock = self.player.lock().expect("Cannot reenter");
|
let mut player_lock = self.player.get();
|
||||||
player_lock.set_viewport_dimensions(ViewportDimensions {
|
player_lock.set_viewport_dimensions(ViewportDimensions {
|
||||||
width: viewport_size.width,
|
width: viewport_size.width,
|
||||||
height: viewport_size.height,
|
height: viewport_size.height,
|
||||||
|
@ -477,10 +473,7 @@ impl App {
|
||||||
}
|
}
|
||||||
|
|
||||||
winit::event::Event::UserEvent(RuffleEvent::ContextMenuItemClicked(index)) => {
|
winit::event::Event::UserEvent(RuffleEvent::ContextMenuItemClicked(index)) => {
|
||||||
self.player
|
self.player.get().run_context_menu_callback(index);
|
||||||
.lock()
|
|
||||||
.expect("Cannot reenter")
|
|
||||||
.run_context_menu_callback(index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
winit::event::Event::UserEvent(RuffleEvent::OpenFile) => {
|
winit::event::Event::UserEvent(RuffleEvent::OpenFile) => {
|
||||||
|
@ -507,7 +500,7 @@ impl App {
|
||||||
|
|
||||||
// Check for a redraw request.
|
// Check for a redraw request.
|
||||||
if check_redraw {
|
if check_redraw {
|
||||||
let player = self.player.lock().expect("Player lock");
|
let player = self.player.get();
|
||||||
let gui = self.gui.lock().expect("Gui lock");
|
let gui = self.gui.lock().expect("Gui lock");
|
||||||
if player.needs_render() || gui.needs_render() {
|
if player.needs_render() || gui.needs_render() {
|
||||||
self.window.request_redraw();
|
self.window.request_redraw();
|
||||||
|
|
|
@ -13,6 +13,7 @@ mod custom_event;
|
||||||
mod executor;
|
mod executor;
|
||||||
mod gui;
|
mod gui;
|
||||||
mod navigator;
|
mod navigator;
|
||||||
|
mod player;
|
||||||
mod storage;
|
mod storage;
|
||||||
mod task;
|
mod task;
|
||||||
mod time_demo;
|
mod time_demo;
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
use ruffle_core::Player;
|
||||||
|
use std::sync::{Arc, Mutex, MutexGuard};
|
||||||
|
|
||||||
|
pub struct PlayerController {
|
||||||
|
player: Arc<Mutex<Player>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PlayerController {
|
||||||
|
pub fn new(player: Arc<Mutex<Player>>) -> Self {
|
||||||
|
Self { player }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(&self) -> MutexGuard<Player> {
|
||||||
|
self.player
|
||||||
|
.try_lock()
|
||||||
|
.expect("Player lock must be available")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue