stride3d/stride · error · Exception

Celt decoder returned a wrong decoding buffer size.

Error message

Celt decoder returned a wrong decoding buffer size.

What it means

Thrown by CompressedSoundSource.ExtractAndFillData when the Celt decoder's Decode returns a sample count other than SamplesPerFrame for a packet. The library requires every compressed audio packet to decode into an exact fixed-size frame buffer; any other count indicates corrupt data or a broken codec configuration.

Solutions

  1. Re-import or re-export the offending audio asset so it is encoded with the current Celt settings (sample rate, frame size).
  2. Verify the asset file integrity (checksum, complete download/checkout).
  3. Check that encoder/decoder settings (sample rate, buffer size, channels) match the ones used to produce the asset.
  4. Update Stride if the asset was produced by an incompatible engine version.

Example fix

// before
var sound = Sound.Load("assets/broken_sfx.ogg");
// after
if (!AssetChecksum.Valid("assets/broken_sfx.ogg"))
    Asset.Reimport("assets/broken_sfx.ogg");
var sound = Sound.Load("assets/broken_sfx.ogg");
Defensive patterns

Strategy: try-catch

Validate before calling

// Before shipping, verify assets:
// checksum match + re-imported with current Celt settings
bool assetOk = AssetChecksum.Matches("assets/sfx.ogg") && Asset.Metadata.CeltMode == CurrentCeltMode;

Try / catch

try
{
    var sound = Sound.Load(assetPath);
}
catch (Exception ex) when (ex.Message.Contains("Celt decoder returned a wrong decoding buffer size"))
{
    logger.Error($"Corrupt/incompatible audio asset: {assetPath}");
    sound = null; // skip asset or schedule re-import
}

Prevention

When it happens

Trigger: Decoding a .ogg/Celt-compressed sound asset whose packets are corrupt, truncated, or encoded with a different sample rate/frame size than the decoder's custom mode.

Common situations: Assets corrupted during build/transfer or VCS merge; re-encoded audio assets after changing Celt sample-rate settings; partially written asset files.

Related errors


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/574e8a8e55e0bd71. Report an issue: GitHub.

Appendix: source

Thrown at sources/engine/Stride.Audio/CompressedSoundSource.cs:269

            {
                const int passes = SamplesPerBuffer / SamplesPerFrame;
                var offset = 0;
                var bufferPtr = (short*)utilityBuffer.Pointer;
                var startingPacket = startingPacketIndex == currentPacketIndex;
                var endingPacket = false;
                for (var i = 0; i < passes; i++)
                {
                    endingPacket = endPacketIndex == currentPacketIndex;

                    //read one packet, size first, then data
                    var len = reader.ReadInt16();
                    compressedSoundStream.ReadExactly(compressedBuffer, 0, len);
                    currentPacketIndex++;

                    var writePtr = bufferPtr + offset;
                    if (decoder.Decode(compressedBuffer, len, writePtr) != SamplesPerFrame)
                    {
                        throw new Exception("Celt decoder returned a wrong decoding buffer size.");
                    }

                    offset += SamplesPerFrame * channels;

                    if (endingPacket || compressedSoundStream.Position == compressedSoundStream.Length)
                    {
                        break;
                    }
                }

                // Send buffer to hardware
                var finalPtr = new IntPtr(bufferPtr + (startingPacket ? startPktSampleIndex : 0));
                var finalSize = (offset - (startingPacket ? startPktSampleIndex : 0) - (endingPacket ? endPktSampleIndex : 0)) * sizeof(short);

                var bufferType = AudioLayer.BufferType.None;
                if (endingPacket)
                {
                    bufferType = looped ? AudioLayer.BufferType.EndOfLoop : AudioLayer.BufferType.EndOfStream;

View on GitHub (pinned to 96fad776d2)