func BenchmarkFrameHash(b *testing.B) { // The file 151185.flac is a 119.5 MB public domain FLAC file used to // benchmark the flac library. Because of its size, it has not been included // in the repository, but is available for download at // // http://freesound.org/people/jarfil/sounds/151185/ for i := 0; i < b.N; i++ { stream, err := flac.Open("../testdata/benchmark/151185.flac") if err != nil { b.Fatal(err) } md5sum := md5.New() for { frame, err := stream.ParseNext() if err != nil { if err == io.EOF { break } stream.Close() b.Fatal(err) } frame.Hash(md5sum) } stream.Close() want := stream.Info.MD5sum[:] got := md5sum.Sum(nil) // Verify the decoded audio samples by comparing the MD5 checksum that is // stored in StreamInfo with the computed one. if !bytes.Equal(got, want) { b.Fatalf("MD5 checksum mismatch for decoded audio samples; expected %32x, got %32x", want, got) } } }
func TestFrameHash(t *testing.T) { for i, g := range golden { stream, err := flac.Open(g.name) if err != nil { t.Fatal(err) } defer stream.Close() md5sum := md5.New() for frameNum := 0; ; frameNum++ { frame, err := stream.ParseNext() if err != nil { if err == io.EOF { break } t.Errorf("i=%d, frameNum=%d: error while parsing frame; %v", i, frameNum, err) continue } frame.Hash(md5sum) } want := stream.Info.MD5sum[:] got := md5sum.Sum(nil) // Verify the decoded audio samples by comparing the MD5 checksum that is // stored in StreamInfo with the computed one. if !bytes.Equal(got, want) { t.Errorf("i=%d: MD5 checksum mismatch for decoded audio samples; expected %32x, got %32x", i, want, got) } } }
func BenchmarkFrameParse(b *testing.B) { // The file 151185.flac is a 119.5 MB public domain FLAC file used to // benchmark the flac library. Because of its size, it has not been included // in the repository, but is available for download at // // http://freesound.org/people/jarfil/sounds/151185/ for i := 0; i < b.N; i++ { stream, err := flac.Open("../testdata/benchmark/151185.flac") if err != nil { b.Fatal(err) } for { _, err := stream.ParseNext() if err != nil { if err == io.EOF { break } stream.Close() b.Fatal(err) } } stream.Close() } }
// flac2wav converts the provided FLAC file to a WAV file. func flac2wav(path string) error { // Open FLAC file. stream, err := flac.Open(path) if err != nil { return err } defer stream.Close() // Create WAV file. wavPath := pathutil.TrimExt(path) + ".wav" if !flagForce { exists, err := osutil.Exists(wavPath) if err != nil { return err } if exists { return fmt.Errorf("the file %q exists already", wavPath) } } fw, err := os.Create(wavPath) if err != nil { return err } defer fw.Close() // Create WAV encoder. conf := audio.Config{ Channels: int(stream.Info.NChannels), SampleRate: int(stream.Info.SampleRate), } enc, err := wav.NewEncoder(fw, conf) if err != nil { return err } defer enc.Close() for { // Decode FLAC audio samples. frame, err := stream.ParseNext() if err != nil { if err == io.EOF { break } return err } // Encode WAV audio samples. samples := make(audio.Int16, 1) for i := 0; i < int(frame.BlockSize); i++ { for _, subframe := range frame.Subframes { samples[0] = int16(subframe.Samples[i]) _, err = enc.Write(samples) if err != nil { return err } } } } return nil }
func ExampleOpen() { // Open love.flac for audio streaming without parsing metadata. stream, err := flac.Open("testdata/love.flac") if err != nil { log.Fatal(err) } defer stream.Close() // Parse audio samples and verify the MD5 signature of the decoded audio // samples. md5sum := md5.New() for { // Parse one frame of audio samples at the time, each frame containing one // subframe per audio channel. frame, err := stream.ParseNext() if err != nil { if err == io.EOF { break } log.Fatal(err) } frame.Hash(md5sum) // Print first three samples from each channel of the first five frames. if frame.Num < 5 { fmt.Printf("frame %d\n", frame.Num) for i, subframe := range frame.Subframes { fmt.Printf(" subframe %d\n", i) for j, sample := range subframe.Samples { if j >= 3 { break } fmt.Printf(" sample %d: %v\n", j, sample) } } } } fmt.Println() got, want := md5sum.Sum(nil), stream.Info.MD5sum[:] fmt.Println("decoded audio md5sum valid:", bytes.Equal(got, want)) // Output: // frame 0 // subframe 0 // sample 0: 126 // sample 1: 126 // sample 2: 126 // subframe 1 // sample 0: 126 // sample 1: 126 // sample 2: 126 // frame 1 // subframe 0 // sample 0: 126 // sample 1: 126 // sample 2: 126 // subframe 1 // sample 0: 126 // sample 1: 126 // sample 2: 126 // frame 2 // subframe 0 // sample 0: 121 // sample 1: 130 // sample 2: 137 // subframe 1 // sample 0: 121 // sample 1: 130 // sample 2: 137 // frame 3 // subframe 0 // sample 0: -9501 // sample 1: -6912 // sample 2: -3916 // subframe 1 // sample 0: -9501 // sample 1: -6912 // sample 2: -3916 // frame 4 // subframe 0 // sample 0: 513 // sample 1: 206 // sample 2: 152 // subframe 1 // sample 0: 513 // sample 1: 206 // sample 2: 152 // // decoded audio md5sum valid: true }