@modplayjs/stream-audio 0.0.0-stage → 0.2.1

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.
package/README.md CHANGED
@@ -1,3 +1,40 @@
1
- # Temporary Holding Version
1
+ # @modplayjs/stream-audio
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Streamed-audio decode** for file-based playback (non-tracked formats):
4
+ whole-file WAV / MP3 / OGG decoding into PCM sources with the same
5
+ pull-playback contract as the player core, so `@modplayjs/out-webaudio`
6
+ drives them unchanged.
7
+
8
+ - **WAV**: PCM (16/8-bit) + IMA ADPCM (tag 0x11)
9
+ - **MP3**: via the minimp3 Layer-3 port from `@modplayjs/fmt-mo3`
10
+ - **OGG**: via the `@modplayjs/stb-vorbis` port
11
+ - Format sniffing includes tracker-magic fallback (a `.mod` mis-named
12
+ `.wav` is detected as a module, not decoded as RIFF)
13
+
14
+ 74 of 76 test-corpus streamed files decode (the remaining two use
15
+ Creative/G.723 ADPCM codecs).
16
+
17
+ ## Install
18
+
19
+ ```sh
20
+ npm install @modplayjs/stream-audio
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ ```ts
26
+ import { detectStreamedFormat, createStreamedSource } from '@modplayjs/stream-audio';
27
+
28
+ const fmt = detectStreamedFormat(bytes, filename);
29
+ if (fmt) {
30
+ const src = createStreamedSource(bytes, fmt, deviceRate);
31
+ // src exposes playBuffer(out, size, loop) — same pull semantics as CorePlayer
32
+ }
33
+ ```
34
+
35
+ ## Also exports
36
+
37
+ `decodeWav`, `parseWavHeader`, `decodeImaAdpcmWav`, `decodeMp3File`,
38
+ `decodeOggFile`, `type StreamedSource`, `type StreamedFormat`.
39
+
40
+ Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause.
@@ -0,0 +1,3 @@
1
+ /** Decode an IMA ADPCM WAV (parseWavHeader result) to interleaved float. */
2
+ export declare function decodeImaAdpcmWav(b: Uint8Array, channels: number, dataOffset: number, dataSize: number, blockAlign: number): Float32Array | null;
3
+ //# sourceMappingURL=adpcm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adpcm.d.ts","sourceRoot":"","sources":["../src/adpcm.ts"],"names":[],"mappings":"AAkEA,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,UAAU,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,YAAY,GAAG,IAAI,CA0BrB"}
package/dist/adpcm.js ADDED
@@ -0,0 +1,80 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // IMA ADPCM WAV decode (WAVE_FORMAT_IMA_ADPCM / DVI, format tag 0x0011).
3
+ // Standard IMA algorithm: step table + 4-bit nibble → predictor.
4
+ const IMA_STEP_TABLE = [
5
+ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
6
+ 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
7
+ 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
8
+ 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
9
+ 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
10
+ 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
11
+ 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
12
+ 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
13
+ 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767,
14
+ ];
15
+ const IMA_INDEX_TABLE = [
16
+ -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8,
17
+ ];
18
+ /** Decode one mono block of IMA ADPCM nibbles into `out` (interleaved at
19
+ * channel `chn` of `channels`). Returns frames written. */
20
+ function decodeImaBlock(b, blockOff, blockSize, channels, chn, out, outOff) {
21
+ // Per-channel block header: int16 predictor, u8 step index, u8 reserved.
22
+ const hdr = blockOff + chn * 4;
23
+ let predictor = b[hdr] | (b[hdr + 1] << 8);
24
+ predictor = (predictor << 16) >> 16; // int16
25
+ let stepIndex = b[hdr + 2];
26
+ if (stepIndex > 88)
27
+ stepIndex = 88;
28
+ const dataOff = blockOff + channels * 4;
29
+ const dataEnd = blockOff + blockSize;
30
+ const framesPerBlock = (blockSize - channels * 4) * 2 / channels;
31
+ let frames = 0;
32
+ for (let i = 0; i < framesPerBlock && dataOff + (i >> 1) < dataEnd; i++) {
33
+ const byteIdx = dataOff + Math.floor((i / channels)) * channels + chn;
34
+ const byte = b[byteIdx] ?? 0;
35
+ const nibble = i % 2 === 0 ? byte & 0x0f : (byte >> 4) & 0x0f;
36
+ let step = IMA_STEP_TABLE[stepIndex];
37
+ let diff = step >> 3;
38
+ if (nibble & 4)
39
+ diff += step;
40
+ if (nibble & 2)
41
+ diff += step >> 1;
42
+ if (nibble & 1)
43
+ diff += step >> 2;
44
+ if (nibble & 8)
45
+ diff = -diff;
46
+ predictor += diff;
47
+ predictor = Math.max(-32768, Math.min(32767, predictor));
48
+ out[outOff + i * channels] = predictor / 32768;
49
+ stepIndex += IMA_INDEX_TABLE[nibble];
50
+ stepIndex = Math.max(0, Math.min(88, stepIndex));
51
+ frames++;
52
+ }
53
+ return frames;
54
+ }
55
+ /** Decode an IMA ADPCM WAV (parseWavHeader result) to interleaved float. */
56
+ export function decodeImaAdpcmWav(b, channels, dataOffset, dataSize, blockAlign) {
57
+ if (blockAlign < channels * 4)
58
+ return null;
59
+ const avail = Math.min(dataSize, b.length - dataOffset);
60
+ const numBlocks = Math.floor(avail / blockAlign);
61
+ if (numBlocks < 1)
62
+ return null;
63
+ // Frames per block from the spec: (blockAlign - channels*4) * 2 / channels
64
+ // + 1 (the predictor sample in the header is NOT counted by most writers;
65
+ // Windows writes framesPerBlock = (blockSize/channels - 4) * 2 + 1 per
66
+ // channel — we produce the same count from the nibble data).
67
+ const framesPerBlock = Math.floor(((blockAlign - channels * 4) * 2) / channels) + 1;
68
+ const out = new Float32Array(numBlocks * framesPerBlock * channels);
69
+ let written = 0;
70
+ for (let blk = 0; blk < numBlocks; blk++) {
71
+ const blockOff = dataOffset + blk * blockAlign;
72
+ const blockFrames = decodeImaBlock(b, blockOff, blockAlign, channels, 0, out, written * channels);
73
+ if (channels === 2) {
74
+ decodeImaBlock(b, blockOff, blockAlign, channels, 1, out, written * channels);
75
+ }
76
+ written += blockFrames;
77
+ }
78
+ return out.subarray(0, written * channels);
79
+ }
80
+ //# sourceMappingURL=adpcm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adpcm.js","sourceRoot":"","sources":["../src/adpcm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { decodeWav, parseWavHeader } from './wav.js';
2
+ export { decodeImaAdpcmWav } from './adpcm.js';
3
+ export { decodeMp3File } from './mp3.js';
4
+ export { decodeOggFile } from './ogg.js';
5
+ export { createStreamedSource, detectStreamedFormat, type StreamedSource, type StreamedFormat } from './source.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // @modplayjs/stream-audio — MP3 / WAV / OGG streamed-audio decode entry.
3
+ export { decodeWav, parseWavHeader } from './wav.js';
4
+ export { decodeImaAdpcmWav } from './adpcm.js';
5
+ export { decodeMp3File } from './mp3.js';
6
+ export { decodeOggFile } from './ogg.js';
7
+ export { createStreamedSource, detectStreamedFormat } from './source.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,yEAAyE;AACzE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAA4C,MAAM,aAAa,CAAC"}
package/dist/mp3.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare function decodeMp3File(b: Uint8Array): {
2
+ pcm: Int16Array;
3
+ channels: number;
4
+ sampleRate: number;
5
+ } | null;
6
+ //# sourceMappingURL=mp3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mp3.d.ts","sourceRoot":"","sources":["../src/mp3.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkC7G"}
package/dist/mp3.js ADDED
@@ -0,0 +1,51 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Whole-file MP3 decode via the minimp3 L3 port (from fmt-mo3).
3
+ import { mp3decInit, mp3decDecodeFrame } from '@modplayjs/fmt-mo3';
4
+ export function decodeMp3File(b) {
5
+ const dec = {
6
+ mdctOverlap: [new Float32Array(288), new Float32Array(288)],
7
+ qmfState: new Float32Array(960),
8
+ reserv: 0, freeFormatBytes: 0,
9
+ header: new Uint8Array(4), reservBuf: new Uint8Array(511),
10
+ };
11
+ mp3decInit(dec);
12
+ const pcm = new Int16Array(1152 * 2);
13
+ const info = { frameBytes: 0, channels: 0, hz: 0, layer: 0, bitrateKbps: 0 };
14
+ const chunks = [];
15
+ let pos = 0, total = 0, channels = 0, hz = 0;
16
+ let bytesLeft = b.length;
17
+ do {
18
+ const n = mp3decDecodeFrame(dec, b.subarray(pos), bytesLeft, pcm, info);
19
+ if (n < 0 || info.frameBytes < 0)
20
+ break;
21
+ if (n > 0 && info.frameBytes === 0)
22
+ break;
23
+ if (n === 0 && info.frameBytes === 0)
24
+ break;
25
+ if (info.frameBytes > 0) {
26
+ if (hz !== 0 && hz !== info.hz)
27
+ break;
28
+ if (channels !== 0 && channels !== info.channels)
29
+ break;
30
+ hz = info.hz;
31
+ channels = info.channels;
32
+ const advance = Math.min(Math.max(info.frameBytes, 0), bytesLeft);
33
+ pos += advance;
34
+ bytesLeft -= advance;
35
+ if (n > 0) {
36
+ chunks.push(pcm.slice(0, n * channels));
37
+ total += n * channels;
38
+ }
39
+ }
40
+ } while (bytesLeft > 0);
41
+ if (total === 0)
42
+ return null;
43
+ const all = new Int16Array(total);
44
+ let o = 0;
45
+ for (const c of chunks) {
46
+ all.set(c, o);
47
+ o += c.length;
48
+ }
49
+ return { pcm: all, channels: channels || 1, sampleRate: hz };
50
+ }
51
+ //# sourceMappingURL=mp3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mp3.js","sourceRoot":"","sources":["../src/mp3.ts"],"names":[],"mappings":"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"}
package/dist/ogg.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare function decodeOggFile(b: Uint8Array): {
2
+ pcm: Float32Array;
3
+ channels: number;
4
+ sampleRate: number;
5
+ } | null;
6
+ //# sourceMappingURL=ogg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ogg.d.ts","sourceRoot":"","sources":["../src/ogg.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA0B/G"}
package/dist/ogg.js ADDED
@@ -0,0 +1,38 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Whole-file Ogg Vorbis decode via the stb-vorbis port.
3
+ import { stbVorbisOpenMemory, stbVorbisGetFrameFloat } from '@modplayjs/stb-vorbis';
4
+ export function decodeOggFile(b) {
5
+ const err = { v: 0 };
6
+ const f = stbVorbisOpenMemory(b, err);
7
+ if (!f)
8
+ return null;
9
+ const chunks = [];
10
+ let total = 0;
11
+ const len = { v: 0 };
12
+ for (;;) {
13
+ const outputs = stbVorbisGetFrameFloat(f, len);
14
+ if (!outputs || len.v === 0)
15
+ break;
16
+ for (let i = 0; i < len.v * f.channels; ++i) {
17
+ // accumulate per-frame
18
+ }
19
+ const frame = new Float32Array(len.v * f.channels);
20
+ for (let ch = 0; ch < f.channels; ++ch) {
21
+ const src = outputs[ch];
22
+ for (let j = 0; j < len.v; ++j)
23
+ frame[j * f.channels + ch] = src[j];
24
+ }
25
+ chunks.push(frame);
26
+ total += frame.length;
27
+ }
28
+ if (total === 0)
29
+ return null;
30
+ const all = new Float32Array(total);
31
+ let o = 0;
32
+ for (const c of chunks) {
33
+ all.set(c, o);
34
+ o += c.length;
35
+ }
36
+ return { pcm: all, channels: f.channels, sampleRate: f.sampleRate };
37
+ }
38
+ //# sourceMappingURL=ogg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ogg.js","sourceRoot":"","sources":["../src/ogg.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,wDAAwD;AACxD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpF,MAAM,UAAU,aAAa,CAAC,CAAa;IACzC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACrB,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACrB,SAAS,CAAC;QACR,MAAM,OAAO,GAAG,sBAAsB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;YAAE,MAAM;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;YAC5C,uBAAuB;QACzB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QACvE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAAC,CAAC;IACzD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;AACtE,CAAC"}
@@ -0,0 +1,28 @@
1
+ export interface StreamedSource {
2
+ /** Interleaved stereo float pull, mirroring Core.playBuffer semantics:
3
+ * fills `out` (≤ size floats), returns the number of floats written
4
+ * (0 = end of stream). */
5
+ playBuffer(out: Float32Array, size: number, loop?: number): number;
6
+ /** Seek to a millisecond offset into the resampled stream. */
7
+ seek(ms: number): void;
8
+ readonly channels: number;
9
+ readonly sampleRate: number;
10
+ /**
11
+ * Length in milliseconds, or 0 when the file gave no usable header.
12
+ *
13
+ * Milliseconds, not seconds: every consumer is a UI that formats mm:ss, and
14
+ * the previous `duration` was seconds while callers treated it as ms - a
15
+ * three-minute file advertised itself as 180 ms.
16
+ */
17
+ readonly durationMs: number;
18
+ }
19
+ export type StreamedFormat = 'wav' | 'mp3' | 'ogg';
20
+ export declare function detectStreamedFormat(bytes: Uint8Array, name?: string): StreamedFormat | null;
21
+ /** Decode a streamed-audio file (WAV/MP3/OGG) into interleaved stereo. */
22
+ export declare function decodeStreamed(bytes: Uint8Array, format: StreamedFormat): {
23
+ pcm: Float32Array;
24
+ channels: number;
25
+ sampleRate: number;
26
+ } | null;
27
+ export declare function createStreamedSource(bytes: Uint8Array, format: StreamedFormat, outputRate: number): StreamedSource | null;
28
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B;;+BAE2B;IAC3B,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnE,8DAA8D;IAC9D,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEnD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAoB5F;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,GAAG;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoC5I;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAwDzH"}
package/dist/source.js ADDED
@@ -0,0 +1,143 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Streamed-audio playback shim: decodes a whole MP3/WAV/OGG file and
3
+ // exposes a Core-like playBuffer(out, size, loop) so out-webaudio can pull
4
+ // it exactly like a tracker module (interleaved stereo floats).
5
+ import { decodeWav } from './wav.js';
6
+ import { decodeMp3File } from './mp3.js';
7
+ import { decodeOggFile } from './ogg.js';
8
+ export function detectStreamedFormat(bytes, name) {
9
+ // Tracker modules misnamed .wav/.mp3 in keygen packs: sniff the module
10
+ // magics first (XM 'Extended Module: ', 31-sample MOD 'M.K.' at 1080,
11
+ // IT 'IMPM', S3M 'SCRM' at 0x1c44-ish, MO3).
12
+ if (bytes.length > 38 && bytes[0] === 0x45 && bytes[1] === 0x78 && bytes[2] === 0x74 && bytes[3] === 0x65)
13
+ return null; // 'Exte' = XM
14
+ if (bytes.length > 1084) {
15
+ const mk = String.fromCharCode(bytes[1080], bytes[1081], bytes[1082], bytes[1083]);
16
+ if (mk === 'M.K.' || mk === 'M!K!' || mk === '4CHN' || mk === '6CHN' || mk === '8CHN' || mk === 'FLT4' || mk === 'FLT8')
17
+ return null; // MOD family
18
+ }
19
+ if (bytes.length > 4 && bytes[0] === 0x49 && bytes[1] === 0x4d && bytes[2] === 0x50 && bytes[3] === 0x4d)
20
+ return null; // IMPM = IT
21
+ if (bytes.length > 8 && bytes[0] === 0x4d && bytes[1] === 0x4f && bytes[2] === 0x33)
22
+ return null; // MO3
23
+ if (bytes.length > 12 && bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46)
24
+ return 'wav';
25
+ if (bytes.length > 4 && bytes[0] === 0x4f && bytes[1] === 0x67 && bytes[2] === 0x67 && bytes[3] === 0x53)
26
+ return 'ogg';
27
+ if (bytes.length > 2 && bytes[0] === 0xff && (bytes[1] & 0xe0) === 0xe0)
28
+ return 'mp3';
29
+ if (bytes.length > 3 && bytes[0] === 0x49 && bytes[1] === 0x44 && bytes[2] === 0x33)
30
+ return 'mp3'; // ID3
31
+ if (name) {
32
+ const ext = name.slice(name.lastIndexOf('.') + 1).toLowerCase();
33
+ if (ext === 'wav' || ext === 'mp3' || ext === 'ogg')
34
+ return ext;
35
+ }
36
+ return null;
37
+ }
38
+ /** Decode a streamed-audio file (WAV/MP3/OGG) into interleaved stereo. */
39
+ export function decodeStreamed(bytes, format) {
40
+ if (format === 'wav') {
41
+ const r = decodeWav(bytes);
42
+ if (!r)
43
+ return null;
44
+ return { pcm: r.pcm, channels: r.channels, sampleRate: r.sampleRate };
45
+ }
46
+ if (format === 'mp3') {
47
+ const r = decodeMp3File(bytes);
48
+ if (!r)
49
+ return null;
50
+ // mono → stereo interleave (output path is stereo)
51
+ if (r.channels === 1) {
52
+ const frames = r.pcm.length;
53
+ const st = new Float32Array(frames * 2);
54
+ for (let i = 0; i < frames; i++) {
55
+ const v = r.pcm[i] / 32768;
56
+ st[i * 2] = v;
57
+ st[i * 2 + 1] = v;
58
+ }
59
+ return { pcm: st, channels: 2, sampleRate: r.sampleRate };
60
+ }
61
+ const st = new Float32Array(r.pcm.length);
62
+ for (let i = 0; i < r.pcm.length; i++)
63
+ st[i] = r.pcm[i] / 32768;
64
+ return { pcm: st, channels: r.channels, sampleRate: r.sampleRate };
65
+ }
66
+ // ogg
67
+ const r = decodeOggFile(bytes);
68
+ if (!r)
69
+ return null;
70
+ if (r.channels === 2)
71
+ return r;
72
+ const frames = r.pcm.length / r.channels;
73
+ const st = new Float32Array(frames * 2);
74
+ for (let i = 0; i < frames; i++) {
75
+ const v = r.pcm[i * r.channels];
76
+ st[i * 2] = v;
77
+ st[i * 2 + 1] = r.channels > 1 ? r.pcm[i * r.channels + 1] : v;
78
+ }
79
+ return { pcm: st, channels: 2, sampleRate: r.sampleRate };
80
+ }
81
+ export function createStreamedSource(bytes, format, outputRate) {
82
+ const decoded = decodeStreamed(bytes, format);
83
+ if (!decoded)
84
+ return null;
85
+ // Resample to the output rate if needed (linear).
86
+ let pcm = decoded.pcm;
87
+ const inRate = decoded.sampleRate;
88
+ if (inRate !== outputRate) {
89
+ const ratio = outputRate / inRate;
90
+ const frames = decoded.pcm.length / decoded.channels;
91
+ const outFrames = Math.floor(frames * ratio);
92
+ const resampled = new Float32Array(outFrames * decoded.channels);
93
+ for (let i = 0; i < outFrames; i++) {
94
+ const src = i / ratio;
95
+ const i0 = Math.floor(src);
96
+ const frac = src - i0;
97
+ const i1 = Math.min(i0 + 1, frames - 1);
98
+ for (let c = 0; c < decoded.channels; c++) {
99
+ resampled[i * decoded.channels + c] =
100
+ decoded.pcm[i0 * decoded.channels + c] * (1 - frac) +
101
+ decoded.pcm[i1 * decoded.channels + c] * frac;
102
+ }
103
+ }
104
+ pcm = resampled;
105
+ }
106
+ const total = pcm.length;
107
+ let playPos = 0;
108
+ const playBuffer = (out, size, loop) => {
109
+ const framesWanted = Math.floor(size / 2);
110
+ const remaining = Math.floor((total - playPos) / 2);
111
+ const frames = Math.min(framesWanted, remaining);
112
+ if (frames <= 0) {
113
+ if (loop) {
114
+ playPos = 0;
115
+ return playBuffer(out, size, loop);
116
+ }
117
+ return 0;
118
+ }
119
+ for (let i = 0; i < frames * 2; i++)
120
+ out[i] = pcm[playPos + i];
121
+ playPos += frames * 2;
122
+ for (let i = frames * 2; i < size; i++)
123
+ out[i] = 0;
124
+ return frames * 2;
125
+ };
126
+ const seek = (ms) => {
127
+ // ms = the milliseconds into the resampled stream: the playPos = the
128
+ // interleaved float offset = ms × outputRate × channels / 1000.
129
+ playPos = Math.floor((ms * outputRate * decoded.channels) / 1000) * 2;
130
+ if (playPos < 0)
131
+ playPos = 0;
132
+ if (playPos > total)
133
+ playPos = total;
134
+ };
135
+ return {
136
+ channels: decoded.channels,
137
+ sampleRate: outputRate,
138
+ durationMs: Math.round((total / (decoded.channels * outputRate)) * 1000),
139
+ playBuffer,
140
+ seek,
141
+ };
142
+ }
143
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"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"}
package/dist/wav.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export interface WavInfo {
2
+ channels: number;
3
+ sampleRate: number;
4
+ frames: number;
5
+ dataOffset: number;
6
+ bitsPerSample: number;
7
+ /** WAVE format tag (1 = PCM, 3 = IEEE float). */
8
+ formatTag: number;
9
+ }
10
+ export declare function parseWavHeader(b: Uint8Array): WavInfo | null;
11
+ /** Decode the whole WAV to interleaved float [-1,1]. */
12
+ export declare function decodeWav(b: Uint8Array): {
13
+ pcm: Float32Array;
14
+ channels: number;
15
+ sampleRate: number;
16
+ } | null;
17
+ //# sourceMappingURL=wav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wav.d.ts","sourceRoot":"","sources":["../src/wav.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,IAAI,CA+B5D;AAED,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyC3G"}
package/dist/wav.js ADDED
@@ -0,0 +1,94 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Minimal RIFF/WAVE PCM decoder for streamed playback.
3
+ import { decodeImaAdpcmWav } from './adpcm.js';
4
+ export function parseWavHeader(b) {
5
+ if (b.length < 44)
6
+ return null;
7
+ if (b[0] !== 0x52 || b[1] !== 0x49 || b[2] !== 0x46 || b[3] !== 0x46)
8
+ return null; // RIFF
9
+ if (b[8] !== 0x57 || b[9] !== 0x41 || b[10] !== 0x56 || b[11] !== 0x45)
10
+ return null; // WAVE
11
+ let pos = 12;
12
+ let channels = 0, sampleRate = 0, bitsPerSample = 0, dataOffset = -1, dataSize = 0;
13
+ let formatTag = 1;
14
+ const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);
15
+ while (pos + 8 <= b.length) {
16
+ const id = String.fromCharCode(b[pos], b[pos + 1], b[pos + 2], b[pos + 3]);
17
+ const size = dv.getUint32(pos + 4, true);
18
+ if (id === 'fmt ' && pos + 16 + 8 <= b.length) {
19
+ formatTag = dv.getUint16(pos + 8, true);
20
+ channels = dv.getUint16(pos + 10, true);
21
+ sampleRate = dv.getUint32(pos + 12, true);
22
+ bitsPerSample = dv.getUint16(pos + 22, true);
23
+ }
24
+ else if (id === 'data') {
25
+ dataOffset = pos + 8;
26
+ dataSize = size;
27
+ }
28
+ pos += 8 + size + (size & 1);
29
+ }
30
+ if (dataOffset < 0 || channels === 0 || sampleRate === 0)
31
+ return null;
32
+ const isImaAdpcm = formatTag === 0x11 || (formatTag === 0xfffe && bitsPerSample === 4);
33
+ if (!isImaAdpcm && bitsPerSample !== 8 && bitsPerSample !== 16 && bitsPerSample !== 24 && bitsPerSample !== 32)
34
+ return null;
35
+ const bytesPerFrame = channels * (bitsPerSample / 8);
36
+ if (bytesPerFrame === 0)
37
+ return null;
38
+ const avail = Math.max(0, Math.min(dataSize, b.length - dataOffset));
39
+ const frames = Math.floor(avail / bytesPerFrame);
40
+ if (!isImaAdpcm && frames <= 0)
41
+ return null;
42
+ return { channels, sampleRate, frames, dataOffset, bitsPerSample, formatTag };
43
+ }
44
+ /** Decode the whole WAV to interleaved float [-1,1]. */
45
+ export function decodeWav(b) {
46
+ const info = parseWavHeader(b);
47
+ if (!info)
48
+ return null;
49
+ if (info.formatTag === 0x11 || (info.formatTag === 0xfffe && info.bitsPerSample === 4)) {
50
+ // IMA ADPCM — needs the blockAlign from the fmt chunk; re-parse.
51
+ const dv0 = new DataView(b.buffer, b.byteOffset, b.byteLength);
52
+ let p0 = 12;
53
+ let blockAlign = 0;
54
+ while (p0 + 8 <= b.length) {
55
+ const id = String.fromCharCode(b[p0], b[p0 + 1], b[p0 + 2], b[p0 + 3]);
56
+ const size = dv0.getUint32(p0 + 4, true);
57
+ if (id === 'fmt ')
58
+ blockAlign = dv0.getUint16(p0 + 20, true);
59
+ if (id === 'data')
60
+ break;
61
+ p0 += 8 + size + (size & 1);
62
+ }
63
+ const pcm = decodeImaAdpcmWav(b, info.channels, info.dataOffset, info.frames * info.channels, blockAlign);
64
+ if (!pcm)
65
+ return null;
66
+ return { pcm, channels: info.channels, sampleRate: info.sampleRate };
67
+ }
68
+ const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);
69
+ const bytesPerSample = info.bitsPerSample / 8;
70
+ const frames = info.frames;
71
+ const pcm = new Float32Array(frames * info.channels);
72
+ let o = 0;
73
+ for (let i = 0; i < frames; i++) {
74
+ for (let c = 0; c < info.channels; c++) {
75
+ const off = info.dataOffset + (i * info.channels + c) * bytesPerSample;
76
+ let v = 0;
77
+ if (info.bitsPerSample === 16)
78
+ v = dv.getInt16(off, true) / 32768;
79
+ else if (info.bitsPerSample === 8)
80
+ v = (b[off] - 128) / 128;
81
+ else if (info.bitsPerSample === 24) {
82
+ const x = b[off] | (b[off + 1] << 8) | (b[off + 2] << 16);
83
+ v = ((x << 8) >> 8) / 8388608;
84
+ }
85
+ else if (info.bitsPerSample === 32) {
86
+ // WAVE_FORMAT_IEEE_FLOAT (format tag 3) stores float samples.
87
+ v = info.formatTag === 3 ? dv.getFloat32(off, true) : dv.getInt32(off, true) / 2147483648;
88
+ }
89
+ pcm[o++] = v;
90
+ }
91
+ }
92
+ return { pcm, channels: info.channels, sampleRate: info.sampleRate };
93
+ }
94
+ //# sourceMappingURL=wav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wav.js","sourceRoot":"","sources":["../src/wav.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,45 @@
1
1
  {
2
2
  "name": "@modplayjs/stream-audio",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.1",
4
+ "description": "MP3 / WAV / OGG streamed-audio decode for modplayjs (minimp3 + stb_vorbis ports).",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.build.json",
19
+ "typecheck": "tsc -p tsconfig.json --noEmit"
20
+ },
21
+ "dependencies": {
22
+ "@modplayjs/fmt-mo3": "^0.2.1",
23
+ "@modplayjs/stb-vorbis": "^0.2.1"
24
+ },
25
+ "keywords": [
26
+ "mp3",
27
+ "wav",
28
+ "ogg",
29
+ "vorbis",
30
+ "audio"
31
+ ],
32
+ "sideEffects": false,
33
+ "engines": {
34
+ "node": ">=18"
35
+ },
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/modplayjs/modplayjs.git",
39
+ "directory": "packages/stream-audio"
40
+ },
41
+ "license": "BSD-3-Clause",
42
+ "publishConfig": {
43
+ "registry": "https://npm.pkg.github.com"
44
+ }
45
+ }