anchor.diff:        onPressed: AudioService.skipToNext,
       );
   
  -class PlaybackState {
  +class CurrentSongState {
     final Song song;
     final Duration position;
   
  -  PlaybackState(this.song, this.position);
  +  CurrentSongState(this.song, this.position);
   }
  
positive.code:     );
    }
  
    Stream<PlaybackState> get _mediaStateStream => Rx.combineLatest2<MediaItem, Duration, PlaybackState>(
        AudioService.currentMediaItemStream,
        AudioService.positionStream,
        (mediaItem, position) => PlaybackState(mediaItem.toSong(), position));
  
    @override
    Widget build(BuildContext context) {
      return StreamBuilder<PlaybackState>(
          stream: _mediaStateStream,
          builder: (context, snapshot) {
            if (!snapshot.hasData) {
  
negative.code:                           ],
                          ),
                        ),
                        StreamBuilder<PlaybackState>(
                          stream: AudioService.playbackStateStream,
                          builder: (context, snapshot) {
                            bool playing = false;
                            if (snapshot.hasData) {
                              playing = snapshot.data.playing &&
                                  snapshot.data.processingState != AudioProcessingState.completed;
                            }
                            return Row(
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: [
                                if (playing)
                                  pauseButton()
                                else
                                  playButton(), // TODO should re-play last song if completed
                                nextButton(), // TODO grey out when cannot skip next
                              ],
                            );
  