@@ -563,6 +563,7 @@ struct MprisPlayerService {
563
563
shuffle : bool ,
564
564
playback_status : PlaybackStatus ,
565
565
volume : u16 ,
566
+ position_ms : Option < u32 > ,
566
567
metadata : Metadata ,
567
568
}
568
569
@@ -905,7 +906,9 @@ impl MprisPlayerService {
905
906
async fn position ( & self ) -> zbus:: fdo:: Result < TimeInUs > {
906
907
debug ! ( "org.mpris.MediaPlayer2.Player::Position" ) ;
907
908
// 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" ) ) )
909
912
}
910
913
911
914
// The minimum value which the `Rate` property can take. Clients should not attempt to set the
@@ -1104,6 +1107,7 @@ impl MprisEventHandler {
1104
1107
shuffle : false ,
1105
1108
playback_status : PlaybackStatus :: Stopped ,
1106
1109
volume : u16:: MAX ,
1110
+ position_ms : None ,
1107
1111
metadata : Metadata :: default ( ) ,
1108
1112
} ;
1109
1113
@@ -1261,12 +1265,14 @@ impl MprisTask {
1261
1265
}
1262
1266
PlayerEvent :: Playing {
1263
1267
track_id,
1264
- // position_ms,
1268
+ position_ms,
1265
1269
..
1266
1270
} => {
1267
- // TODO: update position
1268
1271
let iface_ref = self . mpris_player_iface ( ) . await ;
1269
1272
let mut iface = iface_ref. get_mut ( ) . await ;
1273
+
1274
+ iface. position_ms = Some ( position_ms) ;
1275
+
1270
1276
let meta = & mut iface. metadata ;
1271
1277
1272
1278
if meta. mpris . track_id . as_ref ( ) != Some ( & track_id) {
@@ -1283,12 +1289,14 @@ impl MprisTask {
1283
1289
}
1284
1290
PlayerEvent :: Paused {
1285
1291
track_id,
1286
- // position_ms,
1292
+ position_ms,
1287
1293
..
1288
1294
} => {
1289
- // TODO: update position
1290
1295
let iface_ref = self . mpris_player_iface ( ) . await ;
1291
1296
let mut iface = iface_ref. get_mut ( ) . await ;
1297
+
1298
+ iface. position_ms = Some ( position_ms) ;
1299
+
1292
1300
let meta = & mut iface. metadata ;
1293
1301
1294
1302
if meta. mpris . track_id . as_ref ( ) != Some ( & track_id) {
@@ -1330,12 +1338,14 @@ impl MprisTask {
1330
1338
}
1331
1339
PlayerEvent :: Seeked {
1332
1340
track_id,
1333
- // position_ms,
1341
+ position_ms,
1334
1342
..
1335
1343
} => {
1336
- // TODO: Update position
1337
1344
let iface_ref = self . mpris_player_iface ( ) . await ;
1338
1345
let mut iface = iface_ref. get_mut ( ) . await ;
1346
+
1347
+ iface. position_ms = Some ( position_ms) ;
1348
+
1339
1349
let meta = & mut iface. metadata ;
1340
1350
1341
1351
if meta. mpris . track_id . as_ref ( ) != Some ( & track_id) {
@@ -1347,11 +1357,14 @@ impl MprisTask {
1347
1357
}
1348
1358
PlayerEvent :: PositionCorrection {
1349
1359
track_id,
1350
- // position_ms,
1360
+ position_ms,
1351
1361
..
1352
1362
} => {
1353
1363
let iface_ref = self . mpris_player_iface ( ) . await ;
1354
1364
let mut iface = iface_ref. get_mut ( ) . await ;
1365
+
1366
+ iface. position_ms = Some ( position_ms) ;
1367
+
1355
1368
let meta = & mut iface. metadata ;
1356
1369
1357
1370
if meta. mpris . track_id . as_ref ( ) != Some ( & track_id) {
@@ -1361,9 +1374,16 @@ impl MprisTask {
1361
1374
iface. metadata_changed ( iface_ref. signal_context ( ) ) . await ?;
1362
1375
}
1363
1376
}
1364
- PlayerEvent :: PositionChanged { track_id, .. } => {
1377
+ PlayerEvent :: PositionChanged {
1378
+ track_id,
1379
+ position_ms,
1380
+ ..
1381
+ } => {
1365
1382
let iface_ref = self . mpris_player_iface ( ) . await ;
1366
1383
let mut iface = iface_ref. get_mut ( ) . await ;
1384
+
1385
+ iface. position_ms = Some ( position_ms) ;
1386
+
1367
1387
let meta = & mut iface. metadata ;
1368
1388
1369
1389
if meta. mpris . track_id . as_ref ( ) != Some ( & track_id) {
0 commit comments