]> git.nihav.org Git - nihav-player.git/commitdiff
videoplayer: add option for showing volume master
authorKostya Shishkov <kostya.shishkov@gmail.com>
Fri, 19 Jun 2026 17:27:17 +0000 (19:27 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Fri, 19 Jun 2026 17:27:17 +0000 (19:27 +0200)
videoplayer/src/main.rs
videoplayer/src/osd.rs

index da6878f89b8d16a1e8849938d0691db6edfb44e9..6384241321d3c7006ef65dff01f1b359ceff1ad8 100644 (file)
@@ -380,7 +380,7 @@ fn draw_osd(disp_queue: &mut DispQueue, canvas: &mut Canvas<Window>, osd: &mut O
     canvas.copy(&disp_queue.osd_tex, srect, drect).expect("OSD blitting failure");
 }
 
-fn try_display(disp_queue: &mut DispQueue, canvas: &mut Canvas<Window>, osd: &mut OSD, ctime: &TimeKeep) -> Option<u64> {
+fn try_display(disp_queue: &mut DispQueue, canvas: &mut Canvas<Window>, osd: &mut OSD, ctime: &TimeKeep, volume: usize) -> Option<u64> {
     while !disp_queue.is_empty() {
         let disp_time = disp_queue.first_ts;
         let ctime = ctime.get_cur_time();
@@ -390,7 +390,7 @@ fn try_display(disp_queue: &mut DispQueue, canvas: &mut Canvas<Window>, osd: &mu
             disp_queue.move_start();
         } else {
             if osd.is_active() {
-                osd.prepare(ctime);
+                osd.prepare(ctime, volume);
             }
             let frm = disp_queue.queue.pop_front().unwrap();
             canvas.clear();
@@ -768,6 +768,9 @@ impl Player {
                             dmx.set_options(&[NAOption{name: FORCE_SEEK_OPTION, value: NAValue::Bool(!force_seek)}]);
                         }
                     },
+                    Keycode::V if keymod.contains(Mod::RSHIFTMOD) || keymod.contains(Mod::LSHIFTMOD) => {
+                        self.osd.set_vol_disp();
+                    },
                     Keycode::Z if keymod.contains(Mod::RSHIFTMOD) || keymod.contains(Mod::LSHIFTMOD) => {
                         self.zoom_mode = !self.no_sdl_scale;
                     },
@@ -1125,7 +1128,7 @@ impl Player {
                 debug_log!(self; {format!(" time {}", self.tkeep.get_cur_time())});
                 if self.has_video {
                     debug_log!(self; {format!("  disp queue {}-{} fill {} vqueue fill {}", disp_q.first_ts, disp_q.last_ts, disp_q.queue.len(), self.vcontrol.get_queue_size())});
-                    let ret = try_display(&mut disp_q, &mut canvas, &mut self.osd, &self.tkeep);
+                    let ret = try_display(&mut disp_q, &mut canvas, &mut self.osd, &self.tkeep, self.volume);
                     if let Some(next_time) = ret {
                         sleep_time = sleep_time.min(next_time);
                     }
index b3ba52ff735dc6257b7861dbc5223ddf3ebd02c9..ac20347d4170608d2077b1afeb20df774471c951 100644 (file)
@@ -4,6 +4,8 @@ pub const OSD_XOFF: usize = 10;
 pub const OSD_YOFF: usize = 4;
 pub const OSD_HEIGHT: usize = 16;
 
+pub const OSD_CHAR_VOL: char = '\x7F';
+
 #[derive(Default)]
 pub struct OSD {
     time:           Option<Instant>,
@@ -11,6 +13,7 @@ pub struct OSD {
     text_stride:    usize,
     duration:       u64,
     perm:           bool,
+    show_vol:       bool,
 }
 
 impl OSD {
@@ -19,6 +22,7 @@ impl OSD {
         self.text.clear();
         self.duration = 0;
         self.time = None;
+        self.show_vol = false;
     }
     pub fn set_duration(&mut self, duration: u64) { self.duration = duration; }
     pub fn toggle(&mut self) {
@@ -47,27 +51,39 @@ impl OSD {
             self.time = None;
         }
     }
+    pub fn set_vol_disp(&mut self) {
+        self.time = Some(Instant::now());
+        self.show_vol = true;
+    }
     pub fn update(&mut self) {
         if let Some(time) = self.time {
             if time.elapsed().as_millis() > 3000 {
                 self.time = None;
+                self.show_vol = false;
             }
+        } else {
+            self.show_vol = false;
         }
     }
     pub fn is_active(&self) -> bool { self.time.is_some() || self.perm }
-    pub fn prepare(&mut self, ts: u64) {
+    pub fn prepare(&mut self, ts: u64, vol: usize) {
         self.update();
         if !self.is_active() {
             return;
         }
-        let mut time_str = format_time(ts);
-        if self.duration != 0 {
-            time_str += "/";
-            time_str += format_time(self.duration).as_str();
-        }
+        let fmt_str = if !self.show_vol {
+                let mut time_str = format_time(ts);
+                if self.duration != 0 {
+                    time_str += "/";
+                    time_str += format_time(self.duration).as_str();
+                }
+                time_str
+            } else {
+                format!("{OSD_CHAR_VOL} {vol}%")
+            };
         let mut w = 0;
-        let mut syms = Vec::with_capacity(time_str.len());
-        for chr in time_str.chars() {
+        let mut syms = Vec::with_capacity(fmt_str.len());
+        for chr in fmt_str.chars() {
             let sym_idx = OSD_GLYPHS.iter().position(|el| el.sym == chr).unwrap_or(0);
             w += OSD_GLYPHS[sym_idx].width;
             syms.push(sym_idx);
@@ -735,6 +751,86 @@ const OSD_GLYPHS: &[Glyph] = &[
             0b_0000000000000000
         ],
     },
+    Glyph {
+        width:  13,
+        sym:    OSD_CHAR_VOL,
+        bits:   [
+            0b_0000000000000000,
+            0b_0000000000000000,
+            0b_0000000000000100,
+            0b_0000000000001100,
+            0b_0000000000010100,
+            0b_0000000000100100,
+            0b_0000011111000100,
+            0b_0000010000000100,
+            0b_0000010000000100,
+            0b_0000011111000100,
+            0b_0000000000100100,
+            0b_0000000000010100,
+            0b_0000000000001100,
+            0b_0000000000000100,
+            0b_0000000000000000,
+            0b_0000000000000000
+        ],
+        mask:   [
+            0b_0000000000000000,
+            0b_0000000000001110,
+            0b_0000000000011110,
+            0b_0000000000111110,
+            0b_0000000001111110,
+            0b_0000111111111110,
+            0b_0000111111101110,
+            0b_0000111111001110,
+            0b_0000111111001110,
+            0b_0000111111101110,
+            0b_0000111111111110,
+            0b_0000000001111110,
+            0b_0000000000111110,
+            0b_0000000000011110,
+            0b_0000000000001110,
+            0b_0000000000000000
+        ],
+    },
+    Glyph {
+        width:  14,
+        sym:    '%',
+        bits:   [
+            0b_0000000000000000,
+            0b_0000000000000000,
+            0b_0000000000001000,
+            0b_0000111000010000,
+            0b_0000111000010000,
+            0b_0000000000100000,
+            0b_0000000000100000,
+            0b_0000000001000000,
+            0b_0000000010000000,
+            0b_0000000100000000,
+            0b_0000000100000000,
+            0b_0000001000011100,
+            0b_0000001000011100,
+            0b_0000010000000000,
+            0b_0000000000000000,
+            0b_0000000000000000
+        ],
+        mask:   [
+            0b_0000000000000000,
+            0b_0000000000011100,
+            0b_0000111000011100,
+            0b_0001111100111000,
+            0b_0001111100111000,
+            0b_0000111001110000,
+            0b_0000000001110000,
+            0b_0000000011100000,
+            0b_0000000111000000,
+            0b_0000001110000000,
+            0b_0000001110011100,
+            0b_0000011100111110,
+            0b_0000011100111110,
+            0b_0000111000011100,
+            0b_0000111000000000,
+            0b_0000000000000000
+        ],
+    },
     Glyph {
         width:  12,
         sym:    ' ',