diff --git a/README.md b/README.md index 85fc8cb..8fffb5c 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ ## in development audio player from pipewire to cc -pfowrd -> ssh -R 0.0.0.0:5821:localhost:8080 vps +pfowrd -> `ssh -R 0.0.0.0:5821:localhost:8080 vps` -lua -> wget run https://files.sad.ovh/public/livestream-cc/.installer.lua +lua -> `wget run https://files.sad.ovh/public/livestream-cc/.installer.lua` -rust -> cargo run -- --device pipewire --bind '127.0.0.1:8080' --frame-ms 300 --sample-rate 48000 --stereo +rust -> `cargo run -- --device pipewire --bind '127.0.0.1:8080' --frame-ms 300 --sample-rate 48000 --stereo` diff --git a/lua/src/main.lua b/lua/src/main.lua index 796bbc6..eb13846 100644 --- a/lua/src/main.lua +++ b/lua/src/main.lua @@ -50,34 +50,16 @@ function ui() end local dcode = require "dcode" --- Use the normal decoder for real audio; TrueBit is just for testing -local make_decoder = dcode.make_truebit_dec -- or dcode.make_truebit_dec +local make_decoder = dcode.make_dec local ws = http.websocket("ws://vps.sad.ovh:5821/ws") -------------------------------------------------------- --- metadata -------------------------------------------------------- + local raw = ws.receive() local meta = textutils.unserializeJSON(raw) print(("codec=%s rate=%dHz frame_ms=%d ch_enc=%d frame_bytes/chan=%d") :format(meta.codec, meta.sample_rate, meta.frame_ms, meta.channels_encoded, meta.frame_bytes)) ----@return string[] ---[[local function find_speakers() - local names = peripheral.getNames() - local found = {} - for _, n in ipairs(names) do - if peripheral.getType(n) == "speaker" then - table.insert(found, n) - if #found == 2 then break end - end - end - return found - end]] - ---local speakers = find_speakers() ---if #speakers == 0 then error("no speaker found") end local namesSpkrsL = { "speaker_756", "speaker_755", @@ -97,27 +79,18 @@ for i=1,#namesSpkrsL do spkrsR[i] = peripheral.wrap(namesSpkrsR[i]) end ---print("SpeakerL: " .. (speakers[1]).. ", SpeakerR: " .. (speakers[2] or speakers[1] )) -------------------------------------------------------- --- deque queue implementation (fast push/pop) -------------------------------------------------------- + local function make_queue() return { buf = {}, head = 1, tail = 0 } end local function q_len(q) return q.tail - q.head + 1 end local function q_push(q, v) q.tail = q.tail + 1; q.buf[q.tail] = v end local function q_pop(q) if q.head > q.tail then return nil end local v=q.buf[q.head]; q.buf[q.head]=nil; q.head=q.head+1; return v end local function q_trim_to(q, n) while q_len(q) > n do q_pop(q) end end -------------------------------------------------------- --- buffering policy -------------------------------------------------------- + local MIN_BUFFER, TARGET_BUFFER, MAX_BUFFER = 5, 10, 30 local frames = make_queue() -------------------------------------------------------- --- helper logging -------------------------------------------------------- - local function log(event, extra) local t = textutils.formatTime(os.time(), true) @@ -138,9 +111,8 @@ local function log(event, extra) --ui() print(("[%s] %-12s | %s"):format(t, event, extra or "")) end -------------------------------------------------------- --- receiver -------------------------------------------------------- + + local function receiver() while true do local msg = ws.receive((meta.frame_ms / 1000) * 1.5) @@ -158,9 +130,7 @@ local function receiver() end end -------------------------------------------------------- --- playback -------------------------------------------------------- + local function player() local buffering = true local last_log = 0 @@ -243,7 +213,6 @@ local function player() end end - -- Pacing is governed by speaker_audio_empty waits above. local n = q_len(frames) if n < 1 then log("underrun", "ran out after frame — rebuffering") diff --git a/rust/src/main.rs b/rust/src/main.rs index 234d5c9..e6742a9 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -291,11 +291,6 @@ fn pick_stream_config( Ok((default_cfg.config(), sf)) } -/// Build and return a CPAL input stream that performs: -/// - downmix to mono -/// - convert to i8 PCM [-128,127] -/// - DFPWM encode in frames -/// - broadcast frames over a channel fn build_cpal_stream( device: &Device, cfg: &StreamConfig,