Skip to content

Commit 997c0b3

Browse files
committed
chore: support 4 byte headers in voice example
1 parent 923b44e commit 997c0b3

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

_examples/voice/voice.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"bytes"
45
"context"
56
"encoding/binary"
67
"io"
@@ -78,6 +79,19 @@ func play(client *bot.Client, closeChan chan os.Signal) {
7879
closeChan <- syscall.SIGTERM
7980
}
8081

82+
// Test if the header is 4 bytes in size for some obscure and unknown reason.
83+
func has4BitHeaders(file *os.File) (bool, error) {
84+
var pad [2]byte
85+
_, err := file.ReadAt(pad[:], 2)
86+
if err != nil {
87+
return false, err
88+
}
89+
if bytes.Equal(pad[:], []byte{0, 0}) {
90+
return true, nil
91+
}
92+
return false, nil
93+
}
94+
8195
func writeOpus(w io.Writer) {
8296
file, err := os.Open("nico.dca")
8397
if err != nil {
@@ -86,10 +100,21 @@ func writeOpus(w io.Writer) {
86100
ticker := time.NewTicker(time.Millisecond * 20)
87101
defer ticker.Stop()
88102

103+
// support flag for skipping 2 bytes after each header
104+
h4, err := has4BitHeaders(file)
105+
if err != nil {
106+
panic("error reading file: " + err.Error())
107+
}
108+
89109
var frameLen int16
90110
// Don't wait for the first tick, run immediately.
91111
for ; true; <-ticker.C {
92112
err = binary.Read(file, binary.LittleEndian, &frameLen)
113+
114+
if err == nil && h4 {
115+
_, err = file.Seek(2, io.SeekCurrent)
116+
}
117+
93118
if err != nil {
94119
if err == io.EOF {
95120
_ = file.Close()

0 commit comments

Comments
 (0)