diff --git a/lib/flac/flac.go b/lib/flac/flac.go new file mode 100644 index 0000000..fa6c6dc --- /dev/null +++ b/lib/flac/flac.go @@ -0,0 +1,63 @@ +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 +} diff --git a/lib/flac/flac_test.go b/lib/flac/flac_test.go new file mode 100644 index 0000000..e464c27 --- /dev/null +++ b/lib/flac/flac_test.go @@ -0,0 +1,14 @@ +package flac + +import ( + "log" + "testing" +) + +func TestGetMetadata(t *testing.T) { + md, err := GetMetadata("test_files/audio.flac") + if err != nil { + t.Fatal(err) + } + log.Printf("%v", md) +} diff --git a/lib/flac/test_files/audio.flac b/lib/flac/test_files/audio.flac new file mode 100644 index 0000000..cbd6cd0 Binary files /dev/null and b/lib/flac/test_files/audio.flac differ