From 64a2315d41fc5dd56608458d7bcc4128196cd80734bb27a48c18e17e6e8e4134 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Fri, 12 Apr 2024 01:00:33 +0300 Subject: [PATCH] Playback buffer --- cmd/client/main.go | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/cmd/client/main.go b/cmd/client/main.go index 1cb65bf..c0fc015 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -323,6 +323,7 @@ func main() { } var player io.WriteCloser + playerTx := make(chan []byte, 5) var cmd *exec.Cmd if *playCmd != "" { cmd = makeCmd(*playCmd) @@ -334,6 +335,26 @@ func main() { if err != nil { log.Fatal(err) } + go func() { + var pcmbuf []byte + var ok bool + var err error + for { + for len(playerTx) > 1 { + <-playerTx + stream.stats.reorder++ + } + pcmbuf, ok = <-playerTx + if !ok { + break + } + if _, err = io.Copy(player, + bytes.NewReader(pcmbuf)); err != nil { + log.Println("play:", err) + } + } + cmd.Process.Kill() + }() } var ciph *chacha20.Cipher @@ -342,7 +363,6 @@ func main() { tag := make([]byte, poly1305.TagSize) var ctr uint32 pcm := make([]int16, vors.FrameLen) - pcmbuf := make([]byte, 2*vors.FrameLen) nonce := make([]byte, 12) var pkt []byte lost := -1 @@ -398,11 +418,9 @@ func main() { if cmd == nil { continue } + pcmbuf := make([]byte, 2*lastDur) pcmConv(pcmbuf, pcm[:lastDur]) - if _, err = io.Copy(player, bytes.NewReader( - pcmbuf[:2*lastDur])); err != nil { - log.Println("play:", err) - } + playerTx <- pcmbuf } _, err = dec.Decode(pkt, pcm) if err != nil { @@ -414,14 +432,12 @@ func main() { if cmd == nil { continue } + pcmbuf := make([]byte, 2*len(pcm)) pcmConv(pcmbuf, pcm) - if _, err = io.Copy(player, - bytes.NewReader(pcmbuf)); err != nil { - log.Println("play:", err) - } + playerTx <- pcmbuf } if cmd != nil { - cmd.Process.Kill() + close(playerTx) } }() go statsDrawer(stream.stats, stream.name) -- 2.48.1