package flac import ( "bytes" "fmt" "os/exec" "strconv" ) type Metadata struct { SampleRate int64 BPS int64 Channels int64 NumSamples int64 // Total length of file in samples (per channel). } func GetMetadata(path string) (md Metadata, err error) { cmd := exec.Command( "metaflac", "--show-sample-rate", "--show-bps", "--show-channels", "--show-total-samples", path) out, err := cmd.Output() if err != nil { return md, fmt.Errorf("Failed to open file: %w", err) } l := bytes.Split(out, []byte{'\n'}) if len(l) != 5 { return md, fmt.Errorf("Output not understood:\n%s", out) } l = l[:4] md.SampleRate, err = strconv.ParseInt(string(l[0]), 10, 64) if err != nil { return md, fmt.Errorf("Invalid sample rate: %w", err) } md.BPS, err = strconv.ParseInt(string(l[1]), 10, 64) if err != nil { return md, fmt.Errorf("Invalid bps: %w", err) } md.Channels, err = strconv.ParseInt(string(l[2]), 10, 64) if err != nil { return md, fmt.Errorf("Invalid channels: %w", err) } md.NumSamples, err = strconv.ParseInt(string(l[3]), 10, 64) if err != nil { return md, fmt.Errorf("Invalid length: %w", err) } return md, nil } func Load(path string, nSamples int64) (L []float32, R []float32, err error) { // TODO! return }