mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-11 05:31:51 +09:00
70 lines
1.5 KiB
JavaScript
70 lines
1.5 KiB
JavaScript
const Mp3 = require('mp3dec')
|
|
const pcm = require("pcm")
|
|
|
|
|
|
Object.keys(Mp3).forEach(e=>{
|
|
print(`${e}\t`)
|
|
})
|
|
println()
|
|
|
|
println("reading...")
|
|
let arr = files.open("A:/gateless.mp3").bread()
|
|
let ab = new ArrayBuffer(arr.length)
|
|
let abba = new Uint8Array(ab)
|
|
arr.forEach((v,i)=>{ abba[i] = v })
|
|
|
|
|
|
let mp3ArrayBuffer = new Uint8Array(ab, 0, arr.length)
|
|
|
|
println("decoding...")
|
|
let decoder = Mp3.newDecoder(ab)
|
|
if (decoder === null) throw Error("decoder is null")
|
|
|
|
audio.resetParams(0)
|
|
audio.purgeQueue(0)
|
|
audio.setPcmMode(0)
|
|
audio.setMasterVolume(0, 255)
|
|
audio.play(0)
|
|
|
|
let decodedLength = 0
|
|
let readPtr = sys.malloc(8000)
|
|
let decodePtr = sys.malloc(12000)
|
|
|
|
|
|
function decodeAndResample(readArr, decodePtr, readLength) {
|
|
for (let i = 0; i < readLength; i+= 2) {
|
|
let sample = pcm.u16Tos16(readArr[i] | (readArr[i+1] << 8))
|
|
let u8 = pcm.s16Tou8(sample)
|
|
|
|
sys.poke(decodePtr + (i >> 1), u8)
|
|
}
|
|
return readLength / 2
|
|
}
|
|
|
|
|
|
function printPlayBar() {
|
|
}
|
|
|
|
|
|
const QUEUE_MAX = 4
|
|
decoder.decode(obj=>{
|
|
let buf = obj.buf
|
|
let err = obj.err
|
|
|
|
decodedLength += buf.byteLength
|
|
|
|
let declen = decodeAndResample(buf, decodePtr, buf.byteLength)
|
|
|
|
audio.putPcmDataByPtr(decodePtr, declen, 0)
|
|
audio.setSampleUploadLength(0, declen)
|
|
audio.startSampleUpload(0)
|
|
audio.play(0)
|
|
|
|
serial.println(`Send sample (${audio.getPosition(0)})`)
|
|
// sys.sleep(0) // decoding time is slower than realtime :(
|
|
|
|
|
|
}) // now you got decoded PCM data
|
|
|
|
sys.free(readPtr)
|
|
sys.free(decodePtr) |