diff --git a/gumble/gumbleopenal/stream.go b/gumble/gumbleopenal/stream.go index 52bd97d..89e1d7b 100644 --- a/gumble/gumbleopenal/stream.go +++ b/gumble/gumbleopenal/stream.go @@ -338,7 +338,8 @@ func (s *Stream) OnAudioStream(e *gumble.AudioStreamEvent) { if pkt == nil { break } - emptyBufs = s.processAudioPacket(pkt, e.User, &source, emptyBufs, &raw, reclaim) + reclaim() + emptyBufs = s.processAudioPacket(pkt, e.User, &source, emptyBufs, &raw) } } @@ -351,7 +352,8 @@ func (s *Stream) OnAudioStream(e *gumble.AudioStreamEvent) { pkt = popNext() } if pkt != nil { - emptyBufs = s.processAudioPacket(pkt, e.User, &source, emptyBufs, &raw, reclaim) + reclaim() + emptyBufs = s.processAudioPacket(pkt, e.User, &source, emptyBufs, &raw) } } reclaim() @@ -362,7 +364,9 @@ func (s *Stream) OnAudioStream(e *gumble.AudioStreamEvent) { // processAudioPacket decodes and queues a single audio packet for playback. // Returns the updated emptyBufs slice after consuming a buffer. -func (s *Stream) processAudioPacket(packet *gumble.AudioPacket, user *gumble.User, source *openal.Source, emptyBufs openal.Buffers, raw *[maxBufferSize]byte, reclaim func()) openal.Buffers { +// The caller must call reclaim() before invoking this to ensure buffers +// are available. +func (s *Stream) processAudioPacket(packet *gumble.AudioPacket, user *gumble.User, source *openal.Source, emptyBufs openal.Buffers, raw *[maxBufferSize]byte) openal.Buffers { samples := len(packet.AudioBuffer) if samples > cap(*raw)/2 { return emptyBufs @@ -455,7 +459,6 @@ func (s *Stream) processAudioPacket(packet *gumble.AudioPacket, user *gumble.Use recorder.RecordAudioFrame(user.Session, recordBuffer[:recordPtr]) } - reclaim() if len(emptyBufs) == 0 { return emptyBufs }