{"record":{"id":"b9edaadefd17ee78","repo":"google/ExoPlayer","slug":"missing-implementation-to-handle-command-set-speed","errorCode":null,"errorMessage":"Missing implementation to handle COMMAND_SET_SPEED_AND_PITCH","messagePattern":"Missing implementation to handle COMMAND_SET_SPEED_AND_PITCH","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java","lineNumber":3008,"sourceCode":"   *     changes caused by this call.\n   */\n  @ForOverride\n  protected ListenableFuture<?> handleSetShuffleModeEnabled(boolean shuffleModeEnabled) {\n    throw new IllegalStateException(\"Missing implementation to handle COMMAND_SET_SHUFFLE_MODE\");\n  }\n\n  /**\n   * Handles calls to {@link Player#setPlaybackParameters} or {@link Player#setPlaybackSpeed}.\n   *\n   * <p>Will only be called if {@link Player#COMMAND_SET_SPEED_AND_PITCH} is available.\n   *\n   * @param playbackParameters The requested {@link PlaybackParameters}.\n   * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}\n   *     changes caused by this call.\n   */\n  @ForOverride\n  protected ListenableFuture<?> handleSetPlaybackParameters(PlaybackParameters playbackParameters) {\n    throw new IllegalStateException(\"Missing implementation to handle COMMAND_SET_SPEED_AND_PITCH\");\n  }\n\n  /**\n   * Handles calls to {@link Player#setTrackSelectionParameters}.\n   *\n   * <p>Will only be called if {@link Player#COMMAND_SET_TRACK_SELECTION_PARAMETERS} is available.\n   *\n   * @param trackSelectionParameters The requested {@link TrackSelectionParameters}.\n   * @return A {@link ListenableFuture} indicating the completion of all immediate {@link State}\n   *     changes caused by this call.\n   */\n  @ForOverride\n  protected ListenableFuture<?> handleSetTrackSelectionParameters(\n      TrackSelectionParameters trackSelectionParameters) {\n    throw new IllegalStateException(\n        \"Missing implementation to handle COMMAND_SET_TRACK_SELECTION_PARAMETERS\");\n  }\n","sourceCodeStart":2990,"sourceCodeEnd":3026,"githubUrl":"https://github.com/google/ExoPlayer/blob/dd430f7053a1a3958deea3ead6a0565150c06bfc/library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java#L2990-L3026","documentation":"Default handler behind Player.setPlaybackParameters/setPlaybackSpeed in SimpleBasePlayer: it throws when COMMAND_SET_SPEED_AND_PITCH is advertised but handleSetPlaybackParameters(PlaybackParameters) is not overridden. The base class maps the public speed/pitch API onto this single handler.","triggerScenarios":"player.setPlaybackSpeed(1.5f) or setPlaybackParameters(new PlaybackParameters(1.2f, 0.95f)) on a SimpleBasePlayer subclass whose State includes COMMAND_SET_SPEED_AND_PITCH without a matching override.","commonSituations":"Custom players that play at fixed rate and never implement speed; speed controls in UI or MediaController (e.g. playback-control layout speed button) hitting the unimplemented command.","solutions":["Override handleSetPlaybackParameters(PlaybackParameters playbackParameters) and reflect the new parameters in State (fallback parameters too, if the backend clamps them).","If speed/pitch control is unsupported, build availableCommands without COMMAND_SET_SPEED_AND_PITCH.","Validate/clamp unreasonable speeds before forwarding to the backend."],"exampleFix":"// before\n// no override; UI calls setPlaybackSpeed(2f) -> throws\n\n// after\n@Override\nprotected ListenableFuture<?> handleSetPlaybackParameters(PlaybackParameters params) {\n  return updateStateAndNotify(\n      state.buildUpon().setPlaybackParameters(params).build());\n}","handlingStrategy":"validation","validationCode":"if (!supportsSpeedAndPitch) commands.remove(Player.COMMAND_SET_SPEED_AND_PITCH);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Implement handleSetPlaybackParameters() or exclude COMMAND_SET_SPEED_AND_PITCH.","Clamp speeds to a range your backend supports before applying.","Test with the speed controls your UI exposes."],"tags":["simplebaseplayer","custom-player","playback-speed","media3","contract"],"backgroundTag":null,"analyzedSha":"dd430f7053a1a3958deea3ead6a0565150c06bfc","analyzedAt":"2026-08-14T12:22:02.982Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}