Initial commit: read flac metadata.

master
J. David Lee 2019-12-01 12:12:48 +01:00
parent 71f493c287
commit 25645f0ba9
3 changed files with 77 additions and 0 deletions

63
lib/flac/flac.go Normal file
View File

@ -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
}

14
lib/flac/flac_test.go Normal file
View File

@ -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)
}

Binary file not shown.