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
- Re-import or re-export the offending audio asset so it is encoded with the current Celt settings (sample rate, frame size).
- Verify the asset file integrity (checksum, complete download/checkout).
- Check that encoder/decoder settings (sample rate, buffer size, channels) match the ones used to produce the asset.
- 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
- Re-import audio assets after changing sample-rate or codec settings in the project.
- Add asset checksum verification to your build/CI pipeline.
- Avoid VCS merges of binary audio assets; re-export instead.
- Pin the engine version used to produce assets to the runtime version.
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
- Failed to create Celt custom mode.
- Failed to create Celt decoder.
- Failed to create Celt encoder.
- Failed to create an instance of the celt encoder/decoder.
- Failed to compile a sound asset, ffmpeg was not found.
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)