func (s *Stream) OnAudioPacket(e *gumble.AudioPacketEvent) { packet := e.AudioPacket samples := len(packet.PositionalAudioBuffer.AudioBuffer) if samples*2 > cap(s.buffer) { return } var source openal.Source if userSource, ok := s.userStreams[packet.Sender.Session]; !ok { source = openal.NewSource() s.userStreams[packet.Sender.Session] = source } else { source = userSource } for i, value := range packet.PositionalAudioBuffer.AudioBuffer { binary.LittleEndian.PutUint16(s.buffer[i*2:], uint16(value)) } var buffer openal.Buffer for source.BuffersProcessed() > 0 { openal.DeleteBuffer(source.UnqueueBuffer()) } buffer = openal.NewBuffer() buffer.SetData(openal.FormatMono16, s.buffer[0:samples*2], gumble.AudioSampleRate) source.QueueBuffer(buffer) if source.State() != openal.Playing { source.Play() } }