@@ -621,11 +621,16 @@ impl MprisPlayerService {
621621    // Calling Play after this should cause playback to start again from the same position. 
622622    // 
623623    // If `self.can_pause` is `false`, attempting to call this method should have no effect. 
624-     async  fn  pause ( & self )  { 
624+     async  fn  pause ( & self )  -> zbus :: fdo :: Result < ( ) >   { 
625625        debug ! ( "org.mpris.MediaPlayer2.Player::Pause" ) ; 
626-         // FIXME: This should return an error if can_pause is false 
627-         if  let  Some ( spirc)  = & self . spirc  { 
628-             let  _ = spirc. pause ( ) ; 
626+         match  ( & self . spirc ,  & self . metadata . mpris . track_id )  { 
627+             ( Some ( spirc) ,  Some ( _) )  => spirc
628+                 . pause ( ) 
629+                 . map_err ( |err| zbus:: fdo:: Error :: Failed ( format ! ( "{err}" ) ) ) , 
630+             ( Some ( _) ,  None )  => { 
631+                 zbus:: fdo:: Result :: Err ( zbus:: fdo:: Error :: Failed ( String :: from ( "No track" ) ) ) 
632+             } 
633+             _ => zbus:: fdo:: Result :: Err ( zbus:: fdo:: Error :: Failed ( String :: from ( "Can't play/pause" ) ) ) , 
629634        } 
630635    } 
631636
@@ -637,11 +642,16 @@ impl MprisPlayerService {
637642    // 
638643    // If `self.can_pause` is `false`, attempting to call this method should have no effect and 
639644    // raise an error. 
640-     async  fn  play_pause ( & self )  { 
645+     async  fn  play_pause ( & self )  -> zbus :: fdo :: Result < ( ) >   { 
641646        debug ! ( "org.mpris.MediaPlayer2.Player::PlayPause" ) ; 
642-         // FIXME: This should return an error if can_pause is false 
643-         if  let  Some ( spirc)  = & self . spirc  { 
644-             let  _ = spirc. play_pause ( ) ; 
647+         match  ( & self . spirc ,  & self . metadata . mpris . track_id )  { 
648+             ( Some ( spirc) ,  Some ( _) )  => spirc
649+                 . play_pause ( ) 
650+                 . map_err ( |err| zbus:: fdo:: Error :: Failed ( format ! ( "{err}" ) ) ) , 
651+             ( Some ( _) ,  None )  => { 
652+                 zbus:: fdo:: Result :: Err ( zbus:: fdo:: Error :: Failed ( String :: from ( "No track" ) ) ) 
653+             } 
654+             _ => zbus:: fdo:: Result :: Err ( zbus:: fdo:: Error :: Failed ( String :: from ( "Can't play/pause" ) ) ) , 
645655        } 
646656    } 
647657
@@ -656,7 +666,6 @@ impl MprisPlayerService {
656666    // an error. 
657667    async  fn  stop ( & self )  { 
658668        debug ! ( "org.mpris.MediaPlayer2.Player::Stop" ) ; 
659-         // FIXME: This should return an error if can_control is false 
660669        if  let  Some ( spirc)  = & self . spirc  { 
661670            let  _ = spirc. pause ( ) ; 
662671            let  _ = spirc. set_position_ms ( 0 ) ; 
@@ -672,12 +681,25 @@ impl MprisPlayerService {
672681    // If there is no track to play, this has no effect. 
673682    // 
674683    // If `self.can_play` is `false`, attempting to call this method should have no effect. 
675-     async  fn  play ( & self )  { 
684+     async  fn  play ( & self )  -> zbus :: fdo :: Result < ( ) >   { 
676685        debug ! ( "org.mpris.MediaPlayer2.Player::Play" ) ; 
677686        if  let  Some ( spirc)  = & self . spirc  { 
678687            let  _ = spirc. activate ( ) ; 
679688            let  _ = spirc. play ( ) ; 
680689        } 
690+         match  ( & self . spirc ,  & self . metadata . mpris . track_id )  { 
691+             ( Some ( spirc) ,  Some ( _) )  => { 
692+                 let  result:  Result < ( ) ,  Error >  = ( || { 
693+                     spirc. activate ( ) ?; 
694+                     spirc. play ( ) 
695+                 } ) ( ) ; 
696+                 result. map_err ( |err| zbus:: fdo:: Error :: Failed ( format ! ( "{err}" ) ) ) 
697+             } 
698+             ( Some ( _) ,  None )  => { 
699+                 zbus:: fdo:: Result :: Err ( zbus:: fdo:: Error :: Failed ( String :: from ( "No track" ) ) ) 
700+             } 
701+             _ => zbus:: fdo:: Result :: Err ( zbus:: fdo:: Error :: Failed ( String :: from ( "Can't play/pause" ) ) ) , 
702+         } 
681703    } 
682704
683705    // Seeks forward in the current track by the specified number of microseconds. 
0 commit comments