MCPcopy Create free account
hub / github.com/LagrangeDev/LagrangeGo / decode

Function decode

utils/audio/info.go:21–71  ·  view source on GitHub ↗
(r io.ReadSeeker, _f bool)

Source from the content-addressed store, hash-verified

19}
20
21func decode(r io.ReadSeeker, _f bool) (*Info, error) {
22 reader := binary.ParseReader(r)
23 buf := reader.ReadBytes(1)
24 if utils.B2S(buf) != utils.B2S([]byte{0x23}) {
25 if !_f {
26 return decode(r, true)
27 }
28 return nil, errors.New("unknown audio type")
29 }
30 buf = append(buf, reader.ReadBytes(5)...)
31
32 switch {
33 case strings.HasPrefix(string(buf), "#!AMR\n"):
34 return &Info{
35 Type: amr,
36 Time: float32(len(reader.ReadAll())) / 1607.0,
37 }, nil
38 case string(buf) == "#!SILK":
39 ver := reader.ReadBytes(3)
40 if string(ver) != "_V3" {
41 return nil, fmt.Errorf("unsupported silk version: %s", utils.B2S(ver))
42 }
43 data := reader.ReadAll()
44 size := len(data)
45
46 var typ Type
47 if _f { // txsilk
48 typ = txSilk
49 } else {
50 typ = silkV3
51 }
52
53 blks := 0
54 pos := 0
55
56 for pos+2 < size {
57 length := binary2.LittleEndian.Uint16(data[pos : pos+2])
58 if length == 0xFFFF {
59 break
60 }
61 blks++
62 pos += int(length) + 2
63 }
64 return &Info{
65 Type: typ,
66 Time: float32(blks) * 0.02,
67 }, nil
68 default:
69 return nil, errors.New("unknown audio type")
70 }
71}
72
73func Decode(r io.ReadSeeker) (*Info, error) {
74 defer func() {

Callers 1

DecodeFunction · 0.85

Calls 4

ParseReaderFunction · 0.92
B2SFunction · 0.92
ReadAllMethod · 0.80
ReadBytesMethod · 0.45

Tested by

no test coverage detected