anchor.diff:                            ],
                           ),
                         ),
  -                      StreamBuilder<bool>(
  -                        stream: AudioService.playbackStateStream.map((state) => state.playing).distinct(),
  +                      StreamBuilder<PlaybackState>(
  +                        stream: AudioService.playbackStateStream,
                           builder: (context, snapshot) {
  -                          final playing = snapshot.data ?? false;
  +                          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 still shows playing at the end of playlist
  +                                playButton(), // TODO should re-play last song if completed
                                 nextButton(), // TODO grey out when cannot skip next
                               ],
                             );
  
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:       onPressed: AudioService.skipToNext,
      );
  
  class CurrentSongState {
    final Song song;
    final Duration position;
  
    CurrentSongState(this.song, this.position);
  }
  