116 lines
3.3 KiB
Rust
116 lines
3.3 KiB
Rust
use raw_window_handle::{HasRawWindowHandle, RawWindowHandle};
|
|
use vlc::{self, EventType, Instance, Media, MediaPlayer, State};
|
|
use winit::{
|
|
event::{ElementState, VirtualKeyCode, WindowEvent},
|
|
event_loop::{ControlFlow, EventLoop},
|
|
window::{Fullscreen, WindowBuilder},
|
|
};
|
|
|
|
#[derive(Debug)]
|
|
enum UserEvent {
|
|
MediaStopped,
|
|
}
|
|
|
|
fn main() {
|
|
// Create window
|
|
let event_loop = EventLoop::<UserEvent>::with_user_event();
|
|
|
|
let window = WindowBuilder::new()
|
|
.with_title("vlc-rs sample")
|
|
.with_inner_size(winit::dpi::PhysicalSize::new(800u16, 600u16))
|
|
.build(&event_loop)
|
|
.unwrap();
|
|
|
|
// Instanciate libvlc
|
|
let instance = Instance::new().unwrap();
|
|
|
|
let args: Vec<String> = std::env::args().collect();
|
|
let path = match args.get(1) {
|
|
Some(s) => s,
|
|
None => {
|
|
println!("Usage: winit_player path_to_a_media_file");
|
|
return;
|
|
}
|
|
};
|
|
let md = Media::new_path(&instance, path).unwrap();
|
|
|
|
let mdp = MediaPlayer::new(&instance).unwrap();
|
|
|
|
// Request libvlc to draw in the window
|
|
match window.raw_window_handle() {
|
|
RawWindowHandle::AppKit(handle) => {
|
|
mdp.set_nsobject(handle.ns_view);
|
|
}
|
|
RawWindowHandle::Xlib(handle) => {
|
|
mdp.set_xwindow(handle.window as u32);
|
|
}
|
|
RawWindowHandle::Win32(handle) => {
|
|
mdp.set_hwnd(handle.hwnd);
|
|
}
|
|
_ => {
|
|
panic!("Unknown Window handle type")
|
|
}
|
|
}
|
|
|
|
// Link EventLoop and libvlc
|
|
let proxy = event_loop.create_proxy();
|
|
|
|
let em = md.event_manager();
|
|
let _ = em.attach(EventType::MediaStateChanged, move |e, _| match e {
|
|
vlc::Event::MediaStateChanged(s) => {
|
|
println!("State : {:?}", s);
|
|
if s == State::Ended || s == State::Error || s == State::Stopped {
|
|
proxy.send_event(UserEvent::MediaStopped).unwrap();
|
|
}
|
|
}
|
|
_ => (),
|
|
});
|
|
|
|
// Start
|
|
mdp.set_media(&md);
|
|
mdp.play().unwrap();
|
|
|
|
// Event loop
|
|
let mut fullscreen = false;
|
|
|
|
event_loop.run(move |event, _, control_flow| {
|
|
*control_flow = ControlFlow::Wait;
|
|
|
|
match event {
|
|
winit::event::Event::WindowEvent {
|
|
event: WindowEvent::CloseRequested,
|
|
window_id: _,
|
|
} => {
|
|
mdp.stop();
|
|
}
|
|
winit::event::Event::UserEvent(UserEvent::MediaStopped) => {
|
|
*control_flow = ControlFlow::Exit;
|
|
}
|
|
winit::event::Event::WindowEvent {
|
|
event: WindowEvent::KeyboardInput { input, .. },
|
|
..
|
|
} => {
|
|
if input.state != ElementState::Pressed {
|
|
return;
|
|
}
|
|
|
|
match input.virtual_keycode {
|
|
Some(VirtualKeyCode::F) => {
|
|
let next_fullscreen_mode = if fullscreen {
|
|
None
|
|
} else {
|
|
Some(Fullscreen::Borderless(None))
|
|
};
|
|
|
|
window.set_fullscreen(next_fullscreen_mode);
|
|
|
|
fullscreen = !fullscreen;
|
|
}
|
|
_ => {}
|
|
}
|
|
}
|
|
_ => {}
|
|
}
|
|
});
|
|
}
|