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