Added padding and fixed IPC problems

This commit is contained in:
Casey 2024-09-16 16:26:36 +03:00
parent 989daae8e8
commit d62bc3f389
Signed by: hkc
GPG Key ID: F0F6CFE11CDB0960
1 changed files with 21 additions and 10 deletions

View File

@ -2,6 +2,8 @@ local args = { ... }
local dfpwm = require("cc.audio.dfpwm") local dfpwm = require("cc.audio.dfpwm")
local ccpi = require("ccpi") local ccpi = require("ccpi")
local EV_NONCE = math.floor(0xFFFFFFFF * math.random())
settings.define("video.speaker.left", { settings.define("video.speaker.left", {
description = "Speaker ID for left audio channel", description = "Speaker ID for left audio channel",
default = peripheral.getName(peripheral.find("speaker")), default = peripheral.getName(peripheral.find("speaker")),
@ -86,7 +88,8 @@ if not n_frames and not video_url and not audio_url_l then
end end
end end
print(string.format("Using monitor %s", peripheral.getName(monitor))) local mon_w, mon_h = monitor.getSize()
print(string.format("Using monitor %s (%dx%d)", peripheral.getName(monitor), mon_w, mon_h))
if speakers.r then if speakers.r then
print(string.format("Stereo sound: L=%s R=%s", peripheral.getName(speakers.l), peripheral.getName(speakers.r))) print(string.format("Stereo sound: L=%s R=%s", peripheral.getName(speakers.l), peripheral.getName(speakers.r)))
else else
@ -183,11 +186,11 @@ for i = 1, loading_concurrency do
end end
table.insert(subthreads, function() table.insert(subthreads, function()
while #frames ~= n_frames or #audio_frames.l < n_audio_samples do repeat
draw_bar(ty - 3, colors.blue, colors.gray, #frames / n_frames, "Loading video [%5d / %5d]", #frames, n_frames) draw_bar(ty - 3, colors.blue, colors.gray, #frames / n_frames, "Loading video [%5d / %5d]", #frames, n_frames)
draw_bar(ty - 2, colors.red, colors.gray, #audio_frames.l / n_audio_samples, "Loading audio [%5d / %5d]", #audio_frames.l, n_audio_samples) draw_bar(ty - 2, colors.red, colors.gray, #audio_frames.l / n_audio_samples, "Loading audio [%5d / %5d]", #audio_frames.l, n_audio_samples)
os.sleep(0.25) os.sleep(0.25)
end until #frames >= n_frames or #audio_frames.l >= n_audio_samples do
print() print()
end) end)
@ -208,14 +211,16 @@ table.insert(subthreads, function()
break break
end end
end end
os.queueEvent("playback_ready") os.queueEvent("playback_ready", EV_NONCE)
end) end)
table.insert(subthreads, function() table.insert(subthreads, function()
local is_dfpwm = ({ audio_url_l:find("%.dfpwm") })[2] == #audio_url_l local is_dfpwm = ({ audio_url_l:find("%.dfpwm") })[2] == #audio_url_l
local decode = use_dfpwm and dfpwm.make_decoder() or decode_s8 local decode = use_dfpwm and dfpwm.make_decoder() or decode_s8
os.pullEvent("playback_ready") repeat
local _, nonce = os.pullEvent("playback_ready")
until nonce == EV_NONCE
for i = 1, n_audio_samples do for i = 1, n_audio_samples do
local buffer = decode(audio_frames.l[i]) local buffer = decode(audio_frames.l[i])
@ -232,7 +237,9 @@ table.insert(subthreads, function()
local is_dfpwm = ({ audio_url_r:find("%.dfpwm") })[2] == #audio_url_r local is_dfpwm = ({ audio_url_r:find("%.dfpwm") })[2] == #audio_url_r
local decode = use_dfpwm and dfpwm.make_decoder() or decode_s8 local decode = use_dfpwm and dfpwm.make_decoder() or decode_s8
os.pullEvent("playback_ready") repeat
local _, nonce = os.pullEvent("playback_ready")
until nonce == EV_NONCE
for i = 1, n_audio_samples do for i = 1, n_audio_samples do
local buffer = decode(audio_frames.r[i]) local buffer = decode(audio_frames.r[i])
@ -244,8 +251,9 @@ table.insert(subthreads, function()
end) end)
table.insert(subthreads, function() table.insert(subthreads, function()
os.pullEvent("playback_ready") repeat
local _, nonce = os.pullEvent("playback_ready")
until nonce == EV_NONCE
local start_t = os.clock() local start_t = os.clock()
while not playback_done do while not playback_done do
local frame = math.floor((os.clock() - start_t) / math.max(0.05, delay)) local frame = math.floor((os.clock() - start_t) / math.max(0.05, delay))
@ -253,8 +261,11 @@ table.insert(subthreads, function()
term.setBackgroundColor(frame >= #frames and colors.red or colors.gray) term.setBackgroundColor(frame >= #frames and colors.red or colors.gray)
term.clearLine() term.clearLine()
term.write(string.format("Playing frame: %d/%d", frame + 1, #frames)) term.write(string.format("Playing frame: %d/%d", frame + 1, #frames))
if frames[frame + 1] then local img = frames[frame + 1]
ccpi.draw(frames[frame + 1], 1, 1, monitor) if img ~= nil then
local x = math.max(math.floor((mon_w - img.w) / 2), 0)
local y = math.max(math.floor((mon_h - img.h) / 2), 0)
ccpi.draw(img, x, y, monitor)
end end
os.sleep(delay) os.sleep(delay)
end end