diff --git a/src/ui/window.rs b/src/ui/window.rs index 6fcde63..2ee2278 100644 --- a/src/ui/window.rs +++ b/src/ui/window.rs @@ -53,7 +53,7 @@ mod imp { #[property(get)] albums_model: gio::ListStore, - #[property(type = i64, get = Self::volume, set = Self::set_volume, minimum = 0, maximum = 100)] + #[property(type = i64, get = Self::volume, set = Self::set_volume)] _volume: (), #[property(type = bool, get = Self::mute, set = Self::set_mute)] _mute: (), @@ -102,6 +102,8 @@ mod imp { // "Useful to drain property changes before a new file is loaded." mpv.add_hook(0, "on_before_start_file", 0).unwrap(); + // "Useful to drain property changes after a file has finished." + mpv.add_hook(0, "o_after_start_file", 0).unwrap(); Self { state: Cell::new(State::Idle), @@ -354,27 +356,15 @@ mod imp { } fn duration(&self) -> f64 { - let duration = match self.mpv.get_property::("duration") { - Ok(duration) => Ok(Some(duration)), - Err(err) if err.is_property_unavailable() => { - Ok(self.song().as_ref().map(|song| song.duration() as f64)) - } - Err(err) => Err(err), - } - .unwrap(); + match self.state.get() { + State::Idle => 0.0, - { - let left = duration.map(|f| f as i64); - let right = self.song().as_ref().map(crate::model::Song::duration); - if left != right { - event!( - Level::WARN, - "mpv duration {left:?} doesn not match subsonic duration {right:?}" - ); + State::FileLoading | State::FileEnded => self.song().unwrap().duration() as f64, + + State::FileLoaded | State::Active | State::Seeking => { + self.mpv.get_property::("duration").unwrap() } } - - duration.unwrap_or(0.0) // placeholder } fn idle_active(&self) -> bool { @@ -461,16 +451,9 @@ mod imp { } fn on_hook(&self, event: crate::mpv::event::HookEvent) { - match event.reply_userdata { - 0 => { - assert_eq!(&event.name, "on_before_start_file"); - event!(Level::DEBUG, "on_before_start_file triggered"); - // just use this as a barrier - self.mpv.continue_hook(event.id).unwrap(); - } - - _ => unreachable!(), - } + event!(Level::DEBUG, "{} hook triggered", event.name); + // just use this as a barrier + self.mpv.continue_hook(event.id).unwrap(); } fn on_log_message(&self, event: crate::mpv::event::LogMessageEvent) { @@ -575,6 +558,17 @@ mod imp { self.mpv.get_property::("path").unwrap(), self.obj().song().unwrap().stream_url() ); + // same with "duration" + { + let left = self.mpv.get_property::("duration").unwrap() as i64; + let right = self.song().unwrap().duration(); + if left != right { + event!( + Level::WARN, + "mpv duration {left:?} doesn not match subsonic duration {right:?}" + ); + } + } } fn on_seek(&self) {