fix(audio): 当扬声器不支持高音质时退回使用默认原版解码播放
This commit is contained in:
+23
-7
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user