mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-12 23:54:04 +09:00
audio player improved ui
This commit is contained in:
@@ -2,6 +2,8 @@ const SND_BASE_ADDR = audio.getBaseAddr()
|
|||||||
|
|
||||||
if (!SND_BASE_ADDR) return 10
|
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 pcm = require("pcm")
|
||||||
const interactive = exec_args[2] && exec_args[2].toLowerCase() == "/i"
|
const interactive = exec_args[2] && exec_args[2].toLowerCase() == "/i"
|
||||||
function printdbg(s) { if (0) serial.println(s) }
|
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)
|
let filebuf = new SequentialFileBuffer(_G.shell.resolvePathInput(exec_args[1]).full)
|
||||||
const FILE_SIZE = filebuf.length// - 100
|
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
|
let bytes_left = FILE_SIZE
|
||||||
@@ -83,13 +87,36 @@ let decodedLength = 0
|
|||||||
|
|
||||||
|
|
||||||
con.curs_set(0)
|
con.curs_set(0)
|
||||||
con.curs_set(0)
|
let [__, CONSOLE_WIDTH] = con.getmaxyx()
|
||||||
if (interactive) {
|
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 [cy, cx] = con.getyx()
|
||||||
let [__, CONSOLE_WIDTH] = con.getmaxyx()
|
let paintWidth = CONSOLE_WIDTH - 20
|
||||||
let paintWidth = CONSOLE_WIDTH - 16
|
|
||||||
function bytesToSec(i) {
|
function bytesToSec(i) {
|
||||||
// using fixed value: FRAME_SIZE(216) bytes for 36 ms on sampling rate 32000 Hz
|
// using fixed value: FRAME_SIZE(216) bytes for 36 ms on sampling rate 32000 Hz
|
||||||
return i / (FRAME_SIZE * 1000 / bufRealTimeLen)
|
return i / (FRAME_SIZE * 1000 / bufRealTimeLen)
|
||||||
@@ -107,18 +134,18 @@ function printPlayBar(currently) {
|
|||||||
let currentlySec = Math.round(bytesToSec(currently))
|
let currentlySec = Math.round(bytesToSec(currently))
|
||||||
let totalSec = Math.round(bytesToSec(total))
|
let totalSec = Math.round(bytesToSec(total))
|
||||||
|
|
||||||
con.move(cy, 1)
|
con.move(cy, 3)
|
||||||
print(' '.repeat(15))
|
print(' '.repeat(15))
|
||||||
con.move(cy, 1)
|
con.move(cy, 3)
|
||||||
|
|
||||||
print(`${secToReadable(currentlySec)} / ${secToReadable(totalSec)}`)
|
print(`${secToReadable(currentlySec)} / ${secToReadable(totalSec)}`)
|
||||||
|
|
||||||
con.move(cy, 15)
|
con.move(cy, 17)
|
||||||
print(' ')
|
print(' ')
|
||||||
let progressbar = '\x84205u'.repeat(paintWidth + 1)
|
let progressbar = '\x84196u'.repeat(paintWidth + 1)
|
||||||
print(progressbar)
|
print(progressbar)
|
||||||
|
|
||||||
con.mvaddch(cy, 16 + Math.round(paintWidth * (currently / total)), 0xDB)
|
con.mvaddch(cy, 18 + Math.round(paintWidth * (currently / total)), 0xDB)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// usage: playpcm audiofile.pcm [/i]
|
// 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) }
|
function printdbg(s) { if (0) serial.println(s) }
|
||||||
|
|
||||||
const interactive = exec_args[2] && exec_args[2].toLowerCase() == "/i"
|
const interactive = exec_args[2] && exec_args[2].toLowerCase() == "/i"
|
||||||
@@ -67,13 +68,36 @@ function secToReadable(n) {
|
|||||||
|
|
||||||
let stopPlay = false
|
let stopPlay = false
|
||||||
con.curs_set(0)
|
con.curs_set(0)
|
||||||
|
let [__, CONSOLE_WIDTH] = con.getmaxyx()
|
||||||
if (interactive) {
|
if (interactive) {
|
||||||
con.clear(); con.move(1,1)
|
let [cy, cx] = con.getyx()
|
||||||
println("Push and hold Backspace to exit")
|
// 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 [cy, cx] = con.getyx()
|
||||||
let [__, CONSOLE_WIDTH] = con.getmaxyx()
|
let paintWidth = CONSOLE_WIDTH - 20
|
||||||
let paintWidth = CONSOLE_WIDTH - 16
|
|
||||||
// read chunks loop
|
// read chunks loop
|
||||||
readPtr = sys.malloc(BLOCK_SIZE * bitsPerSample / 8)
|
readPtr = sys.malloc(BLOCK_SIZE * bitsPerSample / 8)
|
||||||
decodePtr = sys.malloc(BLOCK_SIZE * pcm.HW_SAMPLING_RATE / samplingRate)
|
decodePtr = sys.malloc(BLOCK_SIZE * pcm.HW_SAMPLING_RATE / samplingRate)
|
||||||
@@ -94,18 +118,18 @@ function printPlayBar() {
|
|||||||
let currentlySec = Math.round(bytesToSec(currently))
|
let currentlySec = Math.round(bytesToSec(currently))
|
||||||
let totalSec = Math.round(bytesToSec(total))
|
let totalSec = Math.round(bytesToSec(total))
|
||||||
|
|
||||||
con.move(cy, 1)
|
con.move(cy, 3)
|
||||||
print(' '.repeat(15))
|
print(' '.repeat(15))
|
||||||
con.move(cy, 1)
|
con.move(cy, 3)
|
||||||
|
|
||||||
print(`${secToReadable(currentlySec)} / ${secToReadable(totalSec)}`)
|
print(`${secToReadable(currentlySec)} / ${secToReadable(totalSec)}`)
|
||||||
|
|
||||||
con.move(cy, 15)
|
con.move(cy, 17)
|
||||||
print(' ')
|
print(' ')
|
||||||
let progressbar = '\x84205u'.repeat(paintWidth + 1)
|
let progressbar = '\x84196u'.repeat(paintWidth + 1)
|
||||||
print(progressbar)
|
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
|
let errorlevel = 0
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
// usage: playwav audiofile.wav [/i]
|
// 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) }
|
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 interactive = exec_args[2] && exec_args[2].toLowerCase() == "/i"
|
||||||
const seqread = require("seqread")
|
const seqread = require("seqread")
|
||||||
const pcm = require("pcm")
|
const pcm = require("pcm")
|
||||||
@@ -98,13 +101,41 @@ function decodeInfilePcm(inPtr, outPtr, inputLen) {
|
|||||||
throw Error(`PCM Type not LPCM or ADPCM (${pcmType})`)
|
throw Error(`PCM Type not LPCM or ADPCM (${pcmType})`)
|
||||||
}
|
}
|
||||||
let stopPlay = false
|
let stopPlay = false
|
||||||
|
|
||||||
|
|
||||||
con.curs_set(0)
|
con.curs_set(0)
|
||||||
if (interactive) {
|
|
||||||
println("Push and hold Backspace to exit")
|
|
||||||
}
|
|
||||||
let [cy, cx] = con.getyx()
|
|
||||||
let [__, CONSOLE_WIDTH] = con.getmaxyx()
|
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) {
|
function printPlayBar(startOffset) {
|
||||||
if (interactive) {
|
if (interactive) {
|
||||||
let currently = seqread.getReadCount() - startOffset
|
let currently = seqread.getReadCount() - startOffset
|
||||||
@@ -113,18 +144,18 @@ function printPlayBar(startOffset) {
|
|||||||
let currentlySec = Math.round(bytesToSec(currently))
|
let currentlySec = Math.round(bytesToSec(currently))
|
||||||
let totalSec = Math.round(bytesToSec(total))
|
let totalSec = Math.round(bytesToSec(total))
|
||||||
|
|
||||||
con.move(cy, 1)
|
con.move(cy, 3)
|
||||||
print(' '.repeat(15))
|
print(' '.repeat(15))
|
||||||
con.move(cy, 1)
|
con.move(cy, 3)
|
||||||
|
|
||||||
print(`${secToReadable(currentlySec)} / ${secToReadable(totalSec)}`)
|
print(`${secToReadable(currentlySec)} / ${secToReadable(totalSec)}`)
|
||||||
|
|
||||||
con.move(cy, 15)
|
con.move(cy, 17)
|
||||||
print(' ')
|
print(' ')
|
||||||
let progressbar = '\x84205u'.repeat(paintWidth + 1)
|
let progressbar = '\x84196u'.repeat(paintWidth + 1)
|
||||||
print(progressbar)
|
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
|
let errorlevel = 0
|
||||||
@@ -170,6 +201,7 @@ while (!stopPlay && seqread.getReadCount() < FILE_SIZE - 8) {
|
|||||||
|
|
||||||
printdbg(`Format: ${pcmType}, Channels: ${nChannels}, Rate: ${samplingRate}, BitDepth: ${bitsPerSample}`)
|
printdbg(`Format: ${pcmType}, Channels: ${nChannels}, Rate: ${samplingRate}, BitDepth: ${bitsPerSample}`)
|
||||||
printdbg(`BLOCK_SIZE=${BLOCK_SIZE}, INFILE_BLOCK_SIZE=${INFILE_BLOCK_SIZE}`)
|
printdbg(`BLOCK_SIZE=${BLOCK_SIZE}, INFILE_BLOCK_SIZE=${INFILE_BLOCK_SIZE}`)
|
||||||
|
printPlayerShell()
|
||||||
}
|
}
|
||||||
else if ("LIST" == chunkName) {
|
else if ("LIST" == chunkName) {
|
||||||
let startOffset = seqread.getReadCount()
|
let startOffset = seqread.getReadCount()
|
||||||
|
|||||||
Reference in New Issue
Block a user