Initial commit
This commit is contained in:
Binary file not shown.
@@ -0,0 +1 @@
|
||||
<svg height="16" viewBox="0 0 512 512" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m257 8.7c7.4.2 17.8.8 23 1.4 5.2.5 13.8 1.8 19 2.9s14.2 3.3 20 4.9c5.8 1.7 15.2 4.9 21 7.1 5.8 2.3 15.7 6.7 22 9.9s15.3 8.2 20 11.1 11.6 7.7 15.5 10.6c3.9 2.8 10.8 8.5 15.5 12.6 4.6 4 12 11.3 16.3 16.3s11 13.7 14.9 19.5 9 14.5 11.4 19.5c2.4 4.9 5.8 13.3 7.5 18.5 2.3 6.7 3.3 12 3.7 18 .3 6.1-.1 10.3-1.3 15-1 3.6-2.8 8.8-4.1 11.5-1.2 2.8-4.2 7.7-6.7 11-2.4 3.3-7.1 8-16.4 15l6.1 10.5c3.4 5.8 8 15.2 10.2 21 2.3 5.8 5.3 15.2 6.8 21 1.4 5.8 3.3 16.1 4.2 23 1.1 8.5 1.4 16 1 23.5-.3 6.1-1.4 16.2-2.5 22.5s-3.1 15.3-4.5 20-4.7 13.9-7.5 20.5-7.9 16.7-11.4 22.5c-3.4 5.8-8.9 14.1-12.2 18.5s-11.1 13.3-17.5 19.9c-6.3 6.5-15.1 14.7-19.5 18.3-4.4 3.5-12.5 9.4-18 13.1-5.5 3.6-15.6 9.4-22.5 12.8s-16.8 7.8-22 9.7c-5.2 2-13.8 4.7-19 6-5.2 1.4-13.8 3.3-19 4.2s-17.4 2-27 2.5c-14.3.6-20 .4-31.5-1.1-7.7-1-18.5-2.7-24-4-5.5-1.2-14.7-3.6-20.5-5.5-5.8-1.8-15.4-5.4-21.5-7.9s-15.7-7.1-21.5-10.2c-5.8-3-14.8-8.4-20-11.8-5.2-3.5-13.1-9.2-17.5-12.8-4.4-3.5-13-11.6-19-17.9-6-6.2-14-15.6-17.8-20.8-3.7-5.2-9.4-14.9-12.7-21.5s-7.1-15.6-8.6-20c-1.5-4.6-2.8-11.4-3.1-16-.3-5.4 0-10.4 1.1-15.5.9-4.1 3.1-10.4 4.9-14 1.8-3.7 6-9.4 9.7-13.3 3.6-3.8 8-7.8 13-10.7l-2.2-3.7c-1.2-2.1-4.1-7.2-6.5-11.3s-6.1-12-8.2-17.5c-2.2-5.5-5.1-14.3-6.5-19.5-1.5-5.2-3.3-14.6-4.1-20.7-.8-6.2-1.5-16.2-1.5-22.3s.7-16.1 1.5-22.2c.8-6.2 2.6-15.4 3.9-20.3s4.1-13.5 6.1-19 6-14.5 8.9-20 8-14 11.3-19c3.3-4.9 9.4-13 13.5-18 4.1-4.9 11.3-12.6 15.9-17s12.7-11.4 17.9-15.4 13.6-9.8 18.5-12.9c4.9-3 14.8-8.4 22-11.8s17.7-7.8 23.5-9.7 15.9-4.7 22.5-6.1c6.6-1.5 16.5-3.2 22-3.9s16.1-1.1 23.5-1z"/><path d="m255.3 55.2c5.9-.1 15.8.5 21.9 1.3 6.2.8 16.7 2.8 23.3 4.5s17.2 5.1 23.5 7.6 15.8 6.9 21 9.6c5.2 2.8 14.2 8.2 19.9 12.2 5.8 3.9 15 11.4 20.4 16.6 5.5 5.2 12.9 13.3 16.4 18s9 13.7 12.1 20c4.3 8.7 5.7 12.8 6 17 .4 4.8.1 5.9-2.2 8.7-1.6 2-4.1 3.7-6.4 4.3-2 .5-5.1.6-6.7.2-1.6-.3-4-1.8-5.3-3.2s-3.9-6.3-5.8-11c-1.8-4.7-5.3-11.4-7.7-15s-6.6-9-9.3-12.1-8-8.5-11.9-11.9-11.3-9-16.5-12.5-14-8.6-19.5-11.3c-5.5-2.8-14.5-6.6-20-8.5s-14.1-4.4-19-5.5c-4.9-1.2-13.9-2.6-20-3.3-6.3-.6-15-.8-20.5-.5-5.2.4-13.8 1.6-19 2.6-5.2 1.1-13.6 3.3-18.5 5.1-4.9 1.7-12.6 4.8-17 6.9s-11.6 6.2-16 9c-4.4 2.9-11.8 8.5-16.5 12.4-4.6 3.9-11.8 11.2-16 16.2-4.1 5.1-9.6 12.7-12.2 17-2.5 4.4-6.1 11.5-7.8 15.9-1.8 4.4-4.1 11.4-5.2 15.5-1 4.1-2.2 12.2-2.5 18-.4 6.4-.1 13.8.7 19 .6 4.7 2.1 11.4 3.2 15s3.8 10.1 6 14.5 6 10.9 8.6 14.5c2.5 3.6 8.2 10.1 12.7 14.5 4.4 4.4 12.3 10.9 17.5 14.4s13.1 8.1 17.5 10.3 13.2 5.8 19.5 7.9 15.1 4.5 19.5 5.4 10.8 1.9 20.5 3v-148.5h11.5c6.3 0 15.9.5 21.2 1.1 5.4.6 14.1 2 19.3 3.1s14.2 3.5 20 5.4 16.8 6.6 24.5 10.4 18.3 10 23.5 13.7c5.2 3.8 13.5 10.9 18.5 15.9 4.9 4.9 11.5 12.6 14.7 17 3.1 4.3 7.6 12 10.1 16.9s5.7 12.7 7.1 17.2c1.4 4.6 3.3 12.2 4.1 17 .8 4.9 1.5 14 1.5 20.3s-.7 15.8-1.5 21c-.9 5.2-3.1 14-4.9 19.5-1.9 5.5-5.2 13.6-7.4 18s-6.8 12.3-10.3 17.5-10.9 14.2-16.4 19.9-14.1 13.5-19 17.4c-4.9 3.8-13.1 9.3-18 12.2-4.9 3-12.6 7-17 9s-12.5 5.2-18 7-14.9 4.3-21 5.4c-6.1 1.2-16.4 2.4-23 2.8-6.9.3-16.7.1-23-.6-6.1-.7-15.3-2.1-20.5-3.3-5.2-1.1-14-3.5-19.5-5.3s-14.9-5.4-21-8.1-15.1-7.4-20-10.3c-4.9-3-13.1-8.4-18-12.1s-13.5-11.4-19-17.2c-5.5-5.7-12.1-13.5-14.7-17.3-2.5-3.9-6.8-11.5-9.4-17s-5-12.1-5.3-14.6c-.6-4.5-.4-4.9 3.5-8.8 3.6-3.5 4.8-4.1 8.5-4.1 2.5 0 5.7.8 7.4 1.8 2.3 1.4 3.9 4 6.7 10.8 2.1 4.9 6.1 12.3 8.9 16.4s7.2 9.9 9.8 12.8c2.5 2.9 8 8.1 12.1 11.6s10.9 8.5 15 11.3 12.7 7.6 19 10.8 16.7 7.5 23 9.6 15 4.5 19.2 5.3c4.3.9 12.4 2.1 18 2.7 5.7.6 14.4.8 19.3.4s12.8-1.3 17.5-2.1 13.2-3.1 19-5 15-5.8 20.5-8.6c5.5-2.7 13.1-7.2 17-9.8 3.9-2.7 10.6-8 14.9-11.7 4.4-3.7 11.1-10.7 15-15.4 3.9-4.8 9.2-12.2 11.8-16.5 2.5-4.4 6.1-11.5 7.8-15.9 1.8-4.4 4.2-11.4 5.3-15.5 1.7-6.1 2-10.5 2-23.5s-.3-17.4-2-23.5c-1.1-4.1-3.5-10.9-5.3-15-1.7-4.1-5.7-11.3-8.8-16s-9.4-12.3-14.2-17c-4.7-4.7-12.8-11.4-18-15-5.2-3.5-14-8.5-19.5-11.1s-13.6-6-18-7.4c-4.4-1.5-11.9-3.6-16.8-4.6-4.8-1-11.9-2.2-22.7-3.4v148.5h-12c-6.6 0-17.3-.7-23.8-1.5-6.4-.9-16.4-2.7-22.2-4.1s-14.8-4.2-20-6.1-14.7-6.2-21-9.4c-6.3-3.3-15.7-9-20.9-12.7s-13.1-10.3-17.6-14.7-10.8-11.6-14.1-16-8.2-12.5-11.1-18c-2.8-5.5-6.3-13.7-7.7-18.3-1.4-4.5-3.3-12.1-4.1-17-.8-4.8-1.5-13.9-1.5-20.2s.7-15.8 1.5-21c.9-5.2 3.1-14 4.9-19.5 1.9-5.5 5.3-13.8 7.6-18.5s6.9-12.3 10.1-17 8.6-11.7 12.1-15.6c3.5-4 9-9.6 12.3-12.5 3.3-3 8.7-7.5 12-10 3.3-2.6 9.8-7 14.5-10 4.7-2.9 12.6-7.2 17.5-9.5s13.7-5.8 19.5-7.7 15.4-4.5 21.5-5.6 12.6-2.2 14.5-2.4 8.3-.5 14.2-.5z" fill="#6ccdf4"/></svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |
@@ -0,0 +1,101 @@
|
||||
@tool class_name FmodEventEditorProperty extends FmodPathEditorProperty
|
||||
|
||||
|
||||
static var EVENT_PARAMETER_PREFIX_FOR_PROPERTIES = "fmod_parameters"
|
||||
|
||||
var former_event_description: FmodEventDescription
|
||||
|
||||
func _update_property():
|
||||
super()
|
||||
if get_edited_object().event_name == "":
|
||||
return
|
||||
_update_parameters()
|
||||
var event_description: FmodEventDescription = FmodServer.get_event_from_guid(get_edited_object().event_guid)
|
||||
|
||||
if event_description == null:
|
||||
event_description = FmodServer.get_event(get_edited_object().event_name)
|
||||
|
||||
former_event_description = event_description
|
||||
|
||||
func _set_path_and_guid(path: String, guid: String):
|
||||
super(path, guid)
|
||||
if get_edited_object().event_name == "":
|
||||
return
|
||||
_update_parameters()
|
||||
former_event_description = FmodServer.get_event_from_guid(get_edited_object().event_guid)
|
||||
|
||||
func _update_parameters():
|
||||
var event_description: FmodEventDescription = FmodServer.get_event_from_guid(get_edited_object().event_guid)
|
||||
|
||||
if event_description == null:
|
||||
return
|
||||
|
||||
if former_event_description != null and event_description != former_event_description:
|
||||
get_edited_object().tool_remove_all_parameters()
|
||||
|
||||
var map_to_property_name = func map_to_property_name(dict: Dictionary):
|
||||
return dict["name"]
|
||||
var filter_fmod_parameter_property = func filter_fmod_parameter_property(parameter_name: String):
|
||||
return parameter_name.begins_with(EVENT_PARAMETER_PREFIX_FOR_PROPERTIES)
|
||||
|
||||
var filter_property_id = func filter_property_id(property: String):
|
||||
return property.ends_with("/id")
|
||||
var existing_property_ids = get_edited_object().get_property_list().map(map_to_property_name).filter(filter_fmod_parameter_property).filter(filter_property_id)
|
||||
|
||||
var map_property_name_to_parameter_name = func map_property_name_to_parameter_name(parameter: String):
|
||||
return parameter.split("/")[1]
|
||||
var existing_parameter_names = existing_property_ids.map(map_property_name_to_parameter_name)
|
||||
|
||||
var map_property_id_to_parameter_id_value = func map_property_id_to_parameter_id_value(property: String):
|
||||
return get_edited_object()[property]
|
||||
var existing_parameter_ids = existing_property_ids.map(map_property_id_to_parameter_id_value)
|
||||
|
||||
var property_matching = existing_parameter_ids.map(func(id): return false)
|
||||
|
||||
for param: FmodParameterDescription in event_description.get_parameters():
|
||||
if param.is_global() or param.is_automatic() or param.is_read_only():
|
||||
continue
|
||||
|
||||
var parameter_name = param.get_name()
|
||||
var parameter_id_param = "%s/%s/id" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
|
||||
var parameter_value_param = "%s/%s" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
|
||||
var parameter_variant_type = "%s/%s/variant_type" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
|
||||
var parameter_labels = "%s/%s/labels" % [EVENT_PARAMETER_PREFIX_FOR_PROPERTIES, parameter_name]
|
||||
|
||||
var existing_property_name_index = existing_property_ids.find(parameter_id_param)
|
||||
var are_properties_already_in_node = existing_property_name_index != -1
|
||||
|
||||
var parameter_id = param.get_id()
|
||||
|
||||
var variant_type: Variant.Type = TYPE_FLOAT
|
||||
var default_value = param.get_default_value()
|
||||
var minimum_value = param.get_minimum()
|
||||
var maximum_value = param.get_maximum()
|
||||
if param.is_labeled():
|
||||
variant_type = TYPE_STRING
|
||||
default_value = event_description.get_parameter_label_by_id(parameter_id, default_value)
|
||||
minimum_value = event_description.get_parameter_label_by_id(parameter_id, minimum_value)
|
||||
maximum_value = event_description.get_parameter_label_by_id(parameter_id, maximum_value)
|
||||
elif param.is_discrete():
|
||||
variant_type = TYPE_INT
|
||||
default_value = int(default_value)
|
||||
minimum_value = int(minimum_value)
|
||||
maximum_value = int(maximum_value)
|
||||
|
||||
if are_properties_already_in_node:
|
||||
property_matching[existing_property_name_index] = existing_parameter_ids[existing_property_name_index] == parameter_id
|
||||
|
||||
if not are_properties_already_in_node or get_edited_object()[parameter_id_param] == null:
|
||||
get_edited_object()[parameter_id_param] = parameter_id
|
||||
if not are_properties_already_in_node or get_edited_object()[parameter_value_param] == null:
|
||||
get_edited_object()[parameter_value_param] = default_value
|
||||
if not are_properties_already_in_node or get_edited_object()[parameter_variant_type] == null:
|
||||
get_edited_object()[parameter_variant_type] = variant_type
|
||||
if param.is_labeled() and (not are_properties_already_in_node or get_edited_object()[parameter_labels] == null):
|
||||
get_edited_object()[parameter_labels] = event_description.get_parameter_labels_by_id(parameter_id)
|
||||
|
||||
for i in property_matching.size():
|
||||
if not property_matching[i]:
|
||||
get_edited_object().tool_remove_parameter(existing_parameter_ids[i])
|
||||
|
||||
get_edited_object().notify_property_list_changed()
|
||||
@@ -0,0 +1,96 @@
|
||||
extends Node
|
||||
|
||||
var mic_capture : AudioEffectOpusChunked
|
||||
var audio_stats : Dictionary[int, Array] # id->[last_number, packetsreceived, packetslost]
|
||||
var packets_sent: int = 0
|
||||
|
||||
var packet_queue: Dictionary[int, Array] # sender_id -> Array of PackedByteArrays
|
||||
|
||||
|
||||
func _ready():
|
||||
playstuff()
|
||||
var mic_bus = AudioServer.get_bus_index("Mic")
|
||||
mic_capture = AudioServer.get_bus_effect(mic_bus, 0)
|
||||
|
||||
func _process(delta: float):
|
||||
if !mic_capture or Multiplayer.playerDict.is_empty():
|
||||
return
|
||||
if Input.is_action_just_pressed("noise"):
|
||||
play_note(69)
|
||||
print("test")
|
||||
for sender in packet_queue.keys():
|
||||
var VoiceChatPlayerOutputNode: AudioStreamPlayer3D = Multiplayer.playerDict.get(sender).VoiceChat
|
||||
var OpusStream : AudioStreamOpusChunked = VoiceChatPlayerOutputNode.stream
|
||||
while OpusStream.chunk_space_available() and packet_queue.get(sender).size() > 0:
|
||||
var pkt: PackedByteArray = packet_queue.get(sender).pop_front()
|
||||
OpusStream.push_opus_packet(pkt, 8, 0)
|
||||
|
||||
|
||||
while mic_capture.chunk_available():
|
||||
var seq_num : PackedByteArray = PackedByteArray()
|
||||
seq_num.resize(8)
|
||||
seq_num.encode_u64(0,packets_sent+1)
|
||||
var packet = mic_capture.read_opus_packet(seq_num)
|
||||
mic_capture.drop_chunk()
|
||||
if multiplayer.multiplayer_peer.get_connection_status() == MultiplayerPeer.CONNECTION_CONNECTED:
|
||||
_voice_packet_received.rpc(packet)
|
||||
packets_sent += 1
|
||||
if (packets_sent % 500) == 0:
|
||||
print("Packets sent: ", packets_sent, " from id ", multiplayer.get_unique_id(), " ", hash(packet))
|
||||
print("Size before: ", packet.size())
|
||||
print("Hash send: ", hash(packet))
|
||||
|
||||
@rpc("any_peer", "unreliable_ordered")#, "call_local")
|
||||
func _voice_packet_received(packet: PackedByteArray):
|
||||
var sender_id = multiplayer.get_remote_sender_id()
|
||||
|
||||
#Stats for printing
|
||||
var sender_stats = audio_stats.get(sender_id, [0,0,0])
|
||||
if (sender_stats[0]+1 != packet.decode_u32(0)):
|
||||
sender_stats[2]+=1
|
||||
sender_stats[0]=packet.decode_u64(0)
|
||||
sender_stats[1]+=1
|
||||
audio_stats.set(sender_id, sender_stats)
|
||||
if (sender_stats[1] % 500) == 0:
|
||||
print("Packets received: ", sender_stats[1], " from id ", sender_id, " Lossrate: ", sender_stats[2], "/", sender_stats[1], "(" , str(100*(sender_stats[2]/sender_stats[1])), "%)")
|
||||
print("Size after: ", packet.size())
|
||||
print("Hash received: ", hash(packet))
|
||||
print("Packet no.: ", packet.decode_u64(0))
|
||||
var VoiceChatPlayerOutputNode: AudioStreamPlayer3D = Multiplayer.playerDict.get(sender_id).VoiceChat
|
||||
var OpusStream : AudioStreamOpusChunked = VoiceChatPlayerOutputNode.stream
|
||||
#OpusStream.push_opus_packet(packet, 8, 0)
|
||||
if not packet_queue.has(sender_id):
|
||||
var x : Array[PackedByteArray] = []
|
||||
packet_queue.set(sender_id, x)
|
||||
packet_queue.get(sender_id).append(packet)
|
||||
|
||||
var playback: AudioStreamGeneratorPlayback
|
||||
var player_ : AudioStreamPlayer
|
||||
|
||||
func playstuff():
|
||||
var generator = AudioStreamGenerator.new()
|
||||
generator.mix_rate = 44100
|
||||
generator.buffer_length = 2
|
||||
player_ = AudioStreamPlayer.new()
|
||||
player_.bus = "Mic"
|
||||
player_.stream = generator
|
||||
add_child(player_)
|
||||
player_.play()
|
||||
playback = player_.get_stream_playback()
|
||||
|
||||
func play_note(midi_note: int):
|
||||
var freq = 440.0 * pow(2.0, (midi_note - 69) / 12.0) # MIDI ? Hz
|
||||
generate_sine_wave(freq)
|
||||
|
||||
func generate_sine_wave(frequency: float):
|
||||
var sample_rate = 44100.0
|
||||
var increment = TAU * frequency / sample_rate
|
||||
var phase = 0.0
|
||||
var num_samples = int(sample_rate * 2) # 0.5 seconds
|
||||
var buffer = PackedVector2Array()
|
||||
|
||||
for i in num_samples:
|
||||
var sample = sin(phase)
|
||||
buffer.append(Vector2(sample, sample)) # stereo
|
||||
phase += increment
|
||||
playback.push_buffer(buffer)
|
||||
@@ -0,0 +1,37 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://npt2au0g2tku"
|
||||
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://icon.svg"
|
||||
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
Reference in New Issue
Block a user