Skip to content

Commit 21523d1

Browse files
committed
Fix channels for mp3
1 parent 9a5f159 commit 21523d1

4 files changed

Lines changed: 23 additions & 2 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/.claude
22
/node_modules
3+
.DS_Store

audio-encode.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ function fmt(init) {
4444
if (!opts.sampleRate) throw Error('sampleRate is required')
4545
let ch = channels(data)
4646
if (!ch.length || !ch[0].length) return EMPTY
47-
let enc = await init(opts)
47+
let enc = await init({ channels: ch.length, ...opts })
4848
try {
4949
let result = await enc(ch)
5050
let flushed = await enc()

packages/mp3-encode/mp3-encode.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import { createMp3Encoder } from 'wasm-media-encoders'
1616
* free() → void
1717
*/
1818
export default async function mp3(opts) {
19-
let { sampleRate, bitrate = 128, quality, channels = 2 } = opts
19+
let { sampleRate, bitrate = 128, quality, channels } = opts
20+
if (!channels || channels < 1 || channels > 2) channels = 2
2021

2122
let encoder = await createMp3Encoder()
2223

test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,22 @@ t('AudioBuffer input', async () => {
119119
is(dec.sampleRate, 44100)
120120
almost(rms(dec.channelData[0]), rms(ch), 0.001, 'rms matches')
121121
})
122+
123+
t('mp3 mono — channels inferred from data', async () => {
124+
let mono = sine(44100, 440, 0.5) // 1 channel
125+
let buf = await encode.mp3(mono, { sampleRate: 44100, bitrate: 128 })
126+
ok(buf.length > 0, 'encoded without error')
127+
// verify MP3 frame header says mono (channel mode = 3)
128+
for (let i = 0; i < buf.length - 4; i++) {
129+
if (buf[i] === 0xff && (buf[i + 1] & 0xe0) === 0xe0) {
130+
is((buf[i + 3] >> 6) & 3, 3, 'MP3 frame is mono')
131+
break
132+
}
133+
}
134+
})
135+
136+
t('ogg mono — channels inferred from data', async () => {
137+
let mono = sine(44100, 440, 0.5)
138+
let buf = await encode.ogg(mono, { sampleRate: 44100 })
139+
ok(buf.length > 0, 'encoded without error')
140+
})

0 commit comments

Comments
 (0)