diff --git a/assets/disk0/tvdos/bin/playmp2.js b/assets/disk0/tvdos/bin/playmp2.js index 14ae293..3ff3ddb 100644 --- a/assets/disk0/tvdos/bin/playmp2.js +++ b/assets/disk0/tvdos/bin/playmp2.js @@ -2,6 +2,8 @@ const SND_BASE_ADDR = audio.getBaseAddr() if (!SND_BASE_ADDR) return 10 +const MP2_BITRATES = ["VBR", 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384] +const MP2_CHANNELMODES = ["Stereo", "Joint", "Dual", "Mono"] const pcm = require("pcm") const interactive = exec_args[2] && exec_args[2].toLowerCase() == "/i" function printdbg(s) { if (0) serial.println(s) } @@ -72,7 +74,9 @@ class SequentialFileBuffer { let filebuf = new SequentialFileBuffer(_G.shell.resolvePathInput(exec_args[1]).full) const FILE_SIZE = filebuf.length// - 100 -let FRAME_SIZE = audio.mp2GetInitialFrameSize(filebuf.fileHeader) +const FRAME_SIZE = audio.mp2GetInitialFrameSize(filebuf.fileHeader) +const MEDIA_BITRATE = MP2_BITRATES[filebuf.fileHeader[2] >>> 4] +const MEDIA_CHANNEL_MODE = MP2_CHANNELMODES[filebuf.fileHeader[3] >>> 6] let bytes_left = FILE_SIZE @@ -83,13 +87,36 @@ let decodedLength = 0 con.curs_set(0) -con.curs_set(0) +let [__, CONSOLE_WIDTH] = con.getmaxyx() if (interactive) { - println("Push and hold Backspace to exit") + let [cy, cx] = con.getyx() + // file name + con.mvaddch(cy, 1) + con.prnch(0xC9);con.prnch(0xCD);con.prnch(0xB5) + print(filebuf.file.name) + con.prnch(0xC6);con.prnch(0xCD) + print("\x84205u".repeat(CONSOLE_WIDTH - 26 - filebuf.file.name.length)) + con.prnch(0xB5) + print("Hold Bksp to Exit") + con.prnch(0xC6);con.prnch(0xCD);con.prnch(0xBB) + + // L R pillar + con.prnch(0xBA) + con.mvaddch(cy+1, CONSOLE_WIDTH, 0xBA) + + // media info + let mediaInfoStr = `MP2 ${MEDIA_CHANNEL_MODE} ${MEDIA_BITRATE}kbps` + con.move(cy+2,1) + con.prnch(0xC8) + print("\x84205u".repeat(CONSOLE_WIDTH - 5 - mediaInfoStr.length)) + con.prnch(0xB5) + print(mediaInfoStr) + con.prnch(0xC6);con.prnch(0xCD);con.prnch(0xBC) + + con.move(cy+1, 2) } let [cy, cx] = con.getyx() -let [__, CONSOLE_WIDTH] = con.getmaxyx() -let paintWidth = CONSOLE_WIDTH - 16 +let paintWidth = CONSOLE_WIDTH - 20 function bytesToSec(i) { // using fixed value: FRAME_SIZE(216) bytes for 36 ms on sampling rate 32000 Hz return i / (FRAME_SIZE * 1000 / bufRealTimeLen) @@ -107,18 +134,18 @@ function printPlayBar(currently) { let currentlySec = Math.round(bytesToSec(currently)) let totalSec = Math.round(bytesToSec(total)) - con.move(cy, 1) + con.move(cy, 3) print(' '.repeat(15)) - con.move(cy, 1) + con.move(cy, 3) print(`${secToReadable(currentlySec)} / ${secToReadable(totalSec)}`) - con.move(cy, 15) + con.move(cy, 17) print(' ') - let progressbar = '\x84205u'.repeat(paintWidth + 1) + let progressbar = '\x84196u'.repeat(paintWidth + 1) print(progressbar) - con.mvaddch(cy, 16 + Math.round(paintWidth * (currently / total)), 0xDB) + con.mvaddch(cy, 18 + Math.round(paintWidth * (currently / total)), 0xDB) } } diff --git a/assets/disk0/tvdos/bin/playpcm.js b/assets/disk0/tvdos/bin/playpcm.js index 73fe682..eeda612 100644 --- a/assets/disk0/tvdos/bin/playpcm.js +++ b/assets/disk0/tvdos/bin/playpcm.js @@ -1,5 +1,6 @@ // usage: playpcm audiofile.pcm [/i] -let filename = _G.shell.resolvePathInput(exec_args[1]).full +let fileeeee = files.open(_G.shell.resolvePathInput(exec_args[1]).full) +let filename = fileeeee.fullPath function printdbg(s) { if (0) serial.println(s) } const interactive = exec_args[2] && exec_args[2].toLowerCase() == "/i" @@ -67,13 +68,36 @@ function secToReadable(n) { let stopPlay = false con.curs_set(0) +let [__, CONSOLE_WIDTH] = con.getmaxyx() if (interactive) { - con.clear(); con.move(1,1) - println("Push and hold Backspace to exit") + let [cy, cx] = con.getyx() + // file name + con.mvaddch(cy, 1) + con.prnch(0xC9);con.prnch(0xCD);con.prnch(0xB5) + print(fileeeee.name) + con.prnch(0xC6);con.prnch(0xCD) + print("\x84205u".repeat(CONSOLE_WIDTH - 26 - fileeeee.name.length)) + con.prnch(0xB5) + print("Hold Bksp to Exit") + con.prnch(0xC6);con.prnch(0xCD);con.prnch(0xBB) + + // L R pillar + con.prnch(0xBA) + con.mvaddch(cy+1, CONSOLE_WIDTH, 0xBA) + + // media info + let mediaInfoStr = `Raw PCM 512kbps` + con.move(cy+2,1) + con.prnch(0xC8) + print("\x84205u".repeat(CONSOLE_WIDTH - 5 - mediaInfoStr.length)) + con.prnch(0xB5) + print(mediaInfoStr) + con.prnch(0xC6);con.prnch(0xCD);con.prnch(0xBC) + + con.move(cy+1, 2) } let [cy, cx] = con.getyx() -let [__, CONSOLE_WIDTH] = con.getmaxyx() -let paintWidth = CONSOLE_WIDTH - 16 +let paintWidth = CONSOLE_WIDTH - 20 // read chunks loop readPtr = sys.malloc(BLOCK_SIZE * bitsPerSample / 8) decodePtr = sys.malloc(BLOCK_SIZE * pcm.HW_SAMPLING_RATE / samplingRate) @@ -94,18 +118,18 @@ function printPlayBar() { let currentlySec = Math.round(bytesToSec(currently)) let totalSec = Math.round(bytesToSec(total)) - con.move(cy, 1) + con.move(cy, 3) print(' '.repeat(15)) - con.move(cy, 1) + con.move(cy, 3) print(`${secToReadable(currentlySec)} / ${secToReadable(totalSec)}`) - con.move(cy, 15) + con.move(cy, 17) print(' ') - let progressbar = '\x84205u'.repeat(paintWidth + 1) + let progressbar = '\x84196u'.repeat(paintWidth + 1) print(progressbar) - con.mvaddch(cy, 16 + Math.round(paintWidth * (currently / total)), 0xDB) + con.mvaddch(cy, 18 + Math.round(paintWidth * (currently / total)), 0xDB) } } let errorlevel = 0 diff --git a/assets/disk0/tvdos/bin/playwav.js b/assets/disk0/tvdos/bin/playwav.js index b934c94..55d79db 100644 --- a/assets/disk0/tvdos/bin/playwav.js +++ b/assets/disk0/tvdos/bin/playwav.js @@ -1,7 +1,10 @@ // usage: playwav audiofile.wav [/i] -let filename = _G.shell.resolvePathInput(exec_args[1]).full +let fileeeee = files.open(_G.shell.resolvePathInput(exec_args[1]).full) +let filename = fileeeee.fullPath function printdbg(s) { if (0) serial.println(s) } +const WAV_FORMATS = ["LPCM", "ADPCM"] +const WAV_CHANNELS = ["Mono", "Stereo", "3ch", "Quad", "4.1", "5.1", "6.1", "7.1"] const interactive = exec_args[2] && exec_args[2].toLowerCase() == "/i" const seqread = require("seqread") const pcm = require("pcm") @@ -98,13 +101,41 @@ function decodeInfilePcm(inPtr, outPtr, inputLen) { throw Error(`PCM Type not LPCM or ADPCM (${pcmType})`) } let stopPlay = false + + con.curs_set(0) -if (interactive) { - println("Push and hold Backspace to exit") -} -let [cy, cx] = con.getyx() let [__, CONSOLE_WIDTH] = con.getmaxyx() -let paintWidth = CONSOLE_WIDTH - 16 +function printPlayerShell() { +if (interactive) { + let [cy, cx] = con.getyx() + // file name + con.mvaddch(cy, 1) + con.prnch(0xC9);con.prnch(0xCD);con.prnch(0xB5) + print(fileeeee.name) + con.prnch(0xC6);con.prnch(0xCD) + print("\x84205u".repeat(CONSOLE_WIDTH - 26 - fileeeee.name.length)) + con.prnch(0xB5) + print("Hold Bksp to Exit") + con.prnch(0xC6);con.prnch(0xCD);con.prnch(0xBB) + + // L R pillar + con.prnch(0xBA) + con.mvaddch(cy+1, CONSOLE_WIDTH, 0xBA) + + // media info + let mediaInfoStr = `WAV ${WAV_FORMATS[pcmType-1]} ${WAV_CHANNELS[nChannels-1]} ${byterate*0.008*(pcmType == 2 ? 2 : 1)}kbps` + con.move(cy+2,1) + con.prnch(0xC8) + print("\x84205u".repeat(CONSOLE_WIDTH - 5 - mediaInfoStr.length)) + con.prnch(0xB5) + print(mediaInfoStr) + con.prnch(0xC6);con.prnch(0xCD);con.prnch(0xBC) + + con.move(cy+1, 2) +} +} +let [cy, cx] = con.getyx(); cy++ +let paintWidth = CONSOLE_WIDTH - 20 function printPlayBar(startOffset) { if (interactive) { let currently = seqread.getReadCount() - startOffset @@ -113,18 +144,18 @@ function printPlayBar(startOffset) { let currentlySec = Math.round(bytesToSec(currently)) let totalSec = Math.round(bytesToSec(total)) - con.move(cy, 1) + con.move(cy, 3) print(' '.repeat(15)) - con.move(cy, 1) + con.move(cy, 3) print(`${secToReadable(currentlySec)} / ${secToReadable(totalSec)}`) - con.move(cy, 15) + con.move(cy, 17) print(' ') - let progressbar = '\x84205u'.repeat(paintWidth + 1) + let progressbar = '\x84196u'.repeat(paintWidth + 1) print(progressbar) - con.mvaddch(cy, 16 + Math.round(paintWidth * (currently / total)), 0xDB) + con.mvaddch(cy, 18 + Math.round(paintWidth * (currently / total)), 0xDB) } } let errorlevel = 0 @@ -170,6 +201,7 @@ while (!stopPlay && seqread.getReadCount() < FILE_SIZE - 8) { printdbg(`Format: ${pcmType}, Channels: ${nChannels}, Rate: ${samplingRate}, BitDepth: ${bitsPerSample}`) printdbg(`BLOCK_SIZE=${BLOCK_SIZE}, INFILE_BLOCK_SIZE=${INFILE_BLOCK_SIZE}`) + printPlayerShell() } else if ("LIST" == chunkName) { let startOffset = seqread.getReadCount()