97 lines
3.5 KiB
Plaintext
97 lines
3.5 KiB
Plaintext
|
|
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)
|