make video player use multi-threaded decoders if possible
[nihav-player.git] / videoplayer / src / audiodec.rs
index 304519294c487b805397e62e752c5dcc1d0c8d1b..e9da970ad577d3a3c518c8f100134cff23286b2a 100644 (file)
@@ -12,7 +12,7 @@ use nihav_core::formats::*;
 use nihav_core::codecs::*;
 use nihav_core::soundcvt::*;
 
-use super::{DecoderStuff, PktSendEvent};
+use super::{DecoderStuff, DecoderType, PktSendEvent};
 
 static SKIP_ADECODING: AtomicBool = AtomicBool::new(false);
 static AUDIO_VOLUME: AtomicUsize = AtomicUsize::new(100);
@@ -181,6 +181,7 @@ fn start_audio_decoding(asystem: &AudioSubsystem, ainfo: NAAudioInfo, mut audio_
     }
     let adevice = ret.unwrap();
     (Some(adevice), std::thread::Builder::new().name("acontrol".to_string()).spawn(move ||{
+            let adec = if let DecoderType::Audio(ref mut dec) = audio_dec.dec { dec } else { panic!("not an audio decoder!"); };
             let mut samplepos = 0usize;
             let dst_chmap = if dst_info.channels == 2 {
                     NAChannelMap::from_str("L,R").unwrap()
@@ -199,7 +200,7 @@ fn start_audio_decoding(asystem: &AudioSubsystem, ainfo: NAAudioInfo, mut audio_
                             std::thread::sleep(Duration::from_millis(100));
                         }
                         if !SKIP_ADECODING.load(Ordering::Relaxed) {
-                            if let Ok(frm) = audio_dec.dec.decode(&mut audio_dec.dsupp, &pkt) {
+                            if let Ok(frm) = adec.decode(&mut audio_dec.dsupp, &pkt) {
                                 let buf = frm.get_buffer();
                                 if let Some(pts) = frm.get_pts() {
                                     samplepos = NATimeInfo::ts_to_time(pts, u64::from(dst_info.sample_rate), frm.ts.tb_num, frm.ts.tb_den) as usize;
@@ -223,8 +224,9 @@ fn start_audio_decoding(asystem: &AudioSubsystem, ainfo: NAAudioInfo, mut audio_
                             }
                         }
                     },
+                    Ok(PktSendEvent::GetFrames) => {},
                     Ok(PktSendEvent::Flush) => {
-                        audio_dec.dec.flush();
+                        adec.flush();
                         let mut qdata = queue.lock().unwrap();
                         qdata.flush();
                         SKIP_ADECODING.store(false, Ordering::Relaxed);