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(): print("Nada") 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(): var pkt: PackedByteArray = packet_queue.get(sender).pop_front() if pkt == null: break 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)