func (s *Stream) sourceRoutine() { interval := s.client.Config.AudioInterval frameSize := s.client.Config.GetAudioFrameSize() ticker := time.NewTicker(interval) defer ticker.Stop() s.paused = false int16Buffer := make([]int16, frameSize) byteBuffer := make([]byte, frameSize*2) for { select { case <-s.pause: s.paused = true return case <-ticker.C: if _, err := io.ReadFull(s.pipe, byteBuffer); err != nil { s.stateChange.Lock() s.cleanup() return } for i := range int16Buffer { float := float32(int16(binary.LittleEndian.Uint16(byteBuffer[i*2 : (i+1)*2]))) int16Buffer[i] = int16(s.Volume * float) } s.Elapsed += interval s.client.Send(gumble.AudioBuffer(int16Buffer)) } } }
func (s *Stream) sourceRoutine() { ticker := time.NewTicker(10 * time.Millisecond) defer ticker.Stop() defer func() { s.cmd.Process.Kill() s.cmd.Wait() s.cmd = nil s.sourceStop = nil if done := s.Done; done != nil { done() } }() stop := s.sourceStop int16Buffer := make([]int16, gumble.AudioDefaultFrameSize) byteBuffer := make([]byte, gumble.AudioDefaultFrameSize*2) for { select { case <-stop: return case <-ticker.C: if _, err := io.ReadFull(s.pipe, byteBuffer); err != nil { return } for i := range int16Buffer { float := float32(int16(binary.LittleEndian.Uint16(byteBuffer[i*2 : (i+1)*2]))) int16Buffer[i] = int16(s.volume * float) } s.client.Send(gumble.AudioBuffer(int16Buffer)) } } }
func (s *Stream) process() { // s.state has been set to StatePlaying interval := s.client.Config.AudioInterval frameSize := s.client.Config.AudioFrameSize() byteBuffer := make([]byte, frameSize*2) outgoing := s.client.AudioOutgoing() defer close(outgoing) ticker := time.NewTicker(interval) defer ticker.Stop() for { select { case <-s.pause: return case <-ticker.C: if _, err := io.ReadFull(s.pipe, byteBuffer); err != nil { s.l.Lock() s.cleanup() return } int16Buffer := make([]int16, frameSize) for i := range int16Buffer { float := float32(int16(binary.LittleEndian.Uint16(byteBuffer[i*2 : (i+1)*2]))) int16Buffer[i] = int16(s.Volume * float) } atomic.AddInt64(&s.elapsed, int64(interval)) outgoing <- gumble.AudioBuffer(int16Buffer) } } }
func (s *Stream) sourceRoutine() { interval := s.client.Config.AudioInterval frameSize := s.client.Config.GetAudioFrameSize() if frameSize != s.sourceFrameSize { s.deviceSource.CaptureCloseDevice() s.sourceFrameSize = frameSize s.deviceSource = openal.CaptureOpenDevice("", gumble.AudioSampleRate, openal.FormatMono16, uint32(s.sourceFrameSize)) } ticker := time.NewTicker(interval) defer ticker.Stop() stop := s.sourceStop int16Buffer := make([]int16, frameSize) for { select { case <-stop: return case <-ticker.C: buff := s.deviceSource.CaptureSamples(uint32(frameSize)) if len(buff) != frameSize*2 { continue } for i := range int16Buffer { int16Buffer[i] = int16(binary.LittleEndian.Uint16(buff[i*2 : (i+1)*2])) } s.client.Send(gumble.AudioBuffer(int16Buffer)) } } }