@carbonenginejs/runtime-resource 0.11.1 → 0.12.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 (72) hide show
  1. package/dist/formats/bnk/CjsBnkFormat.js +12 -2
  2. package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
  3. package/dist/formats/bnk/core/graph.js +3 -6
  4. package/dist/formats/bnk/core/graph.js.map +1 -1
  5. package/dist/formats/bnk/core/helpers.js +53 -11
  6. package/dist/formats/bnk/core/helpers.js.map +1 -1
  7. package/dist/formats/bnk/core/sfxNodes.js +532 -0
  8. package/dist/formats/bnk/core/sfxNodes.js.map +1 -0
  9. package/dist/formats/bnk/core/soundbanksInfo.js +59 -51
  10. package/dist/formats/bnk/core/soundbanksInfo.js.map +1 -1
  11. package/dist/formats/gr2/CjsGr2Format.js +256 -13
  12. package/dist/formats/gr2/CjsGr2Format.js.map +1 -1
  13. package/dist/formats/gr2/core/helpers.js +15 -15
  14. package/dist/formats/gr2/core/helpers.js.map +1 -1
  15. package/dist/formats/gr2/core/json.js +1 -1
  16. package/dist/formats/gr2/core/json.js.map +1 -1
  17. package/dist/formats/gr2/core/targets.js +1 -1
  18. package/dist/formats/gr2/core/targets.js.map +1 -1
  19. package/dist/formats/gr2/index.js +0 -1
  20. package/dist/formats/gr2/index.js.map +1 -1
  21. package/dist/formats/hlsl/core/analysis.js +1 -1
  22. package/dist/formats/hlsl/index.js +1 -0
  23. package/dist/formats/hlsl/index.js.map +1 -1
  24. package/dist/formats/index.js +3 -6
  25. package/dist/formats/index.js.map +1 -1
  26. package/dist/formats/webgl/core/cewg/binary.js +3 -3
  27. package/dist/formats/webgl/core/cewg/binary.js.map +1 -1
  28. package/dist/formats/webgl/core/effectPackage.js +4 -1
  29. package/dist/formats/webgl/core/effectPackage.js.map +1 -1
  30. package/dist/formats/webgl/core/errors.js +3 -3
  31. package/dist/formats/webgl/core/errors.js.map +1 -1
  32. package/docs/formats/dxbc/README.md +68 -0
  33. package/docs/formats/dxbc/architecture.md +80 -0
  34. package/docs/formats/dxbc/reference/api.md +77 -0
  35. package/docs/formats/dxbc/reference/classes/README.md +76 -0
  36. package/docs/formats/dxbc/reference/decoded-output.md +122 -0
  37. package/docs/formats/gr2.md +3 -4
  38. package/docs/formats/hlsl/README.md +54 -0
  39. package/docs/formats/hlsl/architecture.md +67 -0
  40. package/docs/formats/hlsl/guides/hydrating-json-output.md +62 -0
  41. package/docs/formats/hlsl/guides/reading-effects.md +64 -0
  42. package/docs/formats/hlsl/reference/advanced-analysis.md +66 -0
  43. package/docs/formats/hlsl/reference/api.md +97 -0
  44. package/docs/formats/hlsl/reference/classes/README.md +16 -0
  45. package/docs/formats/hlsl/reference/classes/carbon-compatibility.md +66 -0
  46. package/docs/formats/hlsl/reference/classes/public-api.md +26 -0
  47. package/docs/formats/hlsl/reference/classes/tr2-effect-model.md +150 -0
  48. package/docs/formats/hlsl/reference/json-graph.md +100 -0
  49. package/docs/formats/hlsl/reference/portable-reflection.md +141 -0
  50. package/docs/formats/provenance.md +9 -4
  51. package/docs/formats/webgl/README.md +57 -0
  52. package/docs/formats/webgl/architecture.md +70 -0
  53. package/docs/formats/webgl/carbon-constant-layouts.md +326 -0
  54. package/docs/formats/webgl/decl-io.md +1234 -0
  55. package/docs/formats/webgl/effect-reflection.md +127 -0
  56. package/docs/formats/webgl/memory-structured.md +871 -0
  57. package/docs/formats/webgl/reference/classes/README.md +96 -0
  58. package/docs/formats/webgl/texture-sample.md +964 -0
  59. package/docs/formats/webgpu/README.md +81 -0
  60. package/docs/formats/webgpu/architecture.md +93 -0
  61. package/docs/formats/webgpu/formats/cewgpu.md +479 -0
  62. package/docs/formats/webgpu/guides/effect-packaging.md +199 -0
  63. package/docs/formats/webgpu/reference/api.md +197 -0
  64. package/docs/formats/webgpu/reference/classes/README.md +66 -0
  65. package/docs/formats/webgpu/reference/wgsl-compatibility.md +1442 -0
  66. package/docs/formats/wwise.md +16 -1
  67. package/docs/reference/classes/formats.md +10 -10
  68. package/format-notices/bnk/NOTICE +5 -4
  69. package/format-notices/webgl/NOTICE +1 -1
  70. package/package.json +1 -1
  71. package/dist/formats/gr2/core/CjsFormatGr2.js +0 -273
  72. package/dist/formats/gr2/core/CjsFormatGr2.js.map +0 -1
@@ -2,6 +2,7 @@ import { wwiseIdFromName, joinSoundbanksInfo, buildSoundbanksCatalog, parseSound
2
2
  import { DEFAULT_VALUES, normalizeValues, readWithValues, inspectWithValues, isSupportedWithValues, toJsonValue, toBytes, extractMedia, isBNK, OUTPUT_MEDIA, OUTPUT_BNK_JSON, OUTPUT_JSON, OUTPUT_RAW, HIRC_TYPE_NAMES } from './core/helpers.js';
3
3
  import { eventMediaFromBanks } from './core/graph.js';
4
4
  import { parseMusicSwitch, parseMusicPlaylist, parseMusicTrack, parseMusicSegment, musicNodesFromBanks } from './core/musicNodes.js';
5
+ import { parseSfxLayer, parseSfxSwitch, parseSfxRandomSequence, sfxNodesFromBanks } from './core/sfxNodes.js';
5
6
 
6
7
  const FORMAT_NAME = "CjsBnkFormat";
7
8
 
@@ -209,7 +210,12 @@ class CjsBnkFormat {
209
210
  * `parseMusicSegment/Track/Playlist/Switch`) turn the music-hierarchy
210
211
  * entries (HIRC 10-13) into typed nodes - children, meter, cue markers,
211
212
  * clips, playlist trees, decision trees, and transition rules. See
212
- * core/musicNodes.js for the anchored, exact-end-validated parse.
213
+ * core/musicNodes.js for the anchored, exact-end-validated parse.
214
+ *
215
+ * The v150 authored-SFX decoders (`sfxNodesFromBanks` and the per-type
216
+ * Random/Sequence, Switch, and Layer parsers) preserve raw Wwise
217
+ * semantics for runtime-audio's optional builder. They do not lower
218
+ * container behavior into a playback schema.
213
219
  */
214
220
  static wwise = Object.freeze({
215
221
  isSoundbanksInfo,
@@ -222,7 +228,11 @@ class CjsBnkFormat {
222
228
  parseMusicSegment,
223
229
  parseMusicTrack,
224
230
  parseMusicPlaylist,
225
- parseMusicSwitch
231
+ parseMusicSwitch,
232
+ sfxNodesFromBanks,
233
+ parseSfxRandomSequence,
234
+ parseSfxSwitch,
235
+ parseSfxLayer
226
236
  });
227
237
 
228
238
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"CjsBnkFormat.js","sources":["../../../../src/formats/bnk/CjsBnkFormat.js"],"sourcesContent":["import {\r\n buildSoundbanksCatalog,\r\n isSoundbanksInfo,\r\n joinSoundbanksInfo,\r\n parseSoundbanksInfo,\r\n wwiseIdFromName\r\n} from \"./core/soundbanksInfo.js\";\r\nimport {\r\n DEFAULT_VALUES,\r\n HIRC_TYPE_NAMES,\r\n OUTPUT_BNK_JSON,\r\n OUTPUT_JSON,\r\n OUTPUT_MEDIA,\r\n OUTPUT_RAW,\r\n extractMedia,\r\n inspectWithValues,\r\n isBNK,\r\n isSupportedWithValues,\r\n normalizeValues,\r\n readWithValues,\r\n toBytes,\r\n toJsonValue\r\n} from \"./core/helpers.js\";\r\nimport { eventMediaFromBanks } from \"./core/graph.js\";\r\nimport {\r\n musicNodesFromBanks,\r\n parseMusicPlaylist,\r\n parseMusicSegment,\r\n parseMusicSwitch,\r\n parseMusicTrack\r\n} from \"./core/musicNodes.js\";\r\n\r\nconst FORMAT_NAME = \"CjsBnkFormat\";\r\n\r\n/**\r\n * Reader for Audiokinetic Wwise soundbank (.bnk) containers.\r\n *\r\n * Inspection decodes the bank header, embedded media index, object hierarchy\r\n * listing (with version-stable typed fields), and referenced bank names\r\n * without copying payloads. Read can emit the raw bank, debug JSON, or the\r\n * embedded media items undecoded. The read path stays a pure container\r\n * reader; the Wwise-domain toolkit (SoundbanksInfo catalog helpers, id hash,\r\n * event -> media graph resolution) is grouped under the `wwise` static.\r\n */\r\nexport class CjsBnkFormat\n{\n #values = DEFAULT_VALUES;\n\n /**\n * Browser-worker module declaration consumed by CjsResManWorkerLoader.\n */\n static worker = Object.freeze({\n module: import.meta.url,\n exportName: \"CjsBnkFormat\"\n });\n\r\n /**\r\n * Create a reusable bnk format profile.\r\n *\r\n * @param {object} [options] Default read/inspect options.\r\n */\r\n constructor(options = {})\r\n {\r\n this.SetValues(options);\r\n }\r\n\r\n /**\r\n * Merge options into this profile.\r\n *\r\n * @param {object} [options] Values to merge.\r\n * @returns {CjsBnkFormat} This format profile.\r\n */\r\n SetValues(options = {})\r\n {\r\n this.#values = normalizeValues(this.#values, options, FORMAT_NAME);\r\n return this;\r\n }\r\n\r\n /**\r\n * Get normalized profile values with optional per-call overrides.\r\n *\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Normalized read values.\r\n */\r\n GetValues(options = {})\r\n {\r\n return normalizeValues(this.#values, options, FORMAT_NAME);\r\n }\r\n\r\n /**\r\n * Read soundbank bytes with this profile.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n Read(input, options = {})\r\n {\r\n return readWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Read soundbank bytes asynchronously with this profile.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {Promise<object>} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n async ReadAsync(input, options = {})\r\n {\r\n return this.Read(input, options);\r\n }\r\n\r\n /**\r\n * Inspect soundbank bytes without copying media payloads.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Soundbank metadata.\r\n */\r\n Inspect(input, options = {})\r\n {\r\n return inspectWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Report whether soundbank input and requested output variants are supported.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Support/probe report.\r\n */\r\n IsSupported(input, options = {})\r\n {\r\n return isSupportedWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Convert format output into JSON-compatible debug data.\r\n *\r\n * @param {any} value Format output.\r\n * @returns {any} JSON-compatible value.\r\n */\r\n ToJSON(value)\r\n {\r\n return toJsonValue(value);\r\n }\r\n\r\n /**\r\n * One-shot soundbank read.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Read options.\r\n * @returns {object} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n static read(input, options = {})\r\n {\r\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * One-shot asynchronous soundbank read.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Read options.\r\n * @returns {Promise<object>} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n static async readAsync(input, options = {})\r\n {\r\n return CjsBnkFormat.read(input, options);\r\n }\r\n\r\n /**\r\n * One-shot soundbank inspection.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Inspect options.\r\n * @returns {object} Soundbank metadata.\r\n */\r\n static inspect(input, options = {})\r\n {\r\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * One-shot soundbank support probe.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Probe options.\r\n * @returns {object} Support/probe report.\r\n */\r\n static isSupported(input, options = {})\r\n {\r\n return isSupportedWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * Extract embedded media payloads as views over the soundbank bytes.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {number} [mediaId] Optional single media id filter.\r\n * @returns {Array<object>} Extracted media items with undecoded bytes.\r\n */\r\n static extractMedia(input, mediaId)\r\n {\r\n const bytes = toBytes(input);\r\n const metadata = inspectWithValues(bytes, DEFAULT_VALUES);\r\n return extractMedia(bytes, metadata, mediaId);\r\n }\r\n\r\n /**\r\n * Convert format output into JSON-compatible debug data.\r\n *\r\n * @param {any} value Format output.\r\n * @returns {any} JSON-compatible value.\r\n */\r\n static toJSON(value)\r\n {\r\n return toJsonValue(value);\r\n }\r\n\r\n /**\r\n * Test whether bytes look like a Wwise soundbank.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate soundbank bytes.\r\n * @returns {boolean} True when the BKHD header chunk is present.\r\n */\r\n static isBNK(input)\r\n {\r\n try\r\n {\r\n return isBNK(toBytes(input));\r\n }\r\n catch\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Wwise-domain toolkit, grouped apart from the container-reading statics -\r\n * the single home for the SoundbanksInfo catalog helpers\r\n * (`isSoundbanksInfo`, `parseSoundbanksInfo`, `buildSoundbanksCatalog`,\r\n * `joinSoundbanksInfo`), the id hash (`wwiseIdFromName`, FNV-1 of the\r\n * lowercased name), and event-graph resolution.\r\n *\r\n * `eventMediaFromBanks(inspections, options)` is graph interpretation over\r\n * `inspect()` results, not a read path: banks may split events from their\r\n * target objects (EVE keeps all events in one bank and their sounds in\r\n * others), so always pass every related bank to one call. Returns\r\n * `{ eventMedia: Map<eventObjectId, Set<wemId>>, diagnostics }`. See\r\n * core/graph.js for the walk policy.\r\n *\r\n * The interactive-music decoders (`musicNodesFromBanks` and the per-type\r\n * `parseMusicSegment/Track/Playlist/Switch`) turn the music-hierarchy\r\n * entries (HIRC 10-13) into typed nodes - children, meter, cue markers,\r\n * clips, playlist trees, decision trees, and transition rules. See\r\n * core/musicNodes.js for the anchored, exact-end-validated parse.\r\n */\r\n static wwise = Object.freeze({\r\n isSoundbanksInfo,\r\n parseSoundbanksInfo,\r\n buildSoundbanksCatalog,\r\n joinSoundbanksInfo,\r\n wwiseIdFromName,\r\n eventMediaFromBanks,\r\n musicNodesFromBanks,\r\n parseMusicSegment,\r\n parseMusicTrack,\r\n parseMusicPlaylist,\r\n parseMusicSwitch\r\n });\r\n\r\n /**\r\n * Emit targets for this format (canonical frozen enum).\r\n */\r\n static Output = Object.freeze({\r\n RAW: OUTPUT_RAW,\r\n JSON: OUTPUT_JSON,\r\n BNK_JSON: OUTPUT_BNK_JSON,\r\n MEDIA: OUTPUT_MEDIA\r\n });\r\n\r\n static HIRC_TYPE_NAMES = HIRC_TYPE_NAMES;\r\n\r\n static type = Object.freeze([ \"audio\" ]);\r\n\r\n static mediaTypes = Object.freeze([ \"audio\" ]);\r\n\r\n static inputTypes = Object.freeze([ \"bnk\" ]);\r\n\r\n static outputTypes = Object.freeze([ OUTPUT_RAW, OUTPUT_MEDIA ]);\r\n\r\n static debugOutputTypes = Object.freeze([ OUTPUT_BNK_JSON, OUTPUT_RAW ]);\r\n}\r\n\r\nexport default CjsBnkFormat;\r\n"],"names":["FORMAT_NAME","CjsBnkFormat","DEFAULT_VALUES","worker","Object","freeze","module","import","meta","url","exportName","constructor","options","SetValues","normalizeValues","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","IsSupported","isSupportedWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","isSupported","extractMedia","mediaId","bytes","toBytes","metadata","toJSON","isBNK","wwise","isSoundbanksInfo","parseSoundbanksInfo","buildSoundbanksCatalog","joinSoundbanksInfo","wwiseIdFromName","eventMediaFromBanks","musicNodesFromBanks","parseMusicSegment","parseMusicTrack","parseMusicPlaylist","parseMusicSwitch","Output","RAW","OUTPUT_RAW","JSON","OUTPUT_JSON","BNK_JSON","OUTPUT_BNK_JSON","MEDIA","OUTPUT_MEDIA","HIRC_TYPE_NAMES","type","mediaTypes","inputTypes","outputTypes","debugOutputTypes"],"mappings":"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"}
1
+ {"version":3,"file":"CjsBnkFormat.js","sources":["../../../../src/formats/bnk/CjsBnkFormat.js"],"sourcesContent":["import {\n buildSoundbanksCatalog,\r\n isSoundbanksInfo,\r\n joinSoundbanksInfo,\r\n parseSoundbanksInfo,\r\n wwiseIdFromName\r\n} from \"./core/soundbanksInfo.js\";\r\nimport {\r\n DEFAULT_VALUES,\r\n HIRC_TYPE_NAMES,\r\n OUTPUT_BNK_JSON,\r\n OUTPUT_JSON,\r\n OUTPUT_MEDIA,\r\n OUTPUT_RAW,\r\n extractMedia,\r\n inspectWithValues,\r\n isBNK,\r\n isSupportedWithValues,\r\n normalizeValues,\r\n readWithValues,\r\n toBytes,\r\n toJsonValue\r\n} from \"./core/helpers.js\";\r\nimport { eventMediaFromBanks } from \"./core/graph.js\";\r\nimport {\r\n musicNodesFromBanks,\r\n parseMusicPlaylist,\r\n parseMusicSegment,\r\n parseMusicSwitch,\r\n parseMusicTrack\r\n} from \"./core/musicNodes.js\";\nimport {\n parseSfxLayer,\n parseSfxRandomSequence,\n parseSfxSwitch,\n sfxNodesFromBanks\n} from \"./core/sfxNodes.js\";\n\r\nconst FORMAT_NAME = \"CjsBnkFormat\";\r\n\r\n/**\r\n * Reader for Audiokinetic Wwise soundbank (.bnk) containers.\r\n *\r\n * Inspection decodes the bank header, embedded media index, object hierarchy\r\n * listing (with version-stable typed fields), and referenced bank names\r\n * without copying payloads. Read can emit the raw bank, debug JSON, or the\r\n * embedded media items undecoded. The read path stays a pure container\r\n * reader; the Wwise-domain toolkit (SoundbanksInfo catalog helpers, id hash,\r\n * event -> media graph resolution) is grouped under the `wwise` static.\r\n */\r\nexport class CjsBnkFormat\n{\n #values = DEFAULT_VALUES;\n\n /**\n * Browser-worker module declaration consumed by CjsResManWorkerLoader.\n */\n static worker = Object.freeze({\n module: import.meta.url,\n exportName: \"CjsBnkFormat\"\n });\n\r\n /**\r\n * Create a reusable bnk format profile.\r\n *\r\n * @param {object} [options] Default read/inspect options.\r\n */\r\n constructor(options = {})\r\n {\r\n this.SetValues(options);\r\n }\r\n\r\n /**\r\n * Merge options into this profile.\r\n *\r\n * @param {object} [options] Values to merge.\r\n * @returns {CjsBnkFormat} This format profile.\r\n */\r\n SetValues(options = {})\r\n {\r\n this.#values = normalizeValues(this.#values, options, FORMAT_NAME);\r\n return this;\r\n }\r\n\r\n /**\r\n * Get normalized profile values with optional per-call overrides.\r\n *\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Normalized read values.\r\n */\r\n GetValues(options = {})\r\n {\r\n return normalizeValues(this.#values, options, FORMAT_NAME);\r\n }\r\n\r\n /**\r\n * Read soundbank bytes with this profile.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n Read(input, options = {})\r\n {\r\n return readWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Read soundbank bytes asynchronously with this profile.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {Promise<object>} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n async ReadAsync(input, options = {})\r\n {\r\n return this.Read(input, options);\r\n }\r\n\r\n /**\r\n * Inspect soundbank bytes without copying media payloads.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Soundbank metadata.\r\n */\r\n Inspect(input, options = {})\r\n {\r\n return inspectWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Report whether soundbank input and requested output variants are supported.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Per-call values.\r\n * @returns {object} Support/probe report.\r\n */\r\n IsSupported(input, options = {})\r\n {\r\n return isSupportedWithValues(input, this.GetValues(options));\r\n }\r\n\r\n /**\r\n * Convert format output into JSON-compatible debug data.\r\n *\r\n * @param {any} value Format output.\r\n * @returns {any} JSON-compatible value.\r\n */\r\n ToJSON(value)\r\n {\r\n return toJsonValue(value);\r\n }\r\n\r\n /**\r\n * One-shot soundbank read.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Read options.\r\n * @returns {object} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n static read(input, options = {})\r\n {\r\n return readWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * One-shot asynchronous soundbank read.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Read options.\r\n * @returns {Promise<object>} GPU-free raw/debug/media payload for the selected emit target.\r\n */\r\n static async readAsync(input, options = {})\r\n {\r\n return CjsBnkFormat.read(input, options);\r\n }\r\n\r\n /**\r\n * One-shot soundbank inspection.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Inspect options.\r\n * @returns {object} Soundbank metadata.\r\n */\r\n static inspect(input, options = {})\r\n {\r\n return inspectWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * One-shot soundbank support probe.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {object} [options] Probe options.\r\n * @returns {object} Support/probe report.\r\n */\r\n static isSupported(input, options = {})\r\n {\r\n return isSupportedWithValues(input, normalizeValues(DEFAULT_VALUES, options, FORMAT_NAME));\r\n }\r\n\r\n /**\r\n * Extract embedded media payloads as views over the soundbank bytes.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Soundbank bytes.\r\n * @param {number} [mediaId] Optional single media id filter.\r\n * @returns {Array<object>} Extracted media items with undecoded bytes.\r\n */\r\n static extractMedia(input, mediaId)\r\n {\r\n const bytes = toBytes(input);\r\n const metadata = inspectWithValues(bytes, DEFAULT_VALUES);\r\n return extractMedia(bytes, metadata, mediaId);\r\n }\r\n\r\n /**\r\n * Convert format output into JSON-compatible debug data.\r\n *\r\n * @param {any} value Format output.\r\n * @returns {any} JSON-compatible value.\r\n */\r\n static toJSON(value)\r\n {\r\n return toJsonValue(value);\r\n }\r\n\r\n /**\r\n * Test whether bytes look like a Wwise soundbank.\r\n *\r\n * @param {Uint8Array|ArrayBuffer|DataView} input Candidate soundbank bytes.\r\n * @returns {boolean} True when the BKHD header chunk is present.\r\n */\r\n static isBNK(input)\r\n {\r\n try\r\n {\r\n return isBNK(toBytes(input));\r\n }\r\n catch\r\n {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Wwise-domain toolkit, grouped apart from the container-reading statics -\r\n * the single home for the SoundbanksInfo catalog helpers\r\n * (`isSoundbanksInfo`, `parseSoundbanksInfo`, `buildSoundbanksCatalog`,\r\n * `joinSoundbanksInfo`), the id hash (`wwiseIdFromName`, FNV-1 of the\r\n * lowercased name), and event-graph resolution.\r\n *\r\n * `eventMediaFromBanks(inspections, options)` is graph interpretation over\r\n * `inspect()` results, not a read path: banks may split events from their\r\n * target objects (EVE keeps all events in one bank and their sounds in\r\n * others), so always pass every related bank to one call. Returns\r\n * `{ eventMedia: Map<eventObjectId, Set<wemId>>, diagnostics }`. See\r\n * core/graph.js for the walk policy.\r\n *\r\n * The interactive-music decoders (`musicNodesFromBanks` and the per-type\r\n * `parseMusicSegment/Track/Playlist/Switch`) turn the music-hierarchy\r\n * entries (HIRC 10-13) into typed nodes - children, meter, cue markers,\r\n * clips, playlist trees, decision trees, and transition rules. See\r\n * core/musicNodes.js for the anchored, exact-end-validated parse.\n *\n * The v150 authored-SFX decoders (`sfxNodesFromBanks` and the per-type\n * Random/Sequence, Switch, and Layer parsers) preserve raw Wwise\n * semantics for runtime-audio's optional builder. They do not lower\n * container behavior into a playback schema.\n */\r\n static wwise = Object.freeze({\r\n isSoundbanksInfo,\r\n parseSoundbanksInfo,\r\n buildSoundbanksCatalog,\r\n joinSoundbanksInfo,\r\n wwiseIdFromName,\r\n eventMediaFromBanks,\r\n musicNodesFromBanks,\r\n parseMusicSegment,\r\n parseMusicTrack,\n parseMusicPlaylist,\n parseMusicSwitch,\n sfxNodesFromBanks,\n parseSfxRandomSequence,\n parseSfxSwitch,\n parseSfxLayer\n });\n\r\n /**\r\n * Emit targets for this format (canonical frozen enum).\r\n */\r\n static Output = Object.freeze({\r\n RAW: OUTPUT_RAW,\r\n JSON: OUTPUT_JSON,\r\n BNK_JSON: OUTPUT_BNK_JSON,\r\n MEDIA: OUTPUT_MEDIA\r\n });\r\n\r\n static HIRC_TYPE_NAMES = HIRC_TYPE_NAMES;\r\n\r\n static type = Object.freeze([ \"audio\" ]);\r\n\r\n static mediaTypes = Object.freeze([ \"audio\" ]);\r\n\r\n static inputTypes = Object.freeze([ \"bnk\" ]);\r\n\r\n static outputTypes = Object.freeze([ OUTPUT_RAW, OUTPUT_MEDIA ]);\r\n\r\n static debugOutputTypes = Object.freeze([ OUTPUT_BNK_JSON, OUTPUT_RAW ]);\r\n}\r\n\r\nexport default CjsBnkFormat;\r\n"],"names":["FORMAT_NAME","CjsBnkFormat","DEFAULT_VALUES","worker","Object","freeze","module","import","meta","url","exportName","constructor","options","SetValues","normalizeValues","GetValues","Read","input","readWithValues","ReadAsync","Inspect","inspectWithValues","IsSupported","isSupportedWithValues","ToJSON","value","toJsonValue","read","readAsync","inspect","isSupported","extractMedia","mediaId","bytes","toBytes","metadata","toJSON","isBNK","wwise","isSoundbanksInfo","parseSoundbanksInfo","buildSoundbanksCatalog","joinSoundbanksInfo","wwiseIdFromName","eventMediaFromBanks","musicNodesFromBanks","parseMusicSegment","parseMusicTrack","parseMusicPlaylist","parseMusicSwitch","sfxNodesFromBanks","parseSfxRandomSequence","parseSfxSwitch","parseSfxLayer","Output","RAW","OUTPUT_RAW","JSON","OUTPUT_JSON","BNK_JSON","OUTPUT_BNK_JSON","MEDIA","OUTPUT_MEDIA","HIRC_TYPE_NAMES","type","mediaTypes","inputTypes","outputTypes","debugOutputTypes"],"mappings":"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"}
@@ -36,10 +36,7 @@ const TRAVERSABLE_TYPES = new Set([2, 5, 6, 9, 10, 11, 12, 13]);
36
36
 
37
37
  // Media-bearing terminals: typed sourceIds are collected, no traversal out.
38
38
  const TERMINAL_TYPES = new Set([HIRC_SOUND, HIRC_MUSIC_TRACK]);
39
-
40
- // actionType high byte for the play family (for example 0x0403 = play; the
41
- // low byte is scope). Stop is 0x01xx, pause 0x02xx, resume 0x03xx.
42
- const PLAY_ACTION_FAMILY = 0x0400;
39
+ const PLAY_ACTION_TYPES = new Set([0x0403, 0x0503]);
43
40
 
44
41
  /**
45
42
  * Resolve event -> wem media edges over one or more inspected soundbanks.
@@ -103,7 +100,7 @@ function eventMediaFromBanks(inspections, {
103
100
  for (const actionId of entry.actionIds || []) {
104
101
  const action = objects.get(actionId);
105
102
  if (!action || action.type !== HIRC_ACTION) continue;
106
- if (((action.actionType ?? 0) & 0xff00) !== PLAY_ACTION_FAMILY) continue;
103
+ if (!PLAY_ACTION_TYPES.has(action.actionType ?? 0)) continue;
107
104
  const target = objects.get(action.targetId);
108
105
  if (target && TRAVERSABLE_TYPES.has(target.type)) stack.push(target.id);
109
106
  }
@@ -116,7 +113,7 @@ function eventMediaFromBanks(inspections, {
116
113
  mediaRefs
117
114
  } = scanObject(node);
118
115
  for (const wemId of mediaRefs) media.add(wemId);
119
- if (node.type === HIRC_SOUND && node.sourceId !== undefined && wemIdSet.has(node.sourceId)) {
116
+ if (node.type === HIRC_SOUND && node.pluginType === 1 && node.sourceId !== undefined && wemIdSet.has(node.sourceId)) {
120
117
  media.add(node.sourceId);
121
118
  }
122
119
  if (node.type === HIRC_MUSIC_TRACK) {
@@ -1 +1 @@
1
- {"version":3,"file":"graph.js","sources":["../../../../../src/formats/bnk/core/graph.js"],"sourcesContent":["// Wwise soundbank object-graph interpretation: event -> media resolution over\n// one or more inspected banks. Exposed as `CjsBnkFormat.eventMediaFromBanks`.\n// This is NOT part of the format read path and is never used by the resource\n// lifecycle - it exists so consumers can go from `inspect()` output to \"what\n// does event X play?\" without writing their own graph walk.\n//\n// Inputs are plain inspect() results (formats/bnk): the typed HIRC fields\n// (event actionIds, action actionType/targetId, sound/track sourceIds) plus\n// per-object raw payload views for the structures that stay undecoded\n// (container children, positioning, RTPC data).\n//\n// Verified against EVE soundbanks (bank generator version 150 / Wwise 2022.1):\n// - Banks may split responsibilities: EVE keeps every event/action in one\n// bank (common.bnk) and the sounds/containers they target in the media\n// banks, so edges only resolve over the MERGED graph - always pass every\n// related bank to one call.\n// - Walk policy: only play-family actions (actionType high byte 0x04) are\n// followed; sounds and music tracks are terminals (their typed sourceIds\n// are the media); actor-mixers and buses are never entered, because node\n// payloads carry parent/bus back-pointers that would otherwise drag every\n// sibling sound into the result.\n// - Container children lists are undecoded, so references are recovered with\n// a validated id-scan: a u32 at ANY byte offset of a container payload\n// counts only when it matches a traversable object id or a known wem id.\n// Wwise ids are 32-bit hashes, making in-bank collisions vanishingly rare.\n\nconst HIRC_SOUND = 2;\nconst HIRC_ACTION = 3;\nconst HIRC_EVENT = 4;\nconst HIRC_MUSIC_TRACK = 11;\n\n// Types the walk may traverse INTO from a play action or container:\n// sound (2), random-sequence (5), switch (6), blend/layer (9),\n// music segment/track/switch/playlist (10-13).\nconst TRAVERSABLE_TYPES = new Set([ 2, 5, 6, 9, 10, 11, 12, 13 ]);\n\n// Media-bearing terminals: typed sourceIds are collected, no traversal out.\nconst TERMINAL_TYPES = new Set([ HIRC_SOUND, HIRC_MUSIC_TRACK ]);\n\n// actionType high byte for the play family (for example 0x0403 = play; the\n// low byte is scope). Stop is 0x01xx, pause 0x02xx, resume 0x03xx.\nconst PLAY_ACTION_FAMILY = 0x0400;\n\n/**\n * Resolve event -> wem media edges over one or more inspected soundbanks.\n *\n * @param {Array<object>} inspections `CjsBnkFormat.inspect()` results for every related bank.\n * @param {object} [options] Optional settings.\n * @param {Iterable<number|string>} [options.knownWemIds] Streamed wem ids to validate media references against; every bank's embedded media ids are always included.\n * @returns {{eventMedia: Map<number, Set<number>>, diagnostics: object}} Event object id -> wem id set, plus walk diagnostics.\n */\nexport function eventMediaFromBanks(inspections, { knownWemIds = [] } = {})\n{\n const objects = new Map();\n const diagnostics = { objectCount: 0, eventCount: 0 };\n\n for (const inspection of inspections)\n {\n for (const entry of inspection.hirc || [])\n {\n objects.set(entry.id, entry);\n diagnostics.objectCount++;\n }\n }\n\n const wemIdSet = new Set();\n for (const id of knownWemIds) wemIdSet.add(Number(id) >>> 0);\n for (const inspection of inspections)\n {\n for (const record of inspection.media || []) wemIdSet.add(record.id);\n }\n\n // Validated id-scan over a container payload, cached per object id -\n // containers are shared between many events.\n const scanCache = new Map();\n const scanObject = (entry) =>\n {\n let cached = scanCache.get(entry.id);\n if (cached) return cached;\n const nodeRefs = new Set();\n const mediaRefs = new Set();\n cached = { nodeRefs, mediaRefs };\n scanCache.set(entry.id, cached);\n const body = entry.payload;\n if (!body) return cached;\n for (let at = 0; at + 4 <= body.byteLength; at++)\n {\n const value = (body[at] | (body[at + 1] << 8) | (body[at + 2] << 16) | (body[at + 3] * 0x1000000)) >>> 0;\n if (value === entry.id) continue;\n if (wemIdSet.has(value)) mediaRefs.add(value);\n const target = objects.get(value);\n if (target && TRAVERSABLE_TYPES.has(target.type)) nodeRefs.add(value);\n }\n return cached;\n };\n\n const eventMedia = new Map();\n for (const entry of objects.values())\n {\n if (entry.type !== HIRC_EVENT) continue;\n diagnostics.eventCount++;\n const media = new Set();\n const visited = new Set();\n const stack = [];\n\n for (const actionId of entry.actionIds || [])\n {\n const action = objects.get(actionId);\n if (!action || action.type !== HIRC_ACTION) continue;\n if (((action.actionType ?? 0) & 0xff00) !== PLAY_ACTION_FAMILY) continue;\n const target = objects.get(action.targetId);\n if (target && TRAVERSABLE_TYPES.has(target.type)) stack.push(target.id);\n }\n\n while (stack.length)\n {\n const node = objects.get(stack.pop());\n if (!node || visited.has(node.id)) continue;\n visited.add(node.id);\n\n const { nodeRefs, mediaRefs } = scanObject(node);\n for (const wemId of mediaRefs) media.add(wemId);\n if (node.type === HIRC_SOUND && node.sourceId !== undefined && wemIdSet.has(node.sourceId))\n {\n media.add(node.sourceId);\n }\n if (node.type === HIRC_MUSIC_TRACK)\n {\n for (const source of node.sources || [])\n {\n if (wemIdSet.has(source.sourceId)) media.add(source.sourceId);\n }\n }\n if (!TERMINAL_TYPES.has(node.type))\n {\n for (const next of nodeRefs) stack.push(next);\n }\n }\n\n if (media.size) eventMedia.set(entry.id, media);\n }\n\n return { eventMedia, diagnostics };\n}\n"],"names":["HIRC_SOUND","HIRC_ACTION","HIRC_EVENT","HIRC_MUSIC_TRACK","TRAVERSABLE_TYPES","Set","TERMINAL_TYPES","PLAY_ACTION_FAMILY","eventMediaFromBanks","inspections","knownWemIds","objects","Map","diagnostics","objectCount","eventCount","inspection","entry","hirc","set","id","wemIdSet","add","Number","record","media","scanCache","scanObject","cached","get","nodeRefs","mediaRefs","body","payload","at","byteLength","value","has","target","type","eventMedia","values","visited","stack","actionId","actionIds","action","actionType","targetId","push","length","node","pop","wemId","sourceId","undefined","source","sources","next","size"],"mappings":"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"}
1
+ {"version":3,"file":"graph.js","sources":["../../../../../src/formats/bnk/core/graph.js"],"sourcesContent":["// Wwise soundbank object-graph interpretation: event -> media resolution over\n// one or more inspected banks. Exposed as `CjsBnkFormat.eventMediaFromBanks`.\n// This is NOT part of the format read path and is never used by the resource\n// lifecycle - it exists so consumers can go from `inspect()` output to \"what\n// does event X play?\" without writing their own graph walk.\n//\n// Inputs are plain inspect() results (formats/bnk): the typed HIRC fields\n// (event actionIds, action actionType/targetId, sound/track sourceIds) plus\n// per-object raw payload views for the structures that stay undecoded\n// (container children, positioning, RTPC data).\n//\n// Verified against EVE soundbanks (bank generator version 150 / Wwise 2022.1):\n// - Banks may split responsibilities: EVE keeps every event/action in one\n// bank (common.bnk) and the sounds/containers they target in the media\n// banks, so edges only resolve over the MERGED graph - always pass every\n// related bank to one call.\n// - Walk policy: only play-family actions (actionType high byte 0x04) are\n// followed; sounds and music tracks are terminals (their typed sourceIds\n// are the media); actor-mixers and buses are never entered, because node\n// payloads carry parent/bus back-pointers that would otherwise drag every\n// sibling sound into the result.\n// - Container children lists are undecoded, so references are recovered with\n// a validated id-scan: a u32 at ANY byte offset of a container payload\n// counts only when it matches a traversable object id or a known wem id.\n// Wwise ids are 32-bit hashes, making in-bank collisions vanishingly rare.\n\nconst HIRC_SOUND = 2;\nconst HIRC_ACTION = 3;\nconst HIRC_EVENT = 4;\nconst HIRC_MUSIC_TRACK = 11;\n\n// Types the walk may traverse INTO from a play action or container:\n// sound (2), random-sequence (5), switch (6), blend/layer (9),\n// music segment/track/switch/playlist (10-13).\nconst TRAVERSABLE_TYPES = new Set([ 2, 5, 6, 9, 10, 11, 12, 13 ]);\n\n// Media-bearing terminals: typed sourceIds are collected, no traversal out.\nconst TERMINAL_TYPES = new Set([ HIRC_SOUND, HIRC_MUSIC_TRACK ]);\n\nconst PLAY_ACTION_TYPES = new Set([ 0x0403, 0x0503 ]);\n\n/**\n * Resolve event -> wem media edges over one or more inspected soundbanks.\n *\n * @param {Array<object>} inspections `CjsBnkFormat.inspect()` results for every related bank.\n * @param {object} [options] Optional settings.\n * @param {Iterable<number|string>} [options.knownWemIds] Streamed wem ids to validate media references against; every bank's embedded media ids are always included.\n * @returns {{eventMedia: Map<number, Set<number>>, diagnostics: object}} Event object id -> wem id set, plus walk diagnostics.\n */\nexport function eventMediaFromBanks(inspections, { knownWemIds = [] } = {})\n{\n const objects = new Map();\n const diagnostics = { objectCount: 0, eventCount: 0 };\n\n for (const inspection of inspections)\n {\n for (const entry of inspection.hirc || [])\n {\n objects.set(entry.id, entry);\n diagnostics.objectCount++;\n }\n }\n\n const wemIdSet = new Set();\n for (const id of knownWemIds) wemIdSet.add(Number(id) >>> 0);\n for (const inspection of inspections)\n {\n for (const record of inspection.media || []) wemIdSet.add(record.id);\n }\n\n // Validated id-scan over a container payload, cached per object id -\n // containers are shared between many events.\n const scanCache = new Map();\n const scanObject = (entry) =>\n {\n let cached = scanCache.get(entry.id);\n if (cached) return cached;\n const nodeRefs = new Set();\n const mediaRefs = new Set();\n cached = { nodeRefs, mediaRefs };\n scanCache.set(entry.id, cached);\n const body = entry.payload;\n if (!body) return cached;\n for (let at = 0; at + 4 <= body.byteLength; at++)\n {\n const value = (body[at] | (body[at + 1] << 8) | (body[at + 2] << 16) | (body[at + 3] * 0x1000000)) >>> 0;\n if (value === entry.id) continue;\n if (wemIdSet.has(value)) mediaRefs.add(value);\n const target = objects.get(value);\n if (target && TRAVERSABLE_TYPES.has(target.type)) nodeRefs.add(value);\n }\n return cached;\n };\n\n const eventMedia = new Map();\n for (const entry of objects.values())\n {\n if (entry.type !== HIRC_EVENT) continue;\n diagnostics.eventCount++;\n const media = new Set();\n const visited = new Set();\n const stack = [];\n\n for (const actionId of entry.actionIds || [])\n {\n const action = objects.get(actionId);\n if (!action || action.type !== HIRC_ACTION) continue;\n if (!PLAY_ACTION_TYPES.has(action.actionType ?? 0)) continue;\n const target = objects.get(action.targetId);\n if (target && TRAVERSABLE_TYPES.has(target.type)) stack.push(target.id);\n }\n\n while (stack.length)\n {\n const node = objects.get(stack.pop());\n if (!node || visited.has(node.id)) continue;\n visited.add(node.id);\n\n const { nodeRefs, mediaRefs } = scanObject(node);\n for (const wemId of mediaRefs) media.add(wemId);\n if (node.type === HIRC_SOUND\n && node.pluginType === 1\n && node.sourceId !== undefined\n && wemIdSet.has(node.sourceId))\n {\n media.add(node.sourceId);\n }\n if (node.type === HIRC_MUSIC_TRACK)\n {\n for (const source of node.sources || [])\n {\n if (wemIdSet.has(source.sourceId)) media.add(source.sourceId);\n }\n }\n if (!TERMINAL_TYPES.has(node.type))\n {\n for (const next of nodeRefs) stack.push(next);\n }\n }\n\n if (media.size) eventMedia.set(entry.id, media);\n }\n\n return { eventMedia, diagnostics };\n}\n"],"names":["HIRC_SOUND","HIRC_ACTION","HIRC_EVENT","HIRC_MUSIC_TRACK","TRAVERSABLE_TYPES","Set","TERMINAL_TYPES","PLAY_ACTION_TYPES","eventMediaFromBanks","inspections","knownWemIds","objects","Map","diagnostics","objectCount","eventCount","inspection","entry","hirc","set","id","wemIdSet","add","Number","record","media","scanCache","scanObject","cached","get","nodeRefs","mediaRefs","body","payload","at","byteLength","value","has","target","type","eventMedia","values","visited","stack","actionId","actionIds","action","actionType","targetId","push","length","node","pop","wemId","pluginType","sourceId","undefined","source","sources","next","size"],"mappings":"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"}
@@ -143,7 +143,7 @@ function inspectBNK(bytes) {
143
143
  dataChunkSize = size;
144
144
  }
145
145
  if (id === "HIRC") {
146
- info.hirc = readHircListing(bytes, dataOffset, size);
146
+ info.hirc = readHircListing(bytes, dataOffset, size, info.bankVersion);
147
147
  }
148
148
  if (id === "STID") {
149
149
  info.names = readNameTable(bytes, dataOffset, size);
@@ -178,7 +178,7 @@ function readMediaIndex(bytes, dataOffset, size) {
178
178
  }
179
179
  return entries;
180
180
  }
181
- function readHircListing(bytes, dataOffset, size) {
181
+ function readHircListing(bytes, dataOffset, size, bankVersion) {
182
182
  const entries = [];
183
183
  if (size < 4) return entries;
184
184
  const count = readU32(bytes, dataOffset);
@@ -199,7 +199,7 @@ function readHircListing(bytes, dataOffset, size) {
199
199
  // View over the object body AFTER the leading u32 id; not a copy.
200
200
  payload: bytes.subarray(payloadOffset + 4, payloadOffset + entrySize)
201
201
  };
202
- decodeHircFields(entry);
202
+ decodeHircFields(entry, bankVersion);
203
203
  entries.push(entry);
204
204
  offset = payloadOffset + entrySize;
205
205
  }
@@ -212,24 +212,31 @@ function readHircListing(bytes, dataOffset, size) {
212
212
  * generator version 150 / Wwise 2022.1); every read is bounds-checked, and a
213
213
  * body too short for its type's layout simply keeps the raw payload only.
214
214
  *
215
- * - event (4): `u8 actionCount` + `actionCount x u32` -> `actionIds`.
215
+ * - event (4): version >122 uses Wwise's MSB-first base-128 action count;
216
+ * older banks use `u8 actionCount`; both are followed by u32 action ids.
216
217
  * - event-action (3): `u16 actionType` (high byte = family: 0x04 play,
217
218
  * 0x01 stop, 0x02 pause, 0x03 resume) + `u32 targetId`.
218
- * - sound (2): `u32 pluginId, u8 streamType, u32 sourceId (wem id),
219
- * u32 inMemoryMediaSize` (streamType 0 = embedded, 1 = streamed).
219
+ * - sound (2): `u32 pluginId, u8 streamType, u32 sourceId,
220
+ * u32 inMemoryMediaSize` (streamType 0 = bank data, 1 = streaming
221
+ * prefetch, 2 = streamed). Only plugin type 1 is codec-backed WEM media.
220
222
  * - music-track (11): `u8 flags, u32 sourceCount`, then per source the same
221
223
  * plugin/stream/source/size quad as sound -> `sources`.
222
224
  *
223
225
  * Deeper structures (container children, positioning, RTPC curves) remain
224
226
  * undecoded; consumers interpret `payload` themselves.
225
227
  */
226
- function decodeHircFields(entry) {
228
+ function decodeHircFields(entry, bankVersion) {
227
229
  const body = entry.payload;
228
230
  if (entry.type === 4 && body.byteLength >= 1) {
229
231
  const actionIds = [];
230
- const actionCount = body[0];
231
- for (let i = 0; i < actionCount && 1 + i * 4 + 4 <= body.byteLength; i++) {
232
- actionIds.push(readU32(body, 1 + i * 4));
232
+ const decoded = bankVersion > 122 ? readWwiseVar(body, 0) : {
233
+ value: body[0],
234
+ nextOffset: 1
235
+ };
236
+ const actionCount = decoded?.value ?? 0;
237
+ const actionOffset = decoded?.nextOffset ?? body.byteLength;
238
+ for (let i = 0; i < actionCount && actionOffset + i * 4 + 4 <= body.byteLength; i++) {
239
+ actionIds.push(readU32(body, actionOffset + i * 4));
233
240
  }
234
241
  entry.actionIds = actionIds;
235
242
  } else if (entry.type === 3 && body.byteLength >= 6) {
@@ -237,6 +244,7 @@ function decodeHircFields(entry) {
237
244
  entry.targetId = readU32(body, 2);
238
245
  } else if (entry.type === 2 && body.byteLength >= 13) {
239
246
  entry.pluginId = readU32(body, 0);
247
+ entry.pluginType = entry.pluginId & 0x0f;
240
248
  entry.streamType = body[4];
241
249
  entry.sourceId = readU32(body, 5);
242
250
  entry.inMemoryMediaSize = readU32(body, 9);
@@ -248,6 +256,7 @@ function decodeHircFields(entry) {
248
256
  if (at + 13 > body.byteLength) break;
249
257
  sources.push({
250
258
  pluginId: readU32(body, at),
259
+ pluginType: readU32(body, at) & 0x0f,
251
260
  streamType: body[at + 4],
252
261
  sourceId: readU32(body, at + 5),
253
262
  inMemoryMediaSize: readU32(body, at + 9)
@@ -256,6 +265,39 @@ function decodeHircFields(entry) {
256
265
  entry.sources = sources;
257
266
  }
258
267
  }
268
+
269
+ /**
270
+ * Reads Wwise's MSB-first base-128 unsigned integer.
271
+ *
272
+ * @returns {{value:number,nextOffset:number}|null} Decoded value and next
273
+ * offset, or null for truncated, overflowed, or non-canonical input.
274
+ */
275
+ function readWwiseVar(bytes, offset = 0) {
276
+ let at = Number(offset);
277
+ let value = 0;
278
+ let count = 0;
279
+ if (!Number.isSafeInteger(at) || at < 0) {
280
+ return null;
281
+ }
282
+ while (at < bytes.byteLength && count < 5) {
283
+ const byte = bytes[at++];
284
+ if (count === 0 && byte === 0x80) {
285
+ return null;
286
+ }
287
+ if (value > 0x01ffffff) {
288
+ return null;
289
+ }
290
+ value = value * 128 + (byte & 0x7f);
291
+ count++;
292
+ if ((byte & 0x80) === 0) {
293
+ return value <= 0xffffffff ? {
294
+ value: value >>> 0,
295
+ nextOffset: at
296
+ } : null;
297
+ }
298
+ }
299
+ return null;
300
+ }
259
301
  function readNameTable(bytes, dataOffset, size) {
260
302
  const names = [];
261
303
  if (size < 8) return names;
@@ -425,5 +467,5 @@ function readU32(bytes, offset) {
425
467
  return (bytes[offset] | bytes[offset + 1] << 8 | bytes[offset + 2] << 16 | bytes[offset + 3] * 0x1000000) >>> 0;
426
468
  }
427
469
 
428
- export { DEFAULT_VALUES, HIRC_TYPE_NAMES, OUTPUT_BNK_JSON, OUTPUT_JSON, OUTPUT_MEDIA, OUTPUT_RAW, extractMedia, inspectBNK, inspectWithValues, isBNK, isSupportedWithValues, normalizeEmit, normalizeValues, readWithValues, toBytes, toJsonValue };
470
+ export { DEFAULT_VALUES, HIRC_TYPE_NAMES, OUTPUT_BNK_JSON, OUTPUT_JSON, OUTPUT_MEDIA, OUTPUT_RAW, extractMedia, inspectBNK, inspectWithValues, isBNK, isSupportedWithValues, normalizeEmit, normalizeValues, readWithValues, readWwiseVar, toBytes, toJsonValue };
429
471
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../../../src/formats/bnk/core/helpers.js"],"sourcesContent":["export const OUTPUT_RAW = \"raw\";\nexport const OUTPUT_JSON = \"json\";\nexport const OUTPUT_BNK_JSON = \"bnkJson\";\nexport const OUTPUT_MEDIA = \"media\";\n\nexport const DEFAULT_VALUES = Object.freeze({\n emit: OUTPUT_RAW,\n inputType: \"bnk\",\n source: \"\"\n});\n\n/**\n * Advisory names for classic HIRC object type ids.\n *\n * Type ids shifted in later Wwise releases, so these names are hints for\n * debugging and inventory work, not a version-exact schema. Unknown ids are\n * reported as `hirc-type-<n>`.\n */\nexport const HIRC_TYPE_NAMES = Object.freeze({\n 1: \"settings\",\n 2: \"sound\",\n 3: \"event-action\",\n 4: \"event\",\n 5: \"random-sequence-container\",\n 6: \"switch-container\",\n 7: \"actor-mixer\",\n 8: \"audio-bus\",\n 9: \"blend-container\",\n 10: \"music-segment\",\n 11: \"music-track\",\n 12: \"music-switch-container\",\n 13: \"music-playlist-container\",\n 14: \"attenuation\",\n 15: \"dialogue-event\",\n 16: \"motion-bus\",\n 17: \"motion-fx\",\n 18: \"effect\",\n 19: \"auxiliary-bus\",\n 20: \"lfo\",\n 21: \"envelope\",\n 22: \"audio-device\"\n});\n\n/**\n * Normalizes reader options against their supported defaults for the BNK format\n * reader.\n */\nexport function normalizeValues(base = DEFAULT_VALUES, options = {}, readerName = \"CjsBnkFormat\")\n{\n const values = { ...DEFAULT_VALUES, ...(base || {}), ...(options || {}) };\n values.inputType = values.inputType ? String(values.inputType).replace(/^\\./u, \"\").toLowerCase() : \"bnk\";\n values.emit = normalizeEmit(values.emit, readerName);\n return values;\n}\n\n/** Normalizes the requested output representation for the BNK format reader. */\nexport function normalizeEmit(emit, readerName)\n{\n if (emit === undefined || emit === null) return OUTPUT_RAW;\n if (emit === OUTPUT_JSON) return OUTPUT_BNK_JSON;\n if ([ OUTPUT_RAW, OUTPUT_BNK_JSON, OUTPUT_MEDIA ].includes(emit)) return emit;\n throw new TypeError(`${readerName}: unknown emit value ${JSON.stringify(emit)}`);\n}\n\n/** Returns a byte view over the supplied binary input for the BNK format reader. */\nexport function toBytes(input)\n{\n if (input instanceof Uint8Array) return input;\n if (input instanceof ArrayBuffer) return new Uint8Array(input);\n if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n throw new TypeError(\"Bnk input must be Uint8Array, ArrayBuffer, or DataView\");\n}\n\n/**\n * Test for a Wwise soundbank BKHD signature.\n *\n * @param {Uint8Array} bytes Candidate bytes.\n * @returns {boolean} True when the bank header chunk is present.\n */\nexport function isBNK(bytes)\n{\n return bytes.byteLength >= 8 && fourCc(bytes, 0) === \"BKHD\";\n}\n\n/**\n * Inspect Wwise soundbank bytes without copying media payloads.\n *\n * Walks the chunk sequence and decodes the bank header (BKHD), embedded media\n * index (DIDX/DATA), object hierarchy listing (HIRC), and referenced bank\n * names (STID). Unknown chunks are recorded, never rejected; a truncated\n * trailing chunk stops the walk and is flagged.\n *\n * Wwise soundbanks are written little-endian on all platforms EVE ships on;\n * this reader assumes little-endian data.\n *\n * @param {Uint8Array} bytes Soundbank bytes.\n * @returns {object} Soundbank metadata.\n */\nexport function inspectBNK(bytes)\n{\n const info = {\n sourceFormat: \"bnk\",\n bankVersion: 0,\n bankId: 0,\n languageId: 0,\n media: [],\n hirc: [],\n names: [],\n chunks: []\n };\n\n let dataChunkOffset = 0;\n let dataChunkSize = 0;\n let mediaIndex = [];\n let offset = 0;\n\n while (offset + 8 <= bytes.byteLength)\n {\n const id = fourCc(bytes, offset);\n const size = readU32(bytes, offset + 4);\n const dataOffset = offset + 8;\n if (dataOffset + size > bytes.byteLength)\n {\n info.chunks.push({ id, offset, dataOffset, size, truncated: true });\n break;\n }\n info.chunks.push({ id, offset, dataOffset, size });\n\n if (id === \"BKHD\" && size >= 12)\n {\n info.bankVersion = readU32(bytes, dataOffset);\n info.bankId = readU32(bytes, dataOffset + 4);\n info.languageId = readU32(bytes, dataOffset + 8);\n }\n if (id === \"DIDX\")\n {\n mediaIndex = readMediaIndex(bytes, dataOffset, size);\n }\n if (id === \"DATA\")\n {\n dataChunkOffset = dataOffset;\n dataChunkSize = size;\n }\n if (id === \"HIRC\")\n {\n info.hirc = readHircListing(bytes, dataOffset, size);\n }\n if (id === \"STID\")\n {\n info.names = readNameTable(bytes, dataOffset, size);\n }\n\n offset = dataOffset + size;\n }\n\n info.media = mediaIndex.map((entry) =>\n {\n const absoluteOffset = dataChunkOffset + entry.offset;\n const available = dataChunkOffset > 0 &&\n entry.offset + entry.length <= dataChunkSize &&\n absoluteOffset + entry.length <= bytes.byteLength;\n return {\n id: entry.id,\n offset: entry.offset,\n absoluteOffset: dataChunkOffset > 0 ? absoluteOffset : 0,\n length: entry.length,\n available\n };\n });\n\n info.mediaCount = info.media.length;\n info.hircCount = info.hirc.length;\n return info;\n}\n\nfunction readMediaIndex(bytes, dataOffset, size)\n{\n const entries = [];\n const count = Math.floor(size / 12);\n for (let i = 0; i < count; i++)\n {\n const entryOffset = dataOffset + i * 12;\n entries.push({\n id: readU32(bytes, entryOffset),\n offset: readU32(bytes, entryOffset + 4),\n length: readU32(bytes, entryOffset + 8)\n });\n }\n return entries;\n}\n\nfunction readHircListing(bytes, dataOffset, size)\n{\n const entries = [];\n if (size < 4) return entries;\n const count = readU32(bytes, dataOffset);\n const end = dataOffset + size;\n let offset = dataOffset + 4;\n\n for (let i = 0; i < count; i++)\n {\n if (offset + 9 > end) break;\n const type = bytes[offset];\n const entrySize = readU32(bytes, offset + 1);\n const payloadOffset = offset + 5;\n if (entrySize < 4 || payloadOffset + entrySize > end) break;\n const entry = {\n type,\n typeName: HIRC_TYPE_NAMES[type] || `hirc-type-${type}`,\n id: readU32(bytes, payloadOffset),\n offset: payloadOffset,\n size: entrySize,\n // View over the object body AFTER the leading u32 id; not a copy.\n payload: bytes.subarray(payloadOffset + 4, payloadOffset + entrySize)\n };\n decodeHircFields(entry);\n entries.push(entry);\n offset = payloadOffset + entrySize;\n }\n\n return entries;\n}\n\n/**\n * Decode the version-stable typed fields of common HIRC object types in\n * place. Field layouts verified by hexdump against EVE soundbanks (bank\n * generator version 150 / Wwise 2022.1); every read is bounds-checked, and a\n * body too short for its type's layout simply keeps the raw payload only.\n *\n * - event (4): `u8 actionCount` + `actionCount x u32` -> `actionIds`.\n * - event-action (3): `u16 actionType` (high byte = family: 0x04 play,\n * 0x01 stop, 0x02 pause, 0x03 resume) + `u32 targetId`.\n * - sound (2): `u32 pluginId, u8 streamType, u32 sourceId (wem id),\n * u32 inMemoryMediaSize` (streamType 0 = embedded, 1 = streamed).\n * - music-track (11): `u8 flags, u32 sourceCount`, then per source the same\n * plugin/stream/source/size quad as sound -> `sources`.\n *\n * Deeper structures (container children, positioning, RTPC curves) remain\n * undecoded; consumers interpret `payload` themselves.\n */\nfunction decodeHircFields(entry)\n{\n const body = entry.payload;\n if (entry.type === 4 && body.byteLength >= 1)\n {\n const actionIds = [];\n const actionCount = body[0];\n for (let i = 0; i < actionCount && 1 + i * 4 + 4 <= body.byteLength; i++)\n {\n actionIds.push(readU32(body, 1 + i * 4));\n }\n entry.actionIds = actionIds;\n }\n else if (entry.type === 3 && body.byteLength >= 6)\n {\n entry.actionType = body[0] | (body[1] << 8);\n entry.targetId = readU32(body, 2);\n }\n else if (entry.type === 2 && body.byteLength >= 13)\n {\n entry.pluginId = readU32(body, 0);\n entry.streamType = body[4];\n entry.sourceId = readU32(body, 5);\n entry.inMemoryMediaSize = readU32(body, 9);\n }\n else if (entry.type === 11 && body.byteLength >= 5)\n {\n const sources = [];\n const sourceCount = readU32(body, 1);\n for (let i = 0; i < sourceCount; i++)\n {\n const at = 5 + i * 14;\n if (at + 13 > body.byteLength) break;\n sources.push({\n pluginId: readU32(body, at),\n streamType: body[at + 4],\n sourceId: readU32(body, at + 5),\n inMemoryMediaSize: readU32(body, at + 9)\n });\n }\n entry.sources = sources;\n }\n}\n\nfunction readNameTable(bytes, dataOffset, size)\n{\n const names = [];\n if (size < 8) return names;\n const count = readU32(bytes, dataOffset + 4);\n const end = dataOffset + size;\n let offset = dataOffset + 8;\n\n for (let i = 0; i < count; i++)\n {\n if (offset + 5 > end) break;\n const bankId = readU32(bytes, offset);\n const length = bytes[offset + 4];\n if (offset + 5 + length > end) break;\n names.push({\n bankId,\n name: asciiString(bytes, offset + 5, length)\n });\n offset += 5 + length;\n }\n\n return names;\n}\n\n/** Inspects input using normalized format options for the BNK format reader. */\nexport function inspectWithValues(input, values = DEFAULT_VALUES)\n{\n const bytes = toBytes(input);\n if (!isBNK(bytes))\n {\n throw new TypeError(\"CjsBnkFormat: expected a Wwise soundbank starting with a BKHD chunk\");\n }\n return {\n payloadType: \"audio\",\n mediaTypes: [ \"audio\" ],\n byteLength: bytes.byteLength,\n source: values.source || \"buffer\",\n ...inspectBNK(bytes)\n };\n}\n\n/**\n * Extract embedded media payloads as views over the soundbank bytes.\n *\n * Returned `bytes` are subarray views, not copies; callers that outlive the\n * source buffer should copy them.\n *\n * @param {Uint8Array} bytes Soundbank bytes.\n * @param {object} metadata Inspection result for those bytes.\n * @param {number} [mediaId] Optional single media id filter.\n * @returns {Array<object>} Extracted media items.\n */\nexport function extractMedia(bytes, metadata, mediaId)\n{\n const items = [];\n for (const entry of metadata.media)\n {\n if (mediaId !== undefined && entry.id !== mediaId) continue;\n if (!entry.available) continue;\n const payload = bytes.subarray(entry.absoluteOffset, entry.absoluteOffset + entry.length);\n items.push({\n id: entry.id,\n length: entry.length,\n isWem: payload.length >= 12 &&\n (fourCc(payload, 0) === \"RIFF\" || fourCc(payload, 0) === \"RIFX\") &&\n fourCc(payload, 8) === \"WAVE\",\n bytes: payload\n });\n }\n return items;\n}\n\n/**\n * Reports whether input is supported under normalized format options for the BNK\n * format reader.\n */\nexport function isSupportedWithValues(input, values = DEFAULT_VALUES)\n{\n try\n {\n const metadata = inspectWithValues(input, values);\n const extractable = metadata.media.some((entry) => entry.available);\n return {\n format: \"bnk\",\n source: values.source || \"buffer\",\n supported: \"partial\",\n confidence: 1,\n preferred: extractable ? OUTPUT_MEDIA : \"raw\",\n reason: extractable\n ? \"Soundbank recognized; embedded media can be extracted undecoded.\"\n : \"Soundbank recognized; it carries no extractable embedded media.\",\n metadata,\n variants: [\n {\n kind: \"raw\",\n payloadType: \"raw\",\n codec: \"wwise-soundbank\",\n mimeType: \"application/octet-stream\",\n supported: true,\n containerOnly: true,\n isDecoded: false,\n pcmDecodeSupported: false\n },\n {\n kind: OUTPUT_MEDIA,\n payloadType: OUTPUT_MEDIA,\n codec: \"wem\",\n supported: extractable,\n containerOnly: true,\n isDecoded: false,\n reason: extractable ? \"\" : \"No DIDX/DATA media entries are present.\"\n }\n ],\n warnings: [],\n errors: []\n };\n }\n catch (error)\n {\n return {\n format: \"bnk\",\n source: values.source || \"buffer\",\n supported: \"none\",\n confidence: 0,\n preferred: \"\",\n reason: error.message,\n metadata: null,\n variants: [],\n warnings: [],\n errors: [ error.message ]\n };\n }\n}\n\n/** Reads input using normalized format options for the BNK format reader. */\nexport function readWithValues(input, values = DEFAULT_VALUES)\n{\n const bytes = toBytes(input);\n const metadata = inspectWithValues(bytes, values);\n if (values.emit === OUTPUT_BNK_JSON) return metadata;\n if (values.emit === OUTPUT_MEDIA)\n {\n return {\n payloadType: OUTPUT_MEDIA,\n sourceFormat: \"bnk\",\n containerOnly: true,\n isDecoded: false,\n metadata,\n items: extractMedia(bytes, metadata)\n };\n }\n return {\n payloadType: \"raw\",\n sourceFormat: \"bnk\",\n mimeType: \"application/octet-stream\",\n containerOnly: true,\n isDecoded: false,\n pcmDecodeSupported: false,\n metadata,\n bytes\n };\n}\n\n/** Converts a parsed payload into a JSON-safe value for the BNK format reader. */\nexport function toJsonValue(value)\n{\n if (value instanceof Uint8Array) return { byteLength: value.byteLength };\n if (Array.isArray(value)) return value.map(toJsonValue);\n if (value && typeof value === \"object\")\n {\n const output = {};\n for (const [ key, entry ] of Object.entries(value)) output[key] = toJsonValue(entry);\n return output;\n }\n return value;\n}\n\nfunction asciiString(bytes, offset, length)\n{\n let value = \"\";\n for (let i = 0; i < length; i++) value += String.fromCharCode(bytes[offset + i]);\n return value;\n}\n\nfunction fourCc(bytes, offset, length = 4)\n{\n let value = \"\";\n for (let i = 0; i < length; i++) value += String.fromCharCode(bytes[offset + i] || 0);\n return value;\n}\n\nfunction readU32(bytes, offset)\n{\n return (bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16) | (bytes[offset + 3] * 0x1000000)) >>> 0;\n}\n"],"names":["OUTPUT_RAW","OUTPUT_JSON","OUTPUT_BNK_JSON","OUTPUT_MEDIA","DEFAULT_VALUES","Object","freeze","emit","inputType","source","HIRC_TYPE_NAMES","normalizeValues","base","options","readerName","values","String","replace","toLowerCase","normalizeEmit","undefined","includes","TypeError","JSON","stringify","toBytes","input","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","isBNK","bytes","fourCc","inspectBNK","info","sourceFormat","bankVersion","bankId","languageId","media","hirc","names","chunks","dataChunkOffset","dataChunkSize","mediaIndex","offset","id","size","readU32","dataOffset","push","truncated","readMediaIndex","readHircListing","readNameTable","map","entry","absoluteOffset","available","length","mediaCount","hircCount","entries","count","Math","floor","i","entryOffset","end","type","entrySize","payloadOffset","typeName","payload","subarray","decodeHircFields","body","actionIds","actionCount","actionType","targetId","pluginId","streamType","sourceId","inMemoryMediaSize","sources","sourceCount","at","name","asciiString","inspectWithValues","payloadType","mediaTypes","extractMedia","metadata","mediaId","items","isWem","isSupportedWithValues","extractable","some","format","supported","confidence","preferred","reason","variants","kind","codec","mimeType","containerOnly","isDecoded","pcmDecodeSupported","warnings","errors","error","message","readWithValues","toJsonValue","value","Array","isArray","output","key","fromCharCode"],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../../../src/formats/bnk/core/helpers.js"],"sourcesContent":["export const OUTPUT_RAW = \"raw\";\nexport const OUTPUT_JSON = \"json\";\nexport const OUTPUT_BNK_JSON = \"bnkJson\";\nexport const OUTPUT_MEDIA = \"media\";\n\nexport const DEFAULT_VALUES = Object.freeze({\n emit: OUTPUT_RAW,\n inputType: \"bnk\",\n source: \"\"\n});\n\n/**\n * Advisory names for classic HIRC object type ids.\n *\n * Type ids shifted in later Wwise releases, so these names are hints for\n * debugging and inventory work, not a version-exact schema. Unknown ids are\n * reported as `hirc-type-<n>`.\n */\nexport const HIRC_TYPE_NAMES = Object.freeze({\n 1: \"settings\",\n 2: \"sound\",\n 3: \"event-action\",\n 4: \"event\",\n 5: \"random-sequence-container\",\n 6: \"switch-container\",\n 7: \"actor-mixer\",\n 8: \"audio-bus\",\n 9: \"blend-container\",\n 10: \"music-segment\",\n 11: \"music-track\",\n 12: \"music-switch-container\",\n 13: \"music-playlist-container\",\n 14: \"attenuation\",\n 15: \"dialogue-event\",\n 16: \"motion-bus\",\n 17: \"motion-fx\",\n 18: \"effect\",\n 19: \"auxiliary-bus\",\n 20: \"lfo\",\n 21: \"envelope\",\n 22: \"audio-device\"\n});\n\n/**\n * Normalizes reader options against their supported defaults for the BNK format\n * reader.\n */\nexport function normalizeValues(base = DEFAULT_VALUES, options = {}, readerName = \"CjsBnkFormat\")\n{\n const values = { ...DEFAULT_VALUES, ...(base || {}), ...(options || {}) };\n values.inputType = values.inputType ? String(values.inputType).replace(/^\\./u, \"\").toLowerCase() : \"bnk\";\n values.emit = normalizeEmit(values.emit, readerName);\n return values;\n}\n\n/** Normalizes the requested output representation for the BNK format reader. */\nexport function normalizeEmit(emit, readerName)\n{\n if (emit === undefined || emit === null) return OUTPUT_RAW;\n if (emit === OUTPUT_JSON) return OUTPUT_BNK_JSON;\n if ([ OUTPUT_RAW, OUTPUT_BNK_JSON, OUTPUT_MEDIA ].includes(emit)) return emit;\n throw new TypeError(`${readerName}: unknown emit value ${JSON.stringify(emit)}`);\n}\n\n/** Returns a byte view over the supplied binary input for the BNK format reader. */\nexport function toBytes(input)\n{\n if (input instanceof Uint8Array) return input;\n if (input instanceof ArrayBuffer) return new Uint8Array(input);\n if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n throw new TypeError(\"Bnk input must be Uint8Array, ArrayBuffer, or DataView\");\n}\n\n/**\n * Test for a Wwise soundbank BKHD signature.\n *\n * @param {Uint8Array} bytes Candidate bytes.\n * @returns {boolean} True when the bank header chunk is present.\n */\nexport function isBNK(bytes)\n{\n return bytes.byteLength >= 8 && fourCc(bytes, 0) === \"BKHD\";\n}\n\n/**\n * Inspect Wwise soundbank bytes without copying media payloads.\n *\n * Walks the chunk sequence and decodes the bank header (BKHD), embedded media\n * index (DIDX/DATA), object hierarchy listing (HIRC), and referenced bank\n * names (STID). Unknown chunks are recorded, never rejected; a truncated\n * trailing chunk stops the walk and is flagged.\n *\n * Wwise soundbanks are written little-endian on all platforms EVE ships on;\n * this reader assumes little-endian data.\n *\n * @param {Uint8Array} bytes Soundbank bytes.\n * @returns {object} Soundbank metadata.\n */\nexport function inspectBNK(bytes)\n{\n const info = {\n sourceFormat: \"bnk\",\n bankVersion: 0,\n bankId: 0,\n languageId: 0,\n media: [],\n hirc: [],\n names: [],\n chunks: []\n };\n\n let dataChunkOffset = 0;\n let dataChunkSize = 0;\n let mediaIndex = [];\n let offset = 0;\n\n while (offset + 8 <= bytes.byteLength)\n {\n const id = fourCc(bytes, offset);\n const size = readU32(bytes, offset + 4);\n const dataOffset = offset + 8;\n if (dataOffset + size > bytes.byteLength)\n {\n info.chunks.push({ id, offset, dataOffset, size, truncated: true });\n break;\n }\n info.chunks.push({ id, offset, dataOffset, size });\n\n if (id === \"BKHD\" && size >= 12)\n {\n info.bankVersion = readU32(bytes, dataOffset);\n info.bankId = readU32(bytes, dataOffset + 4);\n info.languageId = readU32(bytes, dataOffset + 8);\n }\n if (id === \"DIDX\")\n {\n mediaIndex = readMediaIndex(bytes, dataOffset, size);\n }\n if (id === \"DATA\")\n {\n dataChunkOffset = dataOffset;\n dataChunkSize = size;\n }\n if (id === \"HIRC\")\n {\n info.hirc = readHircListing(\n bytes,\n dataOffset,\n size,\n info.bankVersion,\n );\n }\n if (id === \"STID\")\n {\n info.names = readNameTable(bytes, dataOffset, size);\n }\n\n offset = dataOffset + size;\n }\n\n info.media = mediaIndex.map((entry) =>\n {\n const absoluteOffset = dataChunkOffset + entry.offset;\n const available = dataChunkOffset > 0 &&\n entry.offset + entry.length <= dataChunkSize &&\n absoluteOffset + entry.length <= bytes.byteLength;\n return {\n id: entry.id,\n offset: entry.offset,\n absoluteOffset: dataChunkOffset > 0 ? absoluteOffset : 0,\n length: entry.length,\n available\n };\n });\n\n info.mediaCount = info.media.length;\n info.hircCount = info.hirc.length;\n return info;\n}\n\nfunction readMediaIndex(bytes, dataOffset, size)\n{\n const entries = [];\n const count = Math.floor(size / 12);\n for (let i = 0; i < count; i++)\n {\n const entryOffset = dataOffset + i * 12;\n entries.push({\n id: readU32(bytes, entryOffset),\n offset: readU32(bytes, entryOffset + 4),\n length: readU32(bytes, entryOffset + 8)\n });\n }\n return entries;\n}\n\nfunction readHircListing(bytes, dataOffset, size, bankVersion)\n{\n const entries = [];\n if (size < 4) return entries;\n const count = readU32(bytes, dataOffset);\n const end = dataOffset + size;\n let offset = dataOffset + 4;\n\n for (let i = 0; i < count; i++)\n {\n if (offset + 9 > end) break;\n const type = bytes[offset];\n const entrySize = readU32(bytes, offset + 1);\n const payloadOffset = offset + 5;\n if (entrySize < 4 || payloadOffset + entrySize > end) break;\n const entry = {\n type,\n typeName: HIRC_TYPE_NAMES[type] || `hirc-type-${type}`,\n id: readU32(bytes, payloadOffset),\n offset: payloadOffset,\n size: entrySize,\n // View over the object body AFTER the leading u32 id; not a copy.\n payload: bytes.subarray(payloadOffset + 4, payloadOffset + entrySize)\n };\n decodeHircFields(entry, bankVersion);\n entries.push(entry);\n offset = payloadOffset + entrySize;\n }\n\n return entries;\n}\n\n/**\n * Decode the version-stable typed fields of common HIRC object types in\n * place. Field layouts verified by hexdump against EVE soundbanks (bank\n * generator version 150 / Wwise 2022.1); every read is bounds-checked, and a\n * body too short for its type's layout simply keeps the raw payload only.\n *\n * - event (4): version >122 uses Wwise's MSB-first base-128 action count;\n * older banks use `u8 actionCount`; both are followed by u32 action ids.\n * - event-action (3): `u16 actionType` (high byte = family: 0x04 play,\n * 0x01 stop, 0x02 pause, 0x03 resume) + `u32 targetId`.\n * - sound (2): `u32 pluginId, u8 streamType, u32 sourceId,\n * u32 inMemoryMediaSize` (streamType 0 = bank data, 1 = streaming\n * prefetch, 2 = streamed). Only plugin type 1 is codec-backed WEM media.\n * - music-track (11): `u8 flags, u32 sourceCount`, then per source the same\n * plugin/stream/source/size quad as sound -> `sources`.\n *\n * Deeper structures (container children, positioning, RTPC curves) remain\n * undecoded; consumers interpret `payload` themselves.\n */\nfunction decodeHircFields(entry, bankVersion)\n{\n const body = entry.payload;\n if (entry.type === 4 && body.byteLength >= 1)\n {\n const actionIds = [];\n const decoded = bankVersion > 122\n ? readWwiseVar(body, 0)\n : { value: body[0], nextOffset: 1 };\n const actionCount = decoded?.value ?? 0;\n const actionOffset = decoded?.nextOffset ?? body.byteLength;\n\n for (let i = 0;\n i < actionCount\n && actionOffset + i * 4 + 4 <= body.byteLength;\n i++)\n {\n actionIds.push(readU32(body, actionOffset + i * 4));\n }\n entry.actionIds = actionIds;\n }\n else if (entry.type === 3 && body.byteLength >= 6)\n {\n entry.actionType = body[0] | (body[1] << 8);\n entry.targetId = readU32(body, 2);\n }\n else if (entry.type === 2 && body.byteLength >= 13)\n {\n entry.pluginId = readU32(body, 0);\n entry.pluginType = entry.pluginId & 0x0f;\n entry.streamType = body[4];\n entry.sourceId = readU32(body, 5);\n entry.inMemoryMediaSize = readU32(body, 9);\n }\n else if (entry.type === 11 && body.byteLength >= 5)\n {\n const sources = [];\n const sourceCount = readU32(body, 1);\n for (let i = 0; i < sourceCount; i++)\n {\n const at = 5 + i * 14;\n if (at + 13 > body.byteLength) break;\n sources.push({\n pluginId: readU32(body, at),\n pluginType: readU32(body, at) & 0x0f,\n streamType: body[at + 4],\n sourceId: readU32(body, at + 5),\n inMemoryMediaSize: readU32(body, at + 9)\n });\n }\n entry.sources = sources;\n }\n}\n\n/**\n * Reads Wwise's MSB-first base-128 unsigned integer.\n *\n * @returns {{value:number,nextOffset:number}|null} Decoded value and next\n * offset, or null for truncated, overflowed, or non-canonical input.\n */\nexport function readWwiseVar(bytes, offset = 0)\n{\n let at = Number(offset);\n let value = 0;\n let count = 0;\n\n if (!Number.isSafeInteger(at) || at < 0)\n {\n return null;\n }\n\n while (at < bytes.byteLength && count < 5)\n {\n const byte = bytes[at++];\n\n if (count === 0 && byte === 0x80)\n {\n return null;\n }\n if (value > 0x01ffffff)\n {\n return null;\n }\n\n value = value * 128 + (byte & 0x7f);\n count++;\n\n if ((byte & 0x80) === 0)\n {\n return value <= 0xffffffff\n ? { value: value >>> 0, nextOffset: at }\n : null;\n }\n }\n\n return null;\n}\n\nfunction readNameTable(bytes, dataOffset, size)\n{\n const names = [];\n if (size < 8) return names;\n const count = readU32(bytes, dataOffset + 4);\n const end = dataOffset + size;\n let offset = dataOffset + 8;\n\n for (let i = 0; i < count; i++)\n {\n if (offset + 5 > end) break;\n const bankId = readU32(bytes, offset);\n const length = bytes[offset + 4];\n if (offset + 5 + length > end) break;\n names.push({\n bankId,\n name: asciiString(bytes, offset + 5, length)\n });\n offset += 5 + length;\n }\n\n return names;\n}\n\n/** Inspects input using normalized format options for the BNK format reader. */\nexport function inspectWithValues(input, values = DEFAULT_VALUES)\n{\n const bytes = toBytes(input);\n if (!isBNK(bytes))\n {\n throw new TypeError(\"CjsBnkFormat: expected a Wwise soundbank starting with a BKHD chunk\");\n }\n return {\n payloadType: \"audio\",\n mediaTypes: [ \"audio\" ],\n byteLength: bytes.byteLength,\n source: values.source || \"buffer\",\n ...inspectBNK(bytes)\n };\n}\n\n/**\n * Extract embedded media payloads as views over the soundbank bytes.\n *\n * Returned `bytes` are subarray views, not copies; callers that outlive the\n * source buffer should copy them.\n *\n * @param {Uint8Array} bytes Soundbank bytes.\n * @param {object} metadata Inspection result for those bytes.\n * @param {number} [mediaId] Optional single media id filter.\n * @returns {Array<object>} Extracted media items.\n */\nexport function extractMedia(bytes, metadata, mediaId)\n{\n const items = [];\n for (const entry of metadata.media)\n {\n if (mediaId !== undefined && entry.id !== mediaId) continue;\n if (!entry.available) continue;\n const payload = bytes.subarray(entry.absoluteOffset, entry.absoluteOffset + entry.length);\n items.push({\n id: entry.id,\n length: entry.length,\n isWem: payload.length >= 12 &&\n (fourCc(payload, 0) === \"RIFF\" || fourCc(payload, 0) === \"RIFX\") &&\n fourCc(payload, 8) === \"WAVE\",\n bytes: payload\n });\n }\n return items;\n}\n\n/**\n * Reports whether input is supported under normalized format options for the BNK\n * format reader.\n */\nexport function isSupportedWithValues(input, values = DEFAULT_VALUES)\n{\n try\n {\n const metadata = inspectWithValues(input, values);\n const extractable = metadata.media.some((entry) => entry.available);\n return {\n format: \"bnk\",\n source: values.source || \"buffer\",\n supported: \"partial\",\n confidence: 1,\n preferred: extractable ? OUTPUT_MEDIA : \"raw\",\n reason: extractable\n ? \"Soundbank recognized; embedded media can be extracted undecoded.\"\n : \"Soundbank recognized; it carries no extractable embedded media.\",\n metadata,\n variants: [\n {\n kind: \"raw\",\n payloadType: \"raw\",\n codec: \"wwise-soundbank\",\n mimeType: \"application/octet-stream\",\n supported: true,\n containerOnly: true,\n isDecoded: false,\n pcmDecodeSupported: false\n },\n {\n kind: OUTPUT_MEDIA,\n payloadType: OUTPUT_MEDIA,\n codec: \"wem\",\n supported: extractable,\n containerOnly: true,\n isDecoded: false,\n reason: extractable ? \"\" : \"No DIDX/DATA media entries are present.\"\n }\n ],\n warnings: [],\n errors: []\n };\n }\n catch (error)\n {\n return {\n format: \"bnk\",\n source: values.source || \"buffer\",\n supported: \"none\",\n confidence: 0,\n preferred: \"\",\n reason: error.message,\n metadata: null,\n variants: [],\n warnings: [],\n errors: [ error.message ]\n };\n }\n}\n\n/** Reads input using normalized format options for the BNK format reader. */\nexport function readWithValues(input, values = DEFAULT_VALUES)\n{\n const bytes = toBytes(input);\n const metadata = inspectWithValues(bytes, values);\n if (values.emit === OUTPUT_BNK_JSON) return metadata;\n if (values.emit === OUTPUT_MEDIA)\n {\n return {\n payloadType: OUTPUT_MEDIA,\n sourceFormat: \"bnk\",\n containerOnly: true,\n isDecoded: false,\n metadata,\n items: extractMedia(bytes, metadata)\n };\n }\n return {\n payloadType: \"raw\",\n sourceFormat: \"bnk\",\n mimeType: \"application/octet-stream\",\n containerOnly: true,\n isDecoded: false,\n pcmDecodeSupported: false,\n metadata,\n bytes\n };\n}\n\n/** Converts a parsed payload into a JSON-safe value for the BNK format reader. */\nexport function toJsonValue(value)\n{\n if (value instanceof Uint8Array) return { byteLength: value.byteLength };\n if (Array.isArray(value)) return value.map(toJsonValue);\n if (value && typeof value === \"object\")\n {\n const output = {};\n for (const [ key, entry ] of Object.entries(value)) output[key] = toJsonValue(entry);\n return output;\n }\n return value;\n}\n\nfunction asciiString(bytes, offset, length)\n{\n let value = \"\";\n for (let i = 0; i < length; i++) value += String.fromCharCode(bytes[offset + i]);\n return value;\n}\n\nfunction fourCc(bytes, offset, length = 4)\n{\n let value = \"\";\n for (let i = 0; i < length; i++) value += String.fromCharCode(bytes[offset + i] || 0);\n return value;\n}\n\nfunction readU32(bytes, offset)\n{\n return (bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16) | (bytes[offset + 3] * 0x1000000)) >>> 0;\n}\n"],"names":["OUTPUT_RAW","OUTPUT_JSON","OUTPUT_BNK_JSON","OUTPUT_MEDIA","DEFAULT_VALUES","Object","freeze","emit","inputType","source","HIRC_TYPE_NAMES","normalizeValues","base","options","readerName","values","String","replace","toLowerCase","normalizeEmit","undefined","includes","TypeError","JSON","stringify","toBytes","input","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","isBNK","bytes","fourCc","inspectBNK","info","sourceFormat","bankVersion","bankId","languageId","media","hirc","names","chunks","dataChunkOffset","dataChunkSize","mediaIndex","offset","id","size","readU32","dataOffset","push","truncated","readMediaIndex","readHircListing","readNameTable","map","entry","absoluteOffset","available","length","mediaCount","hircCount","entries","count","Math","floor","i","entryOffset","end","type","entrySize","payloadOffset","typeName","payload","subarray","decodeHircFields","body","actionIds","decoded","readWwiseVar","value","nextOffset","actionCount","actionOffset","actionType","targetId","pluginId","pluginType","streamType","sourceId","inMemoryMediaSize","sources","sourceCount","at","Number","isSafeInteger","byte","name","asciiString","inspectWithValues","payloadType","mediaTypes","extractMedia","metadata","mediaId","items","isWem","isSupportedWithValues","extractable","some","format","supported","confidence","preferred","reason","variants","kind","codec","mimeType","containerOnly","isDecoded","pcmDecodeSupported","warnings","errors","error","message","readWithValues","toJsonValue","Array","isArray","output","key","fromCharCode"],"mappings":"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"}