Переглянути джерело

main: add condvar for exit

Alexandre Janniaux 5 роки тому
батько
коміт
b38fb10822
1 змінених файлів з 26 додано та 4 видалено
  1. 26 4
      src/main.rs

+ 26 - 4
src/main.rs

@@ -1,6 +1,8 @@
-use vlc::{Instance, Media};
+use vlc::{Instance, Media, MediaPlayer};
 use std::path::PathBuf;
 
+use std::sync::{Arc, Mutex, Condvar};
+
 fn main()
     -> std::result::Result<(), ()>
 {
@@ -8,13 +10,33 @@ fn main()
         .collect::<Vec<String>>();
 
     assert!(args.len() > 1);
-
     let filename = args[1].clone();
-
     let path = PathBuf::from(filename);
+
     let instance = Instance::new().unwrap();
+    let media    = Media::new_path(&instance, &path).unwrap();
+    let player   = MediaPlayer::new(&instance).unwrap();
+    let evt_mgr  = player.event_manager();
+
+    let local_var  = Arc::new((Mutex::new(false), Condvar::new()));
+    let libvlc_var = local_var.clone();
+
+    evt_mgr.attach(vlc::EventType::MediaPlayerEndReached, move |event, obj| {
+        let (lock, cond_var) = &*libvlc_var;
+        let mut running = lock.lock().unwrap();
+        *running = false;
+        cond_var.notify_one();
+    }).unwrap();
+
+    let (lock, cond_var) = &*local_var;
+    let mut running = lock.lock().unwrap();
+
+    while !*running
+    {
+        running = cond_var.wait(running).unwrap();
+    }
 
-    let md = Media::new_path(&instance, &path).unwrap();
+    println!(" - Transcode just finished");
 
     Ok(())
 }