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();
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();
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;
},
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);
}
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>,
text_stride: usize,
duration: u64,
perm: bool,
+ show_vol: bool,
}
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) {
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);
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: ' ',