touhouwiki-mirror/utilities/cddb1.go

62 lines
1.1 KiB
Go

package utilities
import (
"encoding/binary"
"encoding/hex"
"strconv"
"time"
)
type CDDB1 uint32
func (c CDDB1) GetStartTimeChecksum() int {
return int((c >> 24) & 0xFF)
}
func (c CDDB1) GetDuration() time.Duration {
return time.Second * time.Duration((c>>8)&0xFFFF)
}
func (c CDDB1) GetTrackNumber() int {
return int(c & 0xFF)
}
func NewCDDB1FromString(cddb1 string) CDDB1 {
b, err := hex.DecodeString(cddb1)
if err != nil {
return 0
}
return CDDB1(binary.BigEndian.Uint32(b))
}
func (c CDDB1) String() string {
b := make([]byte, 4)
binary.BigEndian.PutUint32(b, uint32(c))
return hex.EncodeToString(b)
}
func GetCDDB1FromTOC(toc []string) CDDB1 {
if len(toc) < 3 {
return 0
}
var t []int
for _, i := range toc[1 : len(toc)-1] {
item, err := strconv.Atoi(i)
if err == nil {
t = append(t, item)
}
}
length := uint32(((time.Second * time.Duration(t[0]-t[1])) / 75).Seconds())
checksum := uint32(0)
for i := 1; i < len(t); i++ {
n := uint32(t[i] / 75)
for n > 0 {
checksum += n % 10
n /= 10
}
}
return CDDB1(uint32((len(t)-1)&0xFF) | ((length & 0xFFFF) << 8) | ((checksum % 255) << 24))
}