package wav import ( "bytes" "encoding/binary" "fmt" "rtp-app/pkg/riff" ) type CuePoint struct { ID [4]byte Position uint32 DataChunkID [4]byte ChunkStart uint32 BlockStart uint32 SampleOffset uint32 } func DecodeCueChunk(d *Decoder, ch *riff.Chunk) error { if ch == nil { return fmt.Errorf("не могу декодировать nil chunk") } if d == nil { return fmt.Errorf("nil декодер") } if ch.ID == CIDCue { buf := make([]byte, ch.Size) var err error if _, err = ch.Read(buf); err != nil { return fmt.Errorf("не удалось прочитать CUE chunk - %v", err) } r := bytes.NewReader(buf) var nbrCues uint32 if err := binary.Read(r, binary.LittleEndian, &nbrCues); err != nil { return fmt.Errorf("не удалось прочитать количество cues - %v", err) } if nbrCues > 0 { if d.Metadata == nil { d.Metadata = &Metadata{} } d.Metadata.CuePoints = []*CuePoint{} scratch := make([]byte, 4) for i := uint32(0); i < nbrCues; i++ { c := &CuePoint{} if _, err = r.Read(scratch); err != nil { return fmt.Errorf("не удалось прочитать cue point ID") } copy(c.ID[:], scratch[:4]) if err := binary.Read(r, binary.LittleEndian, &c.Position); err != nil { return err } if _, err = r.Read(scratch); err != nil { return fmt.Errorf("не удалось прочитать данные chunk id") } copy(c.DataChunkID[:], scratch[:4]) if err := binary.Read(r, binary.LittleEndian, &c.ChunkStart); err != nil { return err } if err := binary.Read(r, binary.LittleEndian, &c.BlockStart); err != nil { return err } if err := binary.Read(r, binary.LittleEndian, &c.SampleOffset); err != nil { return err } d.Metadata.CuePoints = append(d.Metadata.CuePoints, c) } } } return nil }