]> Sergey Matveev's repositories - vors.git/commitdiff
Playback buffer
authorSergey Matveev <stargrave@stargrave.org>
Thu, 11 Apr 2024 22:00:33 +0000 (01:00 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Thu, 11 Apr 2024 22:00:33 +0000 (01:00 +0300)
cmd/client/main.go

index 1cb65bfcc71e362dd577d73a251b181e23aaba930c05e185d6dee548f2c89438..c0fc01550aa9a39223a50b3cdff480c22e826f3b2ab8bbcc0b930ac7d5736ca6 100644 (file)
@@ -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)