cmd/client/main.go | 36 ++++++++++++++++++++++++++---------- diff --git a/cmd/client/main.go b/cmd/client/main.go index 1cb65bfcc71e362dd577d73a251b181e23aaba930c05e185d6dee548f2c89438..c0fc01550aa9a39223a50b3cdff480c22e826f3b2ab8bbcc0b930ac7d5736ca6 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -323,6 +323,7 @@ log.Fatal(err) } var player io.WriteCloser + playerTx := make(chan []byte, 5) var cmd *exec.Cmd if *playCmd != "" { cmd = makeCmd(*playCmd) @@ -334,6 +335,26 @@ err = cmd.Start() 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 @@ var mac *poly1305.MAC 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 @@ stream.stats.AddRMS(pcm) 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 @@ stream.stats.last = time.Now() 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)