62 lines
1.1 KiB
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))
|
|
}
|