{"record":{"id":"574e8a8e55e0bd71","repo":"stride3d/stride","slug":"celt-decoder-returned-a-wrong-decoding-buffer-size","errorCode":null,"errorMessage":"Celt decoder returned a wrong decoding buffer size.","messagePattern":"Celt decoder returned a wrong decoding buffer size\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Audio/CompressedSoundSource.cs","lineNumber":269,"sourceCode":"            {\n                const int passes = SamplesPerBuffer / SamplesPerFrame;\n                var offset = 0;\n                var bufferPtr = (short*)utilityBuffer.Pointer;\n                var startingPacket = startingPacketIndex == currentPacketIndex;\n                var endingPacket = false;\n                for (var i = 0; i < passes; i++)\n                {\n                    endingPacket = endPacketIndex == currentPacketIndex;\n\n                    //read one packet, size first, then data\n                    var len = reader.ReadInt16();\n                    compressedSoundStream.ReadExactly(compressedBuffer, 0, len);\n                    currentPacketIndex++;\n\n                    var writePtr = bufferPtr + offset;\n                    if (decoder.Decode(compressedBuffer, len, writePtr) != SamplesPerFrame)\n                    {\n                        throw new Exception(\"Celt decoder returned a wrong decoding buffer size.\");\n                    }\n\n                    offset += SamplesPerFrame * channels;\n\n                    if (endingPacket || compressedSoundStream.Position == compressedSoundStream.Length)\n                    {\n                        break;\n                    }\n                }\n\n                // Send buffer to hardware\n                var finalPtr = new IntPtr(bufferPtr + (startingPacket ? startPktSampleIndex : 0));\n                var finalSize = (offset - (startingPacket ? startPktSampleIndex : 0) - (endingPacket ? endPktSampleIndex : 0)) * sizeof(short);\n\n                var bufferType = AudioLayer.BufferType.None;\n                if (endingPacket)\n                {\n                    bufferType = looped ? AudioLayer.BufferType.EndOfLoop : AudioLayer.BufferType.EndOfStream;","sourceCodeStart":251,"sourceCodeEnd":287,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Audio/CompressedSoundSource.cs#L251-L287","documentation":"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.","triggerScenarios":"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.","commonSituations":"Assets corrupted during build/transfer or VCS merge; re-encoded audio assets after changing Celt sample-rate settings; partially written asset files.","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."],"exampleFix":"// before\nvar sound = Sound.Load(\"assets/broken_sfx.ogg\");\n// after\nif (!AssetChecksum.Valid(\"assets/broken_sfx.ogg\"))\n    Asset.Reimport(\"assets/broken_sfx.ogg\");\nvar sound = Sound.Load(\"assets/broken_sfx.ogg\");","handlingStrategy":"try-catch","validationCode":"// Before shipping, verify assets:\n// checksum match + re-imported with current Celt settings\nbool assetOk = AssetChecksum.Matches(\"assets/sfx.ogg\") && Asset.Metadata.CeltMode == CurrentCeltMode;","typeGuard":null,"tryCatchPattern":"try\n{\n    var sound = Sound.Load(assetPath);\n}\ncatch (Exception ex) when (ex.Message.Contains(\"Celt decoder returned a wrong decoding buffer size\"))\n{\n    logger.Error($\"Corrupt/incompatible audio asset: {assetPath}\");\n    sound = null; // skip asset or schedule re-import\n}","preventionTips":["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."],"tags":["audio","codec","celt","decoding","asset-corruption"],"backgroundTag":"unexpected-response-shape","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}