fix audio loading (HTTPS, GURT, relative, remove HTTP) and add paused prop
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -10,3 +10,4 @@ upx*
|
|||||||
flumi/build-scripts/Windows
|
flumi/build-scripts/Windows
|
||||||
flumi/build-scripts/Linux
|
flumi/build-scripts/Linux
|
||||||
flumi/build-scripts/MacOS
|
flumi/build-scripts/MacOS
|
||||||
|
~*.dll
|
||||||
@@ -135,11 +135,12 @@ func fetch_text(url: String) -> String:
|
|||||||
func fetch_external_resource(url: String, base_url: String = "") -> String:
|
func fetch_external_resource(url: String, base_url: String = "") -> String:
|
||||||
var resolved_url = URLUtils.resolve_url(base_url, url)
|
var resolved_url = URLUtils.resolve_url(base_url, url)
|
||||||
|
|
||||||
if resolved_url.begins_with("http://") or resolved_url.begins_with("https://"):
|
if resolved_url.begins_with("https://"):
|
||||||
return await fetch_text(resolved_url)
|
return await fetch_text(resolved_url)
|
||||||
elif resolved_url.begins_with("gurt://"):
|
elif resolved_url.begins_with("gurt://"):
|
||||||
return fetch_gurt_resource(resolved_url)
|
return fetch_gurt_resource(resolved_url)
|
||||||
else:
|
else:
|
||||||
|
print("Resource loading error: Only HTTPS and GURT protocols are supported. Attempted: ", resolved_url)
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
func fetch_gurt_resource(url: String, as_binary: bool = false):
|
func fetch_gurt_resource(url: String, as_binary: bool = false):
|
||||||
|
|||||||
@@ -102,9 +102,22 @@ func load_audio_async(src: String) -> void:
|
|||||||
|
|
||||||
reset_stream_state()
|
reset_stream_state()
|
||||||
|
|
||||||
if not src.begins_with("http"):
|
if src.begins_with("https://") or src.begins_with("gurt://"):
|
||||||
|
await load_remote_audio(src)
|
||||||
|
else:
|
||||||
|
print("Audio loading error: Only HTTPS and GURT protocols are supported. Attempted: ", src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
func load_remote_audio(src: String) -> void:
|
||||||
|
if not (src.begins_with("https://") or src.begins_with("gurt://")):
|
||||||
|
return
|
||||||
|
|
||||||
|
if src.begins_with("https://"):
|
||||||
|
await load_https_audio(src)
|
||||||
|
elif src.begins_with("gurt://"):
|
||||||
|
await load_gurt_audio(src)
|
||||||
|
|
||||||
|
func load_https_audio(src: String) -> void:
|
||||||
var http_request = HTTPRequest.new()
|
var http_request = HTTPRequest.new()
|
||||||
add_child(http_request)
|
add_child(http_request)
|
||||||
|
|
||||||
@@ -118,6 +131,39 @@ func load_audio_async(src: String) -> void:
|
|||||||
http_request.queue_free()
|
http_request.queue_free()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
func load_gurt_audio(src: String) -> void:
|
||||||
|
var response = await Network.fetch_gurt_resource(src, true)
|
||||||
|
if response is PackedByteArray and response.size() > 0:
|
||||||
|
var audio_stream = load_audio_from_buffer(response, src)
|
||||||
|
if audio_stream and audio_player:
|
||||||
|
audio_player.stream = audio_stream
|
||||||
|
on_stream_loaded()
|
||||||
|
|
||||||
|
func load_audio_from_buffer(data: PackedByteArray, file_path: String) -> AudioStream:
|
||||||
|
if data.size() == 0:
|
||||||
|
return null
|
||||||
|
|
||||||
|
var extension = file_path.get_extension().to_lower()
|
||||||
|
var audio_stream: AudioStream
|
||||||
|
|
||||||
|
match extension:
|
||||||
|
"ogg", "oga":
|
||||||
|
audio_stream = AudioStreamOggVorbis.load_from_buffer(data)
|
||||||
|
"wav", "wave":
|
||||||
|
audio_stream = AudioStreamWAV.new()
|
||||||
|
audio_stream.data = data
|
||||||
|
audio_stream.format = AudioStreamWAV.FORMAT_16_BITS
|
||||||
|
audio_stream.mix_rate = 44100
|
||||||
|
audio_stream.stereo = true
|
||||||
|
audio_stream.loop_mode = AudioStreamWAV.LOOP_DISABLED
|
||||||
|
"mp3":
|
||||||
|
audio_stream = AudioStreamMP3.load_from_buffer(data)
|
||||||
|
if not audio_stream:
|
||||||
|
audio_stream = AudioStreamMP3.new()
|
||||||
|
audio_stream.data = data
|
||||||
|
|
||||||
|
return audio_stream
|
||||||
|
|
||||||
func _on_audio_download_completed(_result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray):
|
func _on_audio_download_completed(_result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray):
|
||||||
var http_request = get_children().filter(func(child): return child is HTTPRequest)[0]
|
var http_request = get_children().filter(func(child): return child is HTTPRequest)[0]
|
||||||
http_request.queue_free()
|
http_request.queue_free()
|
||||||
@@ -136,29 +182,26 @@ func _on_audio_download_completed(_result: int, response_code: int, headers: Pac
|
|||||||
|
|
||||||
var audio_stream: AudioStream
|
var audio_stream: AudioStream
|
||||||
|
|
||||||
|
# Determine format from content type
|
||||||
|
var format_extension = ""
|
||||||
if "ogg" in content_type or "vorbis" in content_type:
|
if "ogg" in content_type or "vorbis" in content_type:
|
||||||
audio_stream = AudioStreamOggVorbis.load_from_buffer(body)
|
format_extension = "ogg"
|
||||||
if not audio_stream:
|
|
||||||
return
|
|
||||||
elif "wav" in content_type or "wave" in content_type:
|
elif "wav" in content_type or "wave" in content_type:
|
||||||
audio_stream = AudioStreamWAV.new()
|
format_extension = "wav"
|
||||||
audio_stream.data = body
|
|
||||||
audio_stream.format = AudioStreamWAV.FORMAT_16_BITS
|
|
||||||
audio_stream.mix_rate = 44100
|
|
||||||
audio_stream.stereo = true
|
|
||||||
audio_stream.loop_mode = AudioStreamWAV.LOOP_DISABLED
|
|
||||||
elif "mp3" in content_type or "mpeg" in content_type:
|
elif "mp3" in content_type or "mpeg" in content_type:
|
||||||
audio_stream = AudioStreamMP3.load_from_buffer(body)
|
format_extension = "mp3"
|
||||||
if not audio_stream:
|
else:
|
||||||
audio_stream = AudioStreamMP3.new()
|
var url_extension = current_element.get_attribute("src").get_extension().to_lower()
|
||||||
audio_stream.data = body
|
if url_extension in ["ogg", "oga", "wav", "wave", "mp3"]:
|
||||||
|
format_extension = url_extension
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
audio_stream = load_audio_from_buffer(body, "remote." + format_extension)
|
||||||
|
|
||||||
if audio_stream:
|
if audio_stream:
|
||||||
if audio_player:
|
if audio_player:
|
||||||
audio_player.stream = audio_stream
|
audio_player.stream = audio_stream
|
||||||
|
|
||||||
on_stream_loaded()
|
on_stream_loaded()
|
||||||
|
|
||||||
func reset_stream_state():
|
func reset_stream_state():
|
||||||
|
|||||||
@@ -124,6 +124,9 @@ static func _lua_audio_index_handler(vm: LuauVM) -> int:
|
|||||||
"duration":
|
"duration":
|
||||||
vm.lua_pushnumber(audio_node.get_duration())
|
vm.lua_pushnumber(audio_node.get_duration())
|
||||||
return 1
|
return 1
|
||||||
|
"paused":
|
||||||
|
vm.lua_pushboolean(not audio_node.is_playing)
|
||||||
|
return 1
|
||||||
_:
|
_:
|
||||||
# Look up other methods/properties in the table itself
|
# Look up other methods/properties in the table itself
|
||||||
vm.lua_rawget(1)
|
vm.lua_rawget(1)
|
||||||
@@ -216,6 +219,9 @@ static func handle_dom_audio_index(vm: LuauVM, element_id: String, key: String)
|
|||||||
"duration":
|
"duration":
|
||||||
vm.lua_pushnumber(audio_node.get_duration())
|
vm.lua_pushnumber(audio_node.get_duration())
|
||||||
return 1
|
return 1
|
||||||
|
"paused":
|
||||||
|
vm.lua_pushboolean(not audio_node.is_playing)
|
||||||
|
return 1
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user