From: Sergey Matveev Date: Thu, 11 Apr 2024 22:00:33 +0000 (+0300) Subject: Playback buffer X-Git-Tag: v1.0.0~8 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=64a2315d41fc5dd56608458d7bcc4128196cd80734bb27a48c18e17e6e8e4134;p=vors.git Playback buffer --- 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)