diff --git a/pkg/bufferedvid/bufferedvid.go b/pkg/bufferedvid/bufferedvid.go index bc60544..d83d761 100644 --- a/pkg/bufferedvid/bufferedvid.go +++ b/pkg/bufferedvid/bufferedvid.go @@ -41,15 +41,16 @@ const ( // player holds all the data // necessary for playing video. type player struct { - pix *image.NRGBA - ticker <-chan time.Time - errs <-chan error - frameBuffer <-chan *image.RGBA - audioBuffer <-chan [2]float64 - last time.Time - fps int - paused bool - frameCount int64 + pix *image.NRGBA + ticker <-chan time.Time + errs <-chan error + frameBuffer <-chan *image.RGBA + audioBuffer <-chan [2]float64 + last time.Time + fps int + paused bool + frameCount int64 + audioProcessor func([2]float64) } // readVideoAndAudio reads video and audio frames @@ -178,6 +179,18 @@ func (p *player) readVideoAndAudio(media *reisen.Media) (<-chan *image.RGBA, <-c return frameBuffer, sampleBuffer, errs, nil } +func (p *player) SetAudioProcessorFunc(f func(data [2]float64)) { + p.audioProcessor = f +} + +func (p *player) processAudioFrame(data [2]float64) { + if p.audioProcessor != nil { + p.audioProcessor(data) + } else { + _ = data + } +} + // Starts reading samples and frames // of the media file. func (p *player) open(fname string) error { @@ -294,12 +307,11 @@ func (w *BufferedVidPlayback) Play() { fmt.Printf("Error %s\n", err.Error()) } w.fpsTimer.Reset(frameDuration) - go func() { - // empty the audio buffer in case that's what's jamming things up. + go func(p player) { for { - _ = <-w.playerStruct.audioBuffer + p.processAudioFrame(<-w.playerStruct.audioBuffer) } - }() + }(w.playerStruct) w.FillBuffer() w.videoOpened = true }