diff --git a/station_broadcast.lua b/station_broadcast.lua index 77525aa..721ff4c 100644 --- a/station_broadcast.lua +++ b/station_broadcast.lua @@ -1447,19 +1447,19 @@ end local function playHqAudioItem(item) if not Peripherals.speakers or #Peripherals.speakers == 0 then Utils.log("WARN", "No speakers found; cannot play audio") - return + return false end local playSeq = State.interruptSeq local payload = item.audioData - if type(payload) ~= "string" or #payload == 0 then return end + if type(payload) ~= "string" or #payload == 0 then return false end local format = tostring(item.audioFormat or "file"):lower() if format == "stream" then local bytes, ext, err = downloadAudioBytes(payload) if not bytes then Utils.log("ERROR", "Failed to download stream audio: " .. tostring(err)) - return + return false end Utils.log("INFO", "Downloaded stream audio: " .. tostring(#bytes) .. " bytes") payload = bytes @@ -1467,6 +1467,8 @@ local function playHqAudioItem(item) elseif ext == "mp3" then format = "mp3" elseif ext == "ogg" then format = "ogg" else format = "file" end + item.audioData = payload + item.audioFormat = format end local controller = Peripherals.speakers[1] @@ -1525,19 +1527,20 @@ local function playHqAudioItem(item) if not called then Utils.log("ERROR", "HQ speaker did not accept audio for format " .. format) - return + return false end while areHqSpeakersBusy(Peripherals.speakers) do if shouldStop(playSeq) then Audio.stop("current") - return + return true end if not waitForInterruptibleDelay(playSeq, 0.1) then Audio.stop("current") - return + return true end end + return true end local function pushWavChunkToSpeakers(payload, playSeq) @@ -1781,7 +1784,20 @@ end function Audio.playItem(item) local format = tostring(item.audioFormat or "dfpwm"):lower() if format == "wav" or format == "file" or format == "stream" or format == "hls" then - return playHqAudioItem(item) + local success = playHqAudioItem(item) + if success == false then + format = tostring(item.audioFormat or "file"):lower() + Utils.log("WARN", "HQ speaker playback failed, falling back to default decoding for format: " .. format) + if format == "wav" or format == "file" then + return Audio.playWavStreamItem(item) + elseif format == "dfpwm" then + return Audio.playDfpwmItem(item) + else + Utils.log("ERROR", "Cannot fallback for format: " .. format) + return false + end + end + return success elseif format == "pcm" then return Audio.playPcmItem(item) elseif format == "wav-stream" then