if _G.Playprint == nil then _G.Playprint = true end local function get_speakers(name) if name then local speaker = peripheral.wrap(name) if speaker == nil then error(("Speaker %q does not exist"):format(name), 0) return elseif not peripheral.hasType(name, "speaker") then error(("%q is not a speaker"):format(name), 0) end return { speaker } else local speakers = { peripheral.find("speaker") } if #speakers == 0 then error("No speakers attached", 0) end return speakers end end function spekerStop() local speakers = { peripheral.find("speaker") } for _, speaker in pairs(speakers) do speaker.stop() end end function speakerPlay(buffer) local speakers = { peripheral.find("speaker") } for _, speaker in pairs(speakers) do a = speaker.playAudio(buffer) end return a end local function pcm_decoder(chunk) local buffer = {} for i = 1, #chunk do buffer[i] = chunk:byte(i) - 128 end return buffer end function displayProgressBar(percent) term.setCursorPos(1, 1) local screenWidth, _ = term.getSize() -- 获取终端的宽度和高度 local barLength = math.floor(screenWidth - 8) -- 进度条长度为屏幕宽度减去固定长度(用于百分比显示) local numBars = math.floor(percent / (100 / barLength)) -- 构建进度条字符串 local progressBar = "[" for i = 1, barLength do if i <= numBars then progressBar = progressBar .. "=" else progressBar = progressBar .. " " end end progressBar = progressBar .. "] " .. math.floor(percent) .. "%" -- 百分比不显示小数点 -- 清空屏幕并输出进度条到屏幕顶部 term.setCursorPos(1, 3) print(progressBar) end -- 测试函数 local cmd = ... if cmd == "stop" then _G.Playopen = false local speakers = { peripheral.find("speaker") } for _, speaker in pairs(speakers) do speaker.stop() end spekerStop() elseif cmd == "play" then local _, file, type = ... local handle, err if http and file:match("^https?://") then if type == "mp3" then if _G.Playprint then print("mp3 > dfpwm.....") end local json = textutils.serialiseJSON({ ["url"] = file } ) handle, err = http.get{ url = http.post("http://gmapi.liulikeji.cn:15842/dfpwm",json).readAll(), binary = true } else handle, err = http.get{ url = file, binary = true } end else handle, err = fs.open(file, "rb") end if not handle then error(err, 0) end local start = handle.read(4) local pcm = false local size = 16 * 1024 - 4 if start == "RIFF" then handle.read(4) if handle.read(8) ~= "WAVEfmt " then handle.close() error("Could not play audio: Unsupported WAV file", 0) end local fmtsize = ("= 1 then break end if chunk == nil then break end if start then chunk, start = start .. chunk, nil size = size + 4 end end local buffer = decoder(chunk) if b1 then speakerPlay(buffer) b1=false c1 = true else while setPlay==nil and _G.Playstop==false do local speakers = { peripheral.find("speaker") } for i,speaker in pairs(speakers) do os.pullEvent("speaker_audio_empty") end speakerPlay(buffer) break end end end _G.getPlay=nil end play1() spekerStop() handle.close() else local programName = arg[0] or fs.getName(shell.getRunningProgram()) end