Skip to content

Commit 7946bb8

Browse files
committed
feat(mpris): Get position from player and provide it to MPRIS
1 parent 2fff153 commit 7946bb8

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

src/mpris_event_handler.rs

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,7 @@ struct MprisPlayerService {
563563
shuffle: bool,
564564
playback_status: PlaybackStatus,
565565
volume: u16,
566+
position_ms: Option<u32>,
566567
metadata: Metadata,
567568
}
568569

@@ -905,7 +906,9 @@ impl MprisPlayerService {
905906
async fn position(&self) -> zbus::fdo::Result<TimeInUs> {
906907
debug!("org.mpris.MediaPlayer2.Player::Position");
907908
// todo!("fetch up-to-date position from player")
908-
Ok(0)
909+
self.position_ms
910+
.map(|position_ms| position_ms as i64 * 1000)
911+
.ok_or(zbus::fdo::Error::Failed(String::from("Got no position")))
909912
}
910913

911914
// The minimum value which the `Rate` property can take. Clients should not attempt to set the
@@ -1104,6 +1107,7 @@ impl MprisEventHandler {
11041107
shuffle: false,
11051108
playback_status: PlaybackStatus::Stopped,
11061109
volume: u16::MAX,
1110+
position_ms: None,
11071111
metadata: Metadata::default(),
11081112
};
11091113

@@ -1261,12 +1265,14 @@ impl MprisTask {
12611265
}
12621266
PlayerEvent::Playing {
12631267
track_id,
1264-
// position_ms,
1268+
position_ms,
12651269
..
12661270
} => {
1267-
// TODO: update position
12681271
let iface_ref = self.mpris_player_iface().await;
12691272
let mut iface = iface_ref.get_mut().await;
1273+
1274+
iface.position_ms = Some(position_ms);
1275+
12701276
let meta = &mut iface.metadata;
12711277

12721278
if meta.mpris.track_id.as_ref() != Some(&track_id) {
@@ -1283,12 +1289,14 @@ impl MprisTask {
12831289
}
12841290
PlayerEvent::Paused {
12851291
track_id,
1286-
// position_ms,
1292+
position_ms,
12871293
..
12881294
} => {
1289-
// TODO: update position
12901295
let iface_ref = self.mpris_player_iface().await;
12911296
let mut iface = iface_ref.get_mut().await;
1297+
1298+
iface.position_ms = Some(position_ms);
1299+
12921300
let meta = &mut iface.metadata;
12931301

12941302
if meta.mpris.track_id.as_ref() != Some(&track_id) {
@@ -1330,12 +1338,14 @@ impl MprisTask {
13301338
}
13311339
PlayerEvent::Seeked {
13321340
track_id,
1333-
// position_ms,
1341+
position_ms,
13341342
..
13351343
} => {
1336-
// TODO: Update position
13371344
let iface_ref = self.mpris_player_iface().await;
13381345
let mut iface = iface_ref.get_mut().await;
1346+
1347+
iface.position_ms = Some(position_ms);
1348+
13391349
let meta = &mut iface.metadata;
13401350

13411351
if meta.mpris.track_id.as_ref() != Some(&track_id) {
@@ -1347,11 +1357,14 @@ impl MprisTask {
13471357
}
13481358
PlayerEvent::PositionCorrection {
13491359
track_id,
1350-
// position_ms,
1360+
position_ms,
13511361
..
13521362
} => {
13531363
let iface_ref = self.mpris_player_iface().await;
13541364
let mut iface = iface_ref.get_mut().await;
1365+
1366+
iface.position_ms = Some(position_ms);
1367+
13551368
let meta = &mut iface.metadata;
13561369

13571370
if meta.mpris.track_id.as_ref() != Some(&track_id) {
@@ -1361,9 +1374,16 @@ impl MprisTask {
13611374
iface.metadata_changed(iface_ref.signal_context()).await?;
13621375
}
13631376
}
1364-
PlayerEvent::PositionChanged { track_id, .. } => {
1377+
PlayerEvent::PositionChanged {
1378+
track_id,
1379+
position_ms,
1380+
..
1381+
} => {
13651382
let iface_ref = self.mpris_player_iface().await;
13661383
let mut iface = iface_ref.get_mut().await;
1384+
1385+
iface.position_ms = Some(position_ms);
1386+
13671387
let meta = &mut iface.metadata;
13681388

13691389
if meta.mpris.track_id.as_ref() != Some(&track_id) {

0 commit comments

Comments
 (0)