code: public synchronized void setPlaybackState(int player, long position, boolean playing) {
          if (getMonitoredPlayer() != 0 && player != getMonitoredPlayer()) {
              throw new IllegalStateException("Cannot setPlaybackState for another player when monitoring player " + getMonitoredPlayer());
          }
          if (player < 1) {
              throw new IllegalArgumentException("player must be positive");
          }
          long oldMaxPosition = 0;
          PlaybackState furthestState = getFurthestPlaybackState();
          if (furthestState != null) {
              oldMaxPosition = furthestState.position;
          }
          PlaybackState newState = new PlaybackState(player, position, playing);
          PlaybackState oldState = playbackStateMap.put(player, newState);
          long newMaxPosition = 0;
          furthestState = getFurthestPlaybackState();
          if (furthestState != null) {
              newMaxPosition = furthestState.position;
          }
          repaintDueToPlaybackStateChange(oldMaxPosition, newMaxPosition, oldState, newState);
      }
docs: Set the current playback state for a player.
  
  Will cause part of the component to be redrawn if the player state has
  changed (and we have the {@link TrackMetadata} we need to translate the time into a position in the
  component). This will be quickly overruled if a player is being monitored, but
  can be used in other contexts.
  
  @param player the player number whose playback state is being recorded
  @param position the current playback position of that player in milliseconds
  @param playing whether the player is actively playing the track
  
  @throws IllegalStateException if the component is configured to monitor a player, and this is called
  with state for a different player
  @throws IllegalArgumentException if player is less than one
  
  @since 0.5.0