@carbonenginejs/runtime-resource 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/FORMAT-PROVENANCE.md +155 -144
  2. package/LICENSE +21 -21
  3. package/NOTICE +29 -29
  4. package/README.md +11 -0
  5. package/dist/CjsMotherLode.js +1271 -1271
  6. package/dist/CjsResMan.js +3005 -3005
  7. package/dist/CjsResManQueue.js +214 -214
  8. package/dist/CjsResource.js +566 -566
  9. package/dist/CjsResourceSource.js +59 -59
  10. package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
  11. package/dist/format/CjsBlueReader.js +269 -269
  12. package/dist/format/CjsFormat.js +192 -192
  13. package/dist/format/CjsReader.js +18 -18
  14. package/dist/format/CjsResourceProbe.js +277 -277
  15. package/dist/format/payloadContract.js +173 -173
  16. package/dist/formats/black/CjsBlackFormat.js +278 -278
  17. package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -153
  18. package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -382
  19. package/dist/formats/black/core/CjsBlackReader.js +639 -639
  20. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -433
  21. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -4
  22. package/dist/formats/black/core/blackConstants.js +7 -7
  23. package/dist/formats/black/core/blackDefinitions.js +10 -10
  24. package/dist/formats/black/core/blackEnums.js +6 -6
  25. package/dist/formats/black/core/blackSchema.js +3 -3
  26. package/dist/formats/black/core/blackVersion.js +22 -22
  27. package/dist/formats/black/core/helpers.js +182 -182
  28. package/dist/formats/black/core/schema.js +4 -4
  29. package/dist/formats/black/index.js +2 -2
  30. package/dist/formats/bnk/CjsBnkFormat.js +125 -125
  31. package/dist/formats/bnk/core/graph.js +140 -140
  32. package/dist/formats/bnk/core/helpers.js +409 -409
  33. package/dist/formats/bnk/core/musicNodes.js +489 -489
  34. package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
  35. package/dist/formats/bnk/index.js +2 -2
  36. package/dist/formats/cmf/CjsCmfFormat.js +497 -497
  37. package/dist/formats/cmf/core/binary.js +118 -118
  38. package/dist/formats/cmf/core/buffers.js +233 -233
  39. package/dist/formats/cmf/core/constants.js +47 -47
  40. package/dist/formats/cmf/core/gr2Anim.js +453 -453
  41. package/dist/formats/cmf/core/helpers.js +287 -287
  42. package/dist/formats/cmf/core/pack.js +276 -276
  43. package/dist/formats/cmf/core/schema.js +364 -364
  44. package/dist/formats/cmf/core/shared.js +268 -268
  45. package/dist/formats/cmf/core/writer.js +517 -517
  46. package/dist/formats/cmf/index.js +2 -2
  47. package/dist/formats/dds/CjsDdsFormat.js +193 -193
  48. package/dist/formats/dds/core/bc6h.js +288 -0
  49. package/dist/formats/dds/core/bc6h.js.map +1 -0
  50. package/dist/formats/dds/core/bc7.js +251 -0
  51. package/dist/formats/dds/core/bc7.js.map +1 -0
  52. package/dist/formats/dds/core/helpers.js +815 -812
  53. package/dist/formats/dds/core/helpers.js.map +1 -1
  54. package/dist/formats/dds/index.js +2 -2
  55. package/dist/formats/fbx/CjsFbxFormat.js +266 -266
  56. package/dist/formats/fbx/core/helpers.js +3901 -3901
  57. package/dist/formats/fbx/index.js +2 -2
  58. package/dist/formats/flac/CjsFlacFormat.js +87 -87
  59. package/dist/formats/flac/core/helpers.js +295 -295
  60. package/dist/formats/flac/index.js +2 -2
  61. package/dist/formats/gif/CjsGifFormat.js +87 -87
  62. package/dist/formats/gif/core/helpers.js +360 -360
  63. package/dist/formats/gif/index.js +2 -2
  64. package/dist/formats/gltf/CjsGltfFormat.js +290 -290
  65. package/dist/formats/gltf/core/helpers.js +292 -292
  66. package/dist/formats/gltf/core/json.js +79 -79
  67. package/dist/formats/gltf/core/parser.js +666 -666
  68. package/dist/formats/gltf/core/targets.js +163 -163
  69. package/dist/formats/gltf/index.js +2 -2
  70. package/dist/formats/index.js +23 -23
  71. package/dist/formats/jpeg/CjsJpegFormat.js +206 -206
  72. package/dist/formats/jpeg/core/helpers.js +350 -350
  73. package/dist/formats/jpeg/core/jpeg.js +377 -377
  74. package/dist/formats/jpeg/index.js +2 -2
  75. package/dist/formats/mp3/CjsMp3Format.js +192 -192
  76. package/dist/formats/mp3/core/helpers.js +338 -338
  77. package/dist/formats/mp3/index.js +2 -2
  78. package/dist/formats/mp4/CjsMp4Format.js +191 -191
  79. package/dist/formats/mp4/core/helpers.js +449 -449
  80. package/dist/formats/mp4/index.js +2 -2
  81. package/dist/formats/obj/CjsObjFormat.js +253 -253
  82. package/dist/formats/obj/core/helpers.js +573 -573
  83. package/dist/formats/obj/core/json.js +64 -64
  84. package/dist/formats/obj/core/parser.js +321 -321
  85. package/dist/formats/obj/index.js +2 -2
  86. package/dist/formats/ogg/CjsOggFormat.js +88 -88
  87. package/dist/formats/ogg/core/helpers.js +387 -387
  88. package/dist/formats/ogg/core/imdct.js +178 -178
  89. package/dist/formats/ogg/core/vorbis.js +999 -999
  90. package/dist/formats/ogg/index.js +2 -2
  91. package/dist/formats/png/CjsPngFormat.js +195 -195
  92. package/dist/formats/png/core/helpers.js +583 -583
  93. package/dist/formats/png/index.js +2 -2
  94. package/dist/formats/red/CjsRedFormat.js +261 -261
  95. package/dist/formats/red/core/CjsRedReader.js +194 -194
  96. package/dist/formats/red/core/blackDefinitions.js +3 -3
  97. package/dist/formats/red/core/helpers.js +139 -139
  98. package/dist/formats/red/core/redGraph.js +68 -68
  99. package/dist/formats/red/core/schema.js +4 -4
  100. package/dist/formats/red/index.js +2 -2
  101. package/dist/formats/stl/CjsStlFormat.js +365 -365
  102. package/dist/formats/stl/core/helpers.js +261 -261
  103. package/dist/formats/stl/core/json.js +51 -51
  104. package/dist/formats/stl/core/stl.js +629 -629
  105. package/dist/formats/stl/core/targets.js +163 -163
  106. package/dist/formats/stl/index.js +2 -2
  107. package/dist/formats/tga/CjsTgaFormat.js +192 -192
  108. package/dist/formats/tga/core/helpers.js +446 -446
  109. package/dist/formats/tga/index.js +2 -2
  110. package/dist/formats/wav/CjsWavFormat.js +192 -192
  111. package/dist/formats/wav/core/helpers.js +328 -328
  112. package/dist/formats/wav/index.js +2 -2
  113. package/dist/formats/webm/CjsWebmFormat.js +191 -191
  114. package/dist/formats/webm/core/helpers.js +537 -537
  115. package/dist/formats/webm/index.js +2 -2
  116. package/dist/formats/webp/CjsWebpFormat.js +86 -86
  117. package/dist/formats/webp/core/helpers.js +214 -214
  118. package/dist/formats/webp/index.js +2 -2
  119. package/dist/formats/wem/CjsWemFormat.js +241 -241
  120. package/dist/formats/wem/core/bitStream.js +259 -259
  121. package/dist/formats/wem/core/codebookLibrary.js +164 -164
  122. package/dist/formats/wem/core/helpers.js +417 -417
  123. package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
  124. package/dist/formats/wem/core/ptadpcm.js +77 -77
  125. package/dist/formats/wem/core/resolve.js +121 -121
  126. package/dist/formats/wem/core/wemToOgg.js +485 -485
  127. package/dist/formats/wem/index.js +2 -2
  128. package/dist/formats/yaml/CjsYamlFormat.js +83 -83
  129. package/dist/formats/yaml/core/CjsYamlReader.js +305 -305
  130. package/dist/formats/yaml/core/helpers.js +160 -160
  131. package/dist/formats/yaml/index.js +2 -2
  132. package/dist/index.js +48 -48
  133. package/dist/resourcePath.js +18 -18
  134. package/dist/resourceStates.js +9 -9
  135. package/dist/resources/AudioGeometryResData.js +47 -47
  136. package/dist/resources/GStateBindingCallbackData.js +31 -31
  137. package/dist/resources/MeshDecalData.js +37 -37
  138. package/dist/resources/MeshDecalLodData.js +34 -34
  139. package/dist/resources/Tr2EffectRes.js +71 -71
  140. package/dist/resources/Tr2GrannyIntersectionResult.js +60 -60
  141. package/dist/resources/Tr2GrannyStateRes.js +44 -44
  142. package/dist/resources/Tr2ImageRes.js +114 -114
  143. package/dist/resources/Tr2LightProfileRes.js +40 -40
  144. package/dist/resources/Tr2MaterialArea.js +34 -34
  145. package/dist/resources/Tr2MaterialMesh.js +31 -31
  146. package/dist/resources/Tr2MaterialRes.js +34 -34
  147. package/dist/resources/Tr2ShaderPermutation.js +43 -43
  148. package/dist/resources/Tr2TextureLodManager.js +80 -80
  149. package/dist/resources/Tr2TextureLodUpdateRequest.js +37 -37
  150. package/dist/resources/Tr2TexturePackChannel.js +37 -37
  151. package/dist/resources/Tr2TexturePipeline.js +52 -52
  152. package/dist/resources/Tr2TexturePipelineParams.js +34 -34
  153. package/dist/resources/Tr2TexturePipelineStepCompress.js +40 -40
  154. package/dist/resources/Tr2TexturePipelineStepLimitSize.js +34 -34
  155. package/dist/resources/Tr2TexturePipelineStepLoad.js +31 -31
  156. package/dist/resources/Tr2TexturePipelineStepPack.js +43 -43
  157. package/dist/resources/TriGeometryRes.js +239 -216
  158. package/dist/resources/TriGeometryRes.js.map +1 -1
  159. package/dist/resources/TriGeometryResAreaData.js +59 -59
  160. package/dist/resources/TriGeometryResJointData.js +38 -38
  161. package/dist/resources/TriGeometryResLodData.js +88 -88
  162. package/dist/resources/TriGeometryResMeshData.js +63 -63
  163. package/dist/resources/TriGeometryResSkeletonData.js +34 -34
  164. package/dist/resources/TriGrannyRes.js +43 -43
  165. package/dist/resources/TriJointBinding.js +38 -38
  166. package/dist/resources/TriMorphTargetGeometryConstants.js +46 -46
  167. package/dist/resources/TriRtGeometryConstants.js +88 -88
  168. package/dist/resources/TriTextureRes.js +304 -304
  169. package/dist/resources/enums.js +18 -18
  170. package/dist/resources/resourceBoundary.js +47 -47
  171. package/dist/resources/texturePipelineBehavior.js +308 -308
  172. package/dist/texture/CjsTextureArrayRes.js +406 -406
  173. package/dist/texture/CjsTextureParameterProxy.js +133 -133
  174. package/format-notices/black/LICENSE +21 -21
  175. package/format-notices/black/NOTICE +47 -47
  176. package/format-notices/bnk/LICENSE +21 -21
  177. package/format-notices/bnk/NOTICE +20 -20
  178. package/format-notices/cmf/LICENSE +21 -21
  179. package/format-notices/cmf/NOTICE +36 -36
  180. package/format-notices/dds/LICENSE +21 -21
  181. package/format-notices/dds/NOTICE +14 -14
  182. package/format-notices/fbx/LICENSE +21 -21
  183. package/format-notices/fbx/NOTICE +14 -14
  184. package/format-notices/flac/LICENSE +21 -21
  185. package/format-notices/flac/NOTICE +14 -14
  186. package/format-notices/gif/LICENSE +21 -21
  187. package/format-notices/gif/NOTICE +14 -14
  188. package/format-notices/gltf/LICENSE +21 -21
  189. package/format-notices/gltf/NOTICE +27 -27
  190. package/format-notices/jpeg/LICENSE +21 -21
  191. package/format-notices/jpeg/NOTICE +14 -14
  192. package/format-notices/mp3/LICENSE +21 -21
  193. package/format-notices/mp3/NOTICE +14 -14
  194. package/format-notices/mp4/LICENSE +21 -21
  195. package/format-notices/mp4/NOTICE +14 -14
  196. package/format-notices/obj/LICENSE +21 -21
  197. package/format-notices/obj/NOTICE +26 -26
  198. package/format-notices/ogg/LICENSE +21 -21
  199. package/format-notices/ogg/NOTICE +28 -28
  200. package/format-notices/png/LICENSE +21 -21
  201. package/format-notices/png/NOTICE +14 -14
  202. package/format-notices/red/LICENSE +21 -21
  203. package/format-notices/red/NOTICE +31 -31
  204. package/format-notices/stl/LICENSE +21 -21
  205. package/format-notices/stl/NOTICE +21 -21
  206. package/format-notices/tga/LICENSE +21 -21
  207. package/format-notices/tga/NOTICE +14 -14
  208. package/format-notices/wav/LICENSE +21 -21
  209. package/format-notices/wav/NOTICE +14 -14
  210. package/format-notices/webm/LICENSE +21 -21
  211. package/format-notices/webm/NOTICE +14 -14
  212. package/format-notices/webp/LICENSE +21 -21
  213. package/format-notices/webp/NOTICE +14 -14
  214. package/format-notices/wem/LICENSE +57 -57
  215. package/format-notices/wem/NOTICE +33 -33
  216. package/format-notices/yaml/LICENSE +21 -21
  217. package/format-notices/yaml/NOTICE +44 -44
  218. package/package.json +2 -2
  219. package/resource-lifecycle.md +679 -679
@@ -1,77 +1,77 @@
1
- // Wwise PTADPCM (RIFF format tag 0x8311, "Platinum ADPCM") decoder.
2
- //
3
- // Original CarbonEngineJS implementation of the publicly documented algorithm
4
- // (community documentation of the codec: vgmstream/wwiser); no code copied.
5
- // Verified against EVE Online media (turret/artillery SFX banks).
6
- //
7
- // Frame layout, per channel (frames externally interleaved channel-by-channel;
8
- // frame size = fmt blockAlign / channels, typically 0x24 bytes):
9
- // 0x00 int16 LE hist2 (second-newest history sample, emitted first)
10
- // 0x02 int16 LE hist1 (newest history sample, emitted second)
11
- // 0x04 u8 step table index (clamped to 12)
12
- // 0x05... 4-bit codes, low nibble first
13
- // Samples per frame = 2 + (frameSize - 5) * 2.
14
- // Per code: sample = clamp16(step + 2*hist1 - hist2), then the index moves to
15
- // the row's nextIndex - {step, nextIndex} from PTADPCM_TABLE[index][code].
16
-
17
- // [index][code] -> [stepDelta, nextIndex]. Rows 12-15 are zero: the header
18
- // index is clamped to 12 and no transition targets a row above 11.
19
- const PTADPCM_TABLE = [[[-14, 2], [-10, 2], [-7, 1], [-5, 1], [-3, 0], [-2, 0], [-1, 0], [0, 0], [0, 0], [1, 0], [2, 0], [3, 0], [5, 1], [7, 1], [10, 2], [14, 2]], [[-28, 3], [-20, 3], [-14, 2], [-10, 2], [-7, 1], [-5, 1], [-3, 1], [-1, 0], [1, 0], [3, 1], [5, 1], [7, 1], [10, 2], [14, 2], [20, 3], [28, 3]], [[-56, 4], [-40, 4], [-28, 3], [-20, 3], [-14, 2], [-10, 2], [-6, 2], [-2, 1], [2, 1], [6, 2], [10, 2], [14, 2], [20, 3], [28, 3], [40, 4], [56, 4]], [[-112, 5], [-80, 5], [-56, 4], [-40, 4], [-28, 3], [-20, 3], [-12, 3], [-4, 2], [4, 2], [12, 3], [20, 3], [28, 3], [40, 4], [56, 4], [80, 5], [112, 5]], [[-224, 6], [-160, 6], [-112, 5], [-80, 5], [-56, 4], [-40, 4], [-24, 4], [-8, 3], [8, 3], [24, 4], [40, 4], [56, 4], [80, 5], [112, 5], [160, 6], [224, 6]], [[-448, 7], [-320, 7], [-224, 6], [-160, 6], [-112, 5], [-80, 5], [-48, 5], [-16, 4], [16, 4], [48, 5], [80, 5], [112, 5], [160, 6], [224, 6], [320, 7], [448, 7]], [[-896, 8], [-640, 8], [-448, 7], [-320, 7], [-224, 6], [-160, 6], [-96, 6], [-32, 5], [32, 5], [96, 6], [160, 6], [224, 6], [320, 7], [448, 7], [640, 8], [896, 8]], [[-1792, 9], [-1280, 9], [-896, 8], [-640, 8], [-448, 7], [-320, 7], [-192, 7], [-64, 6], [64, 6], [192, 7], [320, 7], [448, 7], [640, 8], [896, 8], [1280, 9], [1792, 9]], [[-3584, 10], [-2560, 10], [-1792, 9], [-1280, 9], [-896, 8], [-640, 8], [-384, 8], [-128, 7], [128, 7], [384, 8], [640, 8], [896, 8], [1280, 9], [1792, 9], [2560, 10], [3584, 10]], [[-7168, 11], [-5120, 11], [-3584, 10], [-2560, 10], [-1792, 9], [-1280, 9], [-768, 9], [-256, 8], [256, 8], [768, 9], [1280, 9], [1792, 9], [2560, 10], [3584, 10], [5120, 11], [7168, 11]], [[-14336, 11], [-10240, 11], [-7168, 11], [-5120, 11], [-3584, 10], [-2560, 10], [-1536, 10], [-512, 9], [512, 9], [1536, 10], [2560, 10], [3584, 10], [5120, 11], [7168, 11], [10240, 11], [14336, 11]], [[-28672, 11], [-20480, 11], [-14336, 11], [-10240, 11], [-7168, 11], [-5120, 11], [-3072, 11], [-1024, 10], [1024, 10], [3072, 11], [5120, 11], [7168, 11], [10240, 11], [14336, 11], [20480, 11], [28672, 11]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]];
20
-
21
- /**
22
- * Decode PTADPCM audio data to per-channel float32 samples.
23
- *
24
- * @param {Uint8Array} bytes Whole wem bytes.
25
- * @param {object} metadata `inspectWEM` result for those bytes (fmt + data chunk facts).
26
- * @returns {{channelData: Float32Array[], sampleCount: number, sampleRate: number, channels: number}} AudioBuffer-ready samples.
27
- */
28
- function decodePtadpcm(bytes, metadata) {
29
- const channels = metadata.channels;
30
- const frameSize = channels > 0 ? Math.floor(metadata.blockAlign / channels) : 0;
31
- if (channels < 1 || frameSize < 6 || metadata.blockAlign !== frameSize * channels) {
32
- throw new Error(`wem: unsupported PTADPCM layout (channels ${channels}, blockAlign ${metadata.blockAlign})`);
33
- }
34
- const samplesPerFrame = 2 + (frameSize - 5) * 2;
35
- const frameGroups = Math.floor(metadata.dataBytes / metadata.blockAlign);
36
- const sampleCount = frameGroups * samplesPerFrame;
37
- const channelData = [];
38
- for (let channel = 0; channel < channels; channel++) {
39
- channelData.push(new Float32Array(sampleCount));
40
- }
41
- for (let group = 0; group < frameGroups; group++) {
42
- for (let channel = 0; channel < channels; channel++) {
43
- const frame = metadata.dataOffset + (group * channels + channel) * frameSize;
44
- const output = channelData[channel];
45
- let at = group * samplesPerFrame;
46
- let hist2 = readS16(bytes, frame);
47
- let hist1 = readS16(bytes, frame + 2);
48
- let index = Math.min(bytes[frame + 4], 12);
49
- output[at++] = hist2 / 32768;
50
- output[at++] = hist1 / 32768;
51
- for (let i = 0; i < samplesPerFrame - 2; i++) {
52
- const byte = bytes[frame + 5 + (i >> 1)];
53
- const code = (i & 1) === 0 ? byte & 0x0f : byte >> 4;
54
- const [step, nextIndex] = PTADPCM_TABLE[index][code];
55
- let sample = step + 2 * hist1 - hist2;
56
- if (sample > 32767) sample = 32767;else if (sample < -32768) sample = -32768;
57
- index = nextIndex;
58
- hist2 = hist1;
59
- hist1 = sample;
60
- output[at++] = sample / 32768;
61
- }
62
- }
63
- }
64
- return {
65
- channelData,
66
- sampleCount,
67
- sampleRate: metadata.sampleRate,
68
- channels
69
- };
70
- }
71
- function readS16(bytes, offset) {
72
- const value = bytes[offset] | bytes[offset + 1] << 8;
73
- return value >= 0x8000 ? value - 0x10000 : value;
74
- }
75
-
76
- export { decodePtadpcm };
77
- //# sourceMappingURL=ptadpcm.js.map
1
+ // Wwise PTADPCM (RIFF format tag 0x8311, "Platinum ADPCM") decoder.
2
+ //
3
+ // Original CarbonEngineJS implementation of the publicly documented algorithm
4
+ // (community documentation of the codec: vgmstream/wwiser); no code copied.
5
+ // Verified against EVE Online media (turret/artillery SFX banks).
6
+ //
7
+ // Frame layout, per channel (frames externally interleaved channel-by-channel;
8
+ // frame size = fmt blockAlign / channels, typically 0x24 bytes):
9
+ // 0x00 int16 LE hist2 (second-newest history sample, emitted first)
10
+ // 0x02 int16 LE hist1 (newest history sample, emitted second)
11
+ // 0x04 u8 step table index (clamped to 12)
12
+ // 0x05... 4-bit codes, low nibble first
13
+ // Samples per frame = 2 + (frameSize - 5) * 2.
14
+ // Per code: sample = clamp16(step + 2*hist1 - hist2), then the index moves to
15
+ // the row's nextIndex - {step, nextIndex} from PTADPCM_TABLE[index][code].
16
+
17
+ // [index][code] -> [stepDelta, nextIndex]. Rows 12-15 are zero: the header
18
+ // index is clamped to 12 and no transition targets a row above 11.
19
+ const PTADPCM_TABLE = [[[-14, 2], [-10, 2], [-7, 1], [-5, 1], [-3, 0], [-2, 0], [-1, 0], [0, 0], [0, 0], [1, 0], [2, 0], [3, 0], [5, 1], [7, 1], [10, 2], [14, 2]], [[-28, 3], [-20, 3], [-14, 2], [-10, 2], [-7, 1], [-5, 1], [-3, 1], [-1, 0], [1, 0], [3, 1], [5, 1], [7, 1], [10, 2], [14, 2], [20, 3], [28, 3]], [[-56, 4], [-40, 4], [-28, 3], [-20, 3], [-14, 2], [-10, 2], [-6, 2], [-2, 1], [2, 1], [6, 2], [10, 2], [14, 2], [20, 3], [28, 3], [40, 4], [56, 4]], [[-112, 5], [-80, 5], [-56, 4], [-40, 4], [-28, 3], [-20, 3], [-12, 3], [-4, 2], [4, 2], [12, 3], [20, 3], [28, 3], [40, 4], [56, 4], [80, 5], [112, 5]], [[-224, 6], [-160, 6], [-112, 5], [-80, 5], [-56, 4], [-40, 4], [-24, 4], [-8, 3], [8, 3], [24, 4], [40, 4], [56, 4], [80, 5], [112, 5], [160, 6], [224, 6]], [[-448, 7], [-320, 7], [-224, 6], [-160, 6], [-112, 5], [-80, 5], [-48, 5], [-16, 4], [16, 4], [48, 5], [80, 5], [112, 5], [160, 6], [224, 6], [320, 7], [448, 7]], [[-896, 8], [-640, 8], [-448, 7], [-320, 7], [-224, 6], [-160, 6], [-96, 6], [-32, 5], [32, 5], [96, 6], [160, 6], [224, 6], [320, 7], [448, 7], [640, 8], [896, 8]], [[-1792, 9], [-1280, 9], [-896, 8], [-640, 8], [-448, 7], [-320, 7], [-192, 7], [-64, 6], [64, 6], [192, 7], [320, 7], [448, 7], [640, 8], [896, 8], [1280, 9], [1792, 9]], [[-3584, 10], [-2560, 10], [-1792, 9], [-1280, 9], [-896, 8], [-640, 8], [-384, 8], [-128, 7], [128, 7], [384, 8], [640, 8], [896, 8], [1280, 9], [1792, 9], [2560, 10], [3584, 10]], [[-7168, 11], [-5120, 11], [-3584, 10], [-2560, 10], [-1792, 9], [-1280, 9], [-768, 9], [-256, 8], [256, 8], [768, 9], [1280, 9], [1792, 9], [2560, 10], [3584, 10], [5120, 11], [7168, 11]], [[-14336, 11], [-10240, 11], [-7168, 11], [-5120, 11], [-3584, 10], [-2560, 10], [-1536, 10], [-512, 9], [512, 9], [1536, 10], [2560, 10], [3584, 10], [5120, 11], [7168, 11], [10240, 11], [14336, 11]], [[-28672, 11], [-20480, 11], [-14336, 11], [-10240, 11], [-7168, 11], [-5120, 11], [-3072, 11], [-1024, 10], [1024, 10], [3072, 11], [5120, 11], [7168, 11], [10240, 11], [14336, 11], [20480, 11], [28672, 11]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]];
20
+
21
+ /**
22
+ * Decode PTADPCM audio data to per-channel float32 samples.
23
+ *
24
+ * @param {Uint8Array} bytes Whole wem bytes.
25
+ * @param {object} metadata `inspectWEM` result for those bytes (fmt + data chunk facts).
26
+ * @returns {{channelData: Float32Array[], sampleCount: number, sampleRate: number, channels: number}} AudioBuffer-ready samples.
27
+ */
28
+ function decodePtadpcm(bytes, metadata) {
29
+ const channels = metadata.channels;
30
+ const frameSize = channels > 0 ? Math.floor(metadata.blockAlign / channels) : 0;
31
+ if (channels < 1 || frameSize < 6 || metadata.blockAlign !== frameSize * channels) {
32
+ throw new Error(`wem: unsupported PTADPCM layout (channels ${channels}, blockAlign ${metadata.blockAlign})`);
33
+ }
34
+ const samplesPerFrame = 2 + (frameSize - 5) * 2;
35
+ const frameGroups = Math.floor(metadata.dataBytes / metadata.blockAlign);
36
+ const sampleCount = frameGroups * samplesPerFrame;
37
+ const channelData = [];
38
+ for (let channel = 0; channel < channels; channel++) {
39
+ channelData.push(new Float32Array(sampleCount));
40
+ }
41
+ for (let group = 0; group < frameGroups; group++) {
42
+ for (let channel = 0; channel < channels; channel++) {
43
+ const frame = metadata.dataOffset + (group * channels + channel) * frameSize;
44
+ const output = channelData[channel];
45
+ let at = group * samplesPerFrame;
46
+ let hist2 = readS16(bytes, frame);
47
+ let hist1 = readS16(bytes, frame + 2);
48
+ let index = Math.min(bytes[frame + 4], 12);
49
+ output[at++] = hist2 / 32768;
50
+ output[at++] = hist1 / 32768;
51
+ for (let i = 0; i < samplesPerFrame - 2; i++) {
52
+ const byte = bytes[frame + 5 + (i >> 1)];
53
+ const code = (i & 1) === 0 ? byte & 0x0f : byte >> 4;
54
+ const [step, nextIndex] = PTADPCM_TABLE[index][code];
55
+ let sample = step + 2 * hist1 - hist2;
56
+ if (sample > 32767) sample = 32767;else if (sample < -32768) sample = -32768;
57
+ index = nextIndex;
58
+ hist2 = hist1;
59
+ hist1 = sample;
60
+ output[at++] = sample / 32768;
61
+ }
62
+ }
63
+ }
64
+ return {
65
+ channelData,
66
+ sampleCount,
67
+ sampleRate: metadata.sampleRate,
68
+ channels
69
+ };
70
+ }
71
+ function readS16(bytes, offset) {
72
+ const value = bytes[offset] | bytes[offset + 1] << 8;
73
+ return value >= 0x8000 ? value - 0x10000 : value;
74
+ }
75
+
76
+ export { decodePtadpcm };
77
+ //# sourceMappingURL=ptadpcm.js.map
@@ -1,121 +1,121 @@
1
- import { inspectWithValues } from './helpers.js';
2
-
3
- // Content-verified codec resolution for wem media (kb §5 resolveType seam).
4
- // The fmt tag is the declaration; each candidate codec gets ONE bounded
5
- // structural check against the actual container facts - no audio is decoded:
6
- //
7
- // - wwise-vorbis: the Wwise Vorbis sidecar must exist (vorb chunk or inline
8
- // fmt-0x42 layout) with a positive sample count and data payload;
9
- // - wwise-ptadpcm: the frame layout must satisfy the decoder's own guard
10
- // (blockAlign = frameSize * channels, frameSize >= 6) with block-aligned
11
- // data;
12
- // - pcm / pcm-extensible: 16-bit with self-consistent blockAlign/byteRate
13
- // and sample-aligned data.
14
- //
15
- // The declared codec is validated FIRST; when its check fails (a mislabeled
16
- // tag), the other candidates are tried in order. A 2026-07-19 census of all
17
- // 8,987 embedded wems in EVE build 3435006 found no mislabeled tags, so
18
- // mismatch is the exceptional path - but the check is what makes that a
19
- // verified fact per file rather than a corpus-wide assumption.
20
- const CANDIDATES = ["wwise-vorbis", "wwise-ptadpcm", "pcm"];
21
- function validateVorbis(metadata) {
22
- if (metadata.codec === "wwise-vorbis") {
23
- return metadata.vorbis !== null && metadata.sampleCount > 0 && metadata.dataBytes > 0;
24
- }
25
- // Mislabeled tag: inspect() only fills `vorbis` when the tag says so, but
26
- // the chunk walk always records a standalone vorb sidecar chunk.
27
- return (metadata.chunks ?? []).some(chunk => chunk.id === "vorb") && metadata.dataBytes > 0;
28
- }
29
- function validatePtadpcm(metadata) {
30
- const channels = metadata.channels;
31
- const frameSize = channels > 0 ? Math.floor(metadata.blockAlign / channels) : 0;
32
- return channels >= 1 && frameSize >= 6 && metadata.blockAlign === frameSize * channels && metadata.dataBytes >= metadata.blockAlign && metadata.dataBytes % metadata.blockAlign === 0;
33
- }
34
- function validatePcm(metadata) {
35
- return metadata.bitsPerSample === 16 && metadata.channels >= 1 && metadata.blockAlign === metadata.channels * 2 && metadata.byteRate === metadata.sampleRate * metadata.blockAlign && metadata.dataBytes > 0 && metadata.dataBytes % metadata.blockAlign === 0;
36
- }
37
- function validate(candidate, metadata) {
38
- if (candidate === "wwise-vorbis") return validateVorbis(metadata);
39
- if (candidate === "wwise-ptadpcm") return validatePtadpcm(metadata);
40
- return validatePcm(metadata);
41
- }
42
- function candidateFor(codec) {
43
- if (codec === "pcm-extensible") return "pcm";
44
- return CANDIDATES.includes(codec) ? codec : null;
45
- }
46
- function emitFor(candidate) {
47
- if (candidate === "wwise-vorbis") return "ogg";
48
- if (candidate === "wwise-ptadpcm" || candidate === "pcm") return "pcm";
49
- return "raw";
50
- }
51
-
52
- /**
53
- * Resolve a wem's actual decode route from content, not just its fmt tag.
54
- *
55
- * @param {*} input Wem bytes.
56
- * @param {object} values Normalized read values.
57
- * @returns {object} Probe-shaped report: verified variant flags, `preferred`
58
- * route, and declared/resolved/mismatch evidence in `metadata`.
59
- */
60
- function resolveTypeWithValues(input, values) {
61
- const metadata = inspectWithValues(input, values);
62
- const declared = metadata.codec || null;
63
- let resolved = null;
64
- const declaredCandidate = candidateFor(declared);
65
- if (declaredCandidate && validate(declaredCandidate, metadata)) {
66
- resolved = declaredCandidate;
67
- } else {
68
- for (const candidate of CANDIDATES) {
69
- if (candidate === declaredCandidate) continue;
70
- if (validate(candidate, metadata)) {
71
- resolved = candidate;
72
- break;
73
- }
74
- }
75
- }
76
- const preferred = emitFor(resolved);
77
- const mismatch = resolved !== null && declaredCandidate !== resolved;
78
- return {
79
- format: "wem",
80
- source: values.source || "buffer",
81
- supported: metadata.codec ? "partial" : "none",
82
- confidence: resolved ? 1 : 0,
83
- verified: true,
84
- preferred,
85
- reason: resolved ? mismatch ? `Declared codec ${declared} failed content validation; ${resolved} validated instead.` : `Declared codec validated by content.` : `No decodable codec validated against the content (declared ${declared ?? "none"}).`,
86
- metadata: {
87
- ...metadata,
88
- declared,
89
- resolved,
90
- mismatch
91
- },
92
- variants: [{
93
- kind: "raw",
94
- payloadType: "raw",
95
- codec: declared || "unknown",
96
- mimeType: "application/octet-stream",
97
- supported: true,
98
- containerOnly: true,
99
- isDecoded: false,
100
- pcmDecodeSupported: false
101
- }, {
102
- kind: "ogg",
103
- payloadType: "raw",
104
- codec: "vorbis",
105
- mimeType: "audio/ogg",
106
- supported: resolved === "wwise-vorbis",
107
- containerOnly: true,
108
- isDecoded: false
109
- }, {
110
- kind: "pcm",
111
- payloadType: "pcm",
112
- codec: "float32",
113
- supported: resolved === "wwise-ptadpcm" || resolved === "pcm",
114
- isDecoded: true,
115
- pcmDecodeSupported: resolved === "wwise-ptadpcm" || resolved === "pcm"
116
- }]
117
- };
118
- }
119
-
120
- export { resolveTypeWithValues };
121
- //# sourceMappingURL=resolve.js.map
1
+ import { inspectWithValues } from './helpers.js';
2
+
3
+ // Content-verified codec resolution for wem media (kb §5 resolveType seam).
4
+ // The fmt tag is the declaration; each candidate codec gets ONE bounded
5
+ // structural check against the actual container facts - no audio is decoded:
6
+ //
7
+ // - wwise-vorbis: the Wwise Vorbis sidecar must exist (vorb chunk or inline
8
+ // fmt-0x42 layout) with a positive sample count and data payload;
9
+ // - wwise-ptadpcm: the frame layout must satisfy the decoder's own guard
10
+ // (blockAlign = frameSize * channels, frameSize >= 6) with block-aligned
11
+ // data;
12
+ // - pcm / pcm-extensible: 16-bit with self-consistent blockAlign/byteRate
13
+ // and sample-aligned data.
14
+ //
15
+ // The declared codec is validated FIRST; when its check fails (a mislabeled
16
+ // tag), the other candidates are tried in order. A 2026-07-19 census of all
17
+ // 8,987 embedded wems in EVE build 3435006 found no mislabeled tags, so
18
+ // mismatch is the exceptional path - but the check is what makes that a
19
+ // verified fact per file rather than a corpus-wide assumption.
20
+ const CANDIDATES = ["wwise-vorbis", "wwise-ptadpcm", "pcm"];
21
+ function validateVorbis(metadata) {
22
+ if (metadata.codec === "wwise-vorbis") {
23
+ return metadata.vorbis !== null && metadata.sampleCount > 0 && metadata.dataBytes > 0;
24
+ }
25
+ // Mislabeled tag: inspect() only fills `vorbis` when the tag says so, but
26
+ // the chunk walk always records a standalone vorb sidecar chunk.
27
+ return (metadata.chunks ?? []).some(chunk => chunk.id === "vorb") && metadata.dataBytes > 0;
28
+ }
29
+ function validatePtadpcm(metadata) {
30
+ const channels = metadata.channels;
31
+ const frameSize = channels > 0 ? Math.floor(metadata.blockAlign / channels) : 0;
32
+ return channels >= 1 && frameSize >= 6 && metadata.blockAlign === frameSize * channels && metadata.dataBytes >= metadata.blockAlign && metadata.dataBytes % metadata.blockAlign === 0;
33
+ }
34
+ function validatePcm(metadata) {
35
+ return metadata.bitsPerSample === 16 && metadata.channels >= 1 && metadata.blockAlign === metadata.channels * 2 && metadata.byteRate === metadata.sampleRate * metadata.blockAlign && metadata.dataBytes > 0 && metadata.dataBytes % metadata.blockAlign === 0;
36
+ }
37
+ function validate(candidate, metadata) {
38
+ if (candidate === "wwise-vorbis") return validateVorbis(metadata);
39
+ if (candidate === "wwise-ptadpcm") return validatePtadpcm(metadata);
40
+ return validatePcm(metadata);
41
+ }
42
+ function candidateFor(codec) {
43
+ if (codec === "pcm-extensible") return "pcm";
44
+ return CANDIDATES.includes(codec) ? codec : null;
45
+ }
46
+ function emitFor(candidate) {
47
+ if (candidate === "wwise-vorbis") return "ogg";
48
+ if (candidate === "wwise-ptadpcm" || candidate === "pcm") return "pcm";
49
+ return "raw";
50
+ }
51
+
52
+ /**
53
+ * Resolve a wem's actual decode route from content, not just its fmt tag.
54
+ *
55
+ * @param {*} input Wem bytes.
56
+ * @param {object} values Normalized read values.
57
+ * @returns {object} Probe-shaped report: verified variant flags, `preferred`
58
+ * route, and declared/resolved/mismatch evidence in `metadata`.
59
+ */
60
+ function resolveTypeWithValues(input, values) {
61
+ const metadata = inspectWithValues(input, values);
62
+ const declared = metadata.codec || null;
63
+ let resolved = null;
64
+ const declaredCandidate = candidateFor(declared);
65
+ if (declaredCandidate && validate(declaredCandidate, metadata)) {
66
+ resolved = declaredCandidate;
67
+ } else {
68
+ for (const candidate of CANDIDATES) {
69
+ if (candidate === declaredCandidate) continue;
70
+ if (validate(candidate, metadata)) {
71
+ resolved = candidate;
72
+ break;
73
+ }
74
+ }
75
+ }
76
+ const preferred = emitFor(resolved);
77
+ const mismatch = resolved !== null && declaredCandidate !== resolved;
78
+ return {
79
+ format: "wem",
80
+ source: values.source || "buffer",
81
+ supported: metadata.codec ? "partial" : "none",
82
+ confidence: resolved ? 1 : 0,
83
+ verified: true,
84
+ preferred,
85
+ reason: resolved ? mismatch ? `Declared codec ${declared} failed content validation; ${resolved} validated instead.` : `Declared codec validated by content.` : `No decodable codec validated against the content (declared ${declared ?? "none"}).`,
86
+ metadata: {
87
+ ...metadata,
88
+ declared,
89
+ resolved,
90
+ mismatch
91
+ },
92
+ variants: [{
93
+ kind: "raw",
94
+ payloadType: "raw",
95
+ codec: declared || "unknown",
96
+ mimeType: "application/octet-stream",
97
+ supported: true,
98
+ containerOnly: true,
99
+ isDecoded: false,
100
+ pcmDecodeSupported: false
101
+ }, {
102
+ kind: "ogg",
103
+ payloadType: "raw",
104
+ codec: "vorbis",
105
+ mimeType: "audio/ogg",
106
+ supported: resolved === "wwise-vorbis",
107
+ containerOnly: true,
108
+ isDecoded: false
109
+ }, {
110
+ kind: "pcm",
111
+ payloadType: "pcm",
112
+ codec: "float32",
113
+ supported: resolved === "wwise-ptadpcm" || resolved === "pcm",
114
+ isDecoded: true,
115
+ pcmDecodeSupported: resolved === "wwise-ptadpcm" || resolved === "pcm"
116
+ }]
117
+ };
118
+ }
119
+
120
+ export { resolveTypeWithValues };
121
+ //# sourceMappingURL=resolve.js.map