From f94517d945686152b043ecc680473325af08b27b Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Fri, 19 Jun 2026 19:27:17 +0200 Subject: [PATCH] videoplayer: add option for showing volume --- videoplayer/src/main.rs | 9 ++-- videoplayer/src/osd.rs | 112 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 110 insertions(+), 11 deletions(-) diff --git a/videoplayer/src/main.rs b/videoplayer/src/main.rs index da6878f..6384241 100644 --- a/videoplayer/src/main.rs +++ b/videoplayer/src/main.rs @@ -380,7 +380,7 @@ fn draw_osd(disp_queue: &mut DispQueue, canvas: &mut Canvas, 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, osd: &mut OSD, ctime: &TimeKeep) -> Option { +fn try_display(disp_queue: &mut DispQueue, canvas: &mut Canvas, osd: &mut OSD, ctime: &TimeKeep, volume: usize) -> Option { 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, 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); } diff --git a/videoplayer/src/osd.rs b/videoplayer/src/osd.rs index b3ba52f..ac20347 100644 --- a/videoplayer/src/osd.rs +++ b/videoplayer/src/osd.rs @@ -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, @@ -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: ' ', -- 2.39.5