diff --git a/utils/mpris/mpris.rs b/utils/mpris/mpris.rs index dc98344d9a4080ba9b15489eadab12776b90f46a..d08b6941691fe1928aad5f1fb555f2af789769da 100644 --- a/utils/mpris/mpris.rs +++ b/utils/mpris/mpris.rs @@ -23,6 +23,8 @@ enum MediaPlayerPlaybackStatus { Stopped, } +struct µs(i32); + /// A valid path must be prefiexed by `/baka/lektor/`. After that we have the /// variant name in lower case, then a `/`, then the ascii only value. For /// example we can have: @@ -31,8 +33,16 @@ enum MediaPlayerObjectPath { Id(i64), } +impl From<String> for MediaPlayerLoopStatus {} +impl From<&str> for MediaPlayerLoopStatus {} + +impl From<String> for MediaPlayerPlaybackStatus {} +impl From<&str> for MediaPlayerPlaybackStatus {} + impl<'a> From<zbus::zvariant::ObjectPath<'a>> for MediaPlayerObjectPath {} +impl From<i32> for µs {} + #[dbus_proxy(interface = "org.mpris.MediaPlayer2", assume_defaults = true)] trait MediaPlayer2 { /// Quit method @@ -74,7 +84,10 @@ trait MediaPlayer2 { #[dbus_proxy(property)] fn supported_mime_types(&self) -> zbus::Result<Vec<String>>; - /// SupportedUriSchemes property + /// SupportedUriSchemes property. It should be `id://` and `file://` for + /// lektord. Here we support `file://` for only files in the database to + /// enable the user to search the kara folder and drop the files to play + /// them imediatly. #[dbus_proxy(property)] fn supported_uri_schemes(&self) -> zbus::Result<Vec<String>>; } @@ -103,7 +116,7 @@ trait Player { fn seek(&self, time_µs: i64) -> zbus::Result<()>; /// SetPosition method - fn set_position(&self, track_id: &MediaPlayerObjectPath, time_µs: i64) -> zbus::Result<()>; + fn set_position(&self, track_id: &MediaPlayerObjectPath, time_µs: µs) -> zbus::Result<()>; /// Stop method fn stop(&self) -> zbus::Result<()>; @@ -126,32 +139,42 @@ trait Player { /// LoopStatus property #[dbus_proxy(property)] - fn loop_status(&self) -> zbus::Result<String>; - fn set_loop_status(&self, value: &str) -> zbus::Result<()>; + fn loop_status(&self) -> zbus::Result<MediaPlayerObjectPath>; + fn set_loop_status(&self, value: &MediaPlayerObjectPath) -> zbus::Result<()>; - /// MaximumRate property + /// MaximumRate property. We will only set it to `1.0` here... #[dbus_proxy(property)] - fn maximum_rate(&self) -> zbus::Result<f64>; - fn set_maximum_rate(&self, value: f64) -> zbus::Result<()>; + fn maximum_rate(&self) -> zbus::Result<f64> { + Ok(1.0) + } + fn set_maximum_rate(&self, _: f64) -> zbus::Result<()> { + Ok(()) + } - /// Metadata property + /// Metadata property. If there is a current kara playing, there must be at + /// least a `mpris:trackid` value of type `o` which is the object path of + /// the current kara id. #[dbus_proxy(property)] fn metadata( &self, ) -> zbus::Result<std::collections::HashMap<String, zbus::zvariant::OwnedValue>>; - /// MinimumRate property + /// MinimumRate property. We will only set it to `1.0` here... #[dbus_proxy(property)] - fn minimum_rate(&self) -> zbus::Result<f64>; - fn set_minimum_rate(&self, value: f64) -> zbus::Result<()>; + fn minimum_rate(&self) -> zbus::Result<f64> { + Ok(1.0) + } + fn set_minimum_rate(&self, _: f64) -> zbus::Result<()> { + Ok(()) + } /// PlaybackStatus property #[dbus_proxy(property)] - fn playback_status(&self) -> zbus::Result<String>; + fn playback_status(&self) -> zbus::Result<MediaPlayerPlaybackStatus>; /// Position property #[dbus_proxy(property)] - fn position(&self) -> zbus::Result<i32>; + fn position(&self) -> zbus::Result<µs>; /// Rate property #[dbus_proxy(property)] @@ -160,8 +183,8 @@ trait Player { /// Shuffle property #[dbus_proxy(property)] - fn shuffle(&self) -> zbus::Result<f64>; - fn set_shuffle(&self, value: f64) -> zbus::Result<()>; + fn shuffle(&self) -> zbus::Result<bool>; + fn set_shuffle(&self, value: bool) -> zbus::Result<()>; /// Volume property #[dbus_proxy(property)] diff --git a/utils/mpris/mpris.xml b/utils/mpris/mpris.xml index 61f525aeff676d00e7d7115433d0c22a7a39a96c..efec5efcefb0507f119654023433c7a30fe507a3 100644 --- a/utils/mpris/mpris.xml +++ b/utils/mpris/mpris.xml @@ -18,7 +18,7 @@ <property name="PlaybackStatus" type="s" access="read" /> <property name="LoopStatus" type="s" access="readwrite" /> <property name="Volume" type="d" access="readwrite" /> - <property name="Shuffle" type="d" access="readwrite" /> + <property name="Shuffle" type="b" access="readwrite" /> <property name="Position" type="i" access="read" /> <property name="Rate" type="d" access="readwrite" /> <property name="MinimumRate" type="d" access="readwrite" />