[音频/多媒体] MPQ ADPCM + Huffman 音频解码缺失:支持 572 个音频成员并接入 Web Audio API #13

Closed
opened 2026-09-14 07:01:34 +00:00 by troytt · 1 comment
Owner

Parent Issue: #7 ([Code Review] 整体代码质量、架构缺陷与技术债务全景审查报告)

模块位置

src/mpq/decompress.ts, src/mpq/archive.ts, src/audio/ (待建)

问题背景与现象

  • MPQ 归档中包含约 572 个采用 ADPCM + Huffman 双重压缩的音频成员(压缩掩码 0x41 和 0x81)。
  • src/mpq/decompress.ts 目前未实现 ADPCM + Huffman 解码器,相关资源读取时会被拒绝或跳过。

造成的影响

  1. 整个游戏引擎当前处于完全无声状态(无脚步声、武器挥砍受击声、NPC 语音、环境氛围音效与背景音乐)。

解决建议

  1. 在 src/mpq/decompress.ts 中实现 IMA ADPCM 与 Huffman 树解码逻辑;
  2. 验证 WAV 格式波形提取与解码正确性(添加 verify-audio.ts 校验脚本);
  3. 搭建基于浏览器原生 Web Audio API 的简易音频管理器,支持音效播放(SFX)与背景音乐循环(BGM)。
> **Parent Issue**: #7 ([Code Review] 整体代码质量、架构缺陷与技术债务全景审查报告) ## 模块位置 `src/mpq/decompress.ts`, `src/mpq/archive.ts`, `src/audio/` (待建) ## 问题背景与现象 - MPQ 归档中包含约 572 个采用 ADPCM + Huffman 双重压缩的音频成员(压缩掩码 `0x41` 和 `0x81`)。 - `src/mpq/decompress.ts` 目前未实现 ADPCM + Huffman 解码器,相关资源读取时会被拒绝或跳过。 ## 造成的影响 1. 整个游戏引擎当前处于完全无声状态(无脚步声、武器挥砍受击声、NPC 语音、环境氛围音效与背景音乐)。 ## 解决建议 1. 在 `src/mpq/decompress.ts` 中实现 IMA ADPCM 与 Huffman 树解码逻辑; 2. 验证 WAV 格式波形提取与解码正确性(添加 `verify-audio.ts` 校验脚本); 3. 搭建基于浏览器原生 Web Audio API 的简易音频管理器,支持音效播放(SFX)与背景音乐循环(BGM)。
Author
Owner

已修复 — feat(mpq): 实现 ADPCM 与 Huffman 音频解码并接入 Web Audio (4d47a56)

  • 新增 src/mpq/huffman.ts + huffman-tables.ts(9 张表,逐张与 StormLib 对拍)、adpcm.ts + adpcm-tables.ts,并接入 decompress.ts 与 src/audio/manager.ts。
  • 修正了两处此前搞反的关键语义:0x100 是 END OF STREAM,0x101 是 NYT/字面量转义。
  • 压缩掩码 0x41 / 0x81 的解压顺序为 先 Huffman (0x01),再 ADPCM(0x40 单声道 / 0x80 立体声)。
  • 完整解压后的成员本身就是一个合法 RIFF/WAVE,可直接喂给 decodeAudioData。

验证: 本地编译 StormLib 做差分对拍harness,逐字节一致;并通过我方独立选定的变异测试。

### 已修复 — `feat(mpq): 实现 ADPCM 与 Huffman 音频解码并接入 Web Audio` (4d47a56) - 新增 `src/mpq/huffman.ts` + `huffman-tables.ts`(9 张表,逐张与 StormLib 对拍)、`adpcm.ts` + `adpcm-tables.ts`,并接入 `decompress.ts` 与 `src/audio/manager.ts`。 - 修正了两处此前搞反的关键语义:`0x100` 是 **END OF STREAM**,`0x101` 是 **NYT/字面量转义**。 - 压缩掩码 `0x41` / `0x81` 的解压顺序为 **先 Huffman (`0x01`),再 ADPCM**(`0x40` 单声道 / `0x80` 立体声)。 - 完整解压后的成员本身就是一个合法 RIFF/WAVE,可直接喂给 `decodeAudioData`。 **验证:** 本地编译 StormLib 做差分对拍harness,逐字节一致;并通过我方独立选定的变异测试。
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Reference: troytt/diablo2-web#13
No description provided.