DrKLO/Telegram · warning · UnhandledAudioFormatException

Unhandled format

Error message

Unhandled format: {inputAudioFormat}

What it means

SilenceSkippingAudioProcessor.onConfigure throws UnhandledAudioFormatException when the input encoding is not C.ENCODING_PCM_16BIT. This processor detects and removes silence runs using 16-bit amplitude heuristics; it only operates on 16-bit PCM. Other encodings (8/24/32-bit, float, compressed) lack the amplitude semantics the algorithm assumes and are rejected so the pipeline can bypass the processor or convert the input first.

Solutions

  1. Disable silence skipping (setEnabled(false), leave pending null) when the source encoding is not 16-bit PCM; insert a ResamplingAudioProcessor upstream to down-convert to 16-bit first.
  2. Gate enabling on the current AudioFormat: only setEnabled(true) when inputAudioFormat.encoding == C.ENCODING_PCM_16BIT.
  3. If silence removal is needed for hi-res sources, run it after a down-conversion step rather than on the native hi-res stream.

Example fix

// before
silenceSkippingProcessor.setEnabled(true); // always on
// source is 24-bit PCM -> onConfigure throws
// after
if (inputAudioFormat.encoding == C.ENCODING_PCM_16BIT) {
  silenceSkippingProcessor.setEnabled(true);
} else {
  silenceSkippingProcessor.setEnabled(false); // bypass, or resample to 16-bit first
}
Defensive patterns

Strategy: validation

Validate before calling

if (inputAudioFormat.encoding == C.ENCODING_PCM_16BIT) {
  silenceSkippingProcessor.setEnabled(true);
} else {
  silenceSkippingProcessor.setEnabled(false);
}

Try / catch

try {
  silenceSkippingProcessor.onConfigure(inputAudioFormat);
} catch (UnhandledAudioFormatException e) {
  silenceSkippingProcessor.setEnabled(false); // bypass for non-16-bit
}

Prevention

When it happens

Trigger: Enabling silence skipping (setEnabled(true) / set it pending) while the source is non-16-bit PCM — e.g. hi-res 24-bit FLAC, float PCM from a float decoder, or compressed audio routed incorrectly; a format switch mid-stream to a non-16-bit encoding with silence skipping left on.

Common situations: Default audio chain enabling silence skipping for all sources; playing hi-res audio where the decoder outputs 24/32-bit or float; toggling silence skipping at runtime without checking the current encoding.

Related errors


AI-assisted analysis of DrKLO/Telegram@45ab8f4308 (2026-08-14). Data as JSON: /api/errors/b695fb68276fdb81. Report an issue: GitHub.

Appendix: source

Thrown at TMessagesProj/src/main/java/com/google/android/exoplayer2/audio/SilenceSkippingAudioProcessor.java:151

    this.enabled = enabled;
  }

  /**
   * Returns the total number of frames of input audio that were skipped due to being classified as
   * silence since the last call to {@link #flush()}.
   */
  public long getSkippedFrames() {
    return skippedFrames;
  }

  // AudioProcessor implementation.

  @Override
  @CanIgnoreReturnValue
  public AudioFormat onConfigure(AudioFormat inputAudioFormat)
      throws UnhandledAudioFormatException {
    if (inputAudioFormat.encoding != C.ENCODING_PCM_16BIT) {
      throw new UnhandledAudioFormatException(inputAudioFormat);
    }
    return enabled ? inputAudioFormat : AudioFormat.NOT_SET;
  }

  @Override
  public boolean isActive() {
    return enabled;
  }

  @Override
  public void queueInput(ByteBuffer inputBuffer) {
    while (inputBuffer.hasRemaining() && !hasPendingOutput()) {
      switch (state) {
        case STATE_NOISY:
          processNoisy(inputBuffer);
          break;
        case STATE_MAYBE_SILENT:
          processMaybeSilence(inputBuffer);

View on GitHub (pinned to 45ab8f4308)