nativeaudio

audio playback for Go
Log | Files | Refs | README | LICENSE

adapter_test.go (1702B)


      1 package test
      2 
      3 import (
      4 	"bytes"
      5 	"testing"
      6 
      7 	"git.sr.ht/~jackmordaunt/nativeaudio/pcm"
      8 )
      9 
     10 // TestAdapterOverRealAudio streams a real decode through the float64
     11 // adapter, which is how the composable audio libraries consume it.
     12 func TestAdapterOverRealAudio(t *testing.T) {
     13 	d := newDecoder(t)
     14 
     15 	buffered, format, err := d.Decode(compressed)
     16 	if err != nil {
     17 		t.Fatalf("Decode: %v", err)
     18 	}
     19 	wantFrames := len(buffered) / (format.Channels * format.BytesPerSample)
     20 
     21 	// Once over the buffered output, and once over the incremental
     22 	// stream, which also exercises Close delegating to decoder state.
     23 	stream, err := d.Stream(compressed)
     24 	if err != nil {
     25 		t.Fatalf("Stream: %v", err)
     26 	}
     27 
     28 	for _, tc := range []struct {
     29 		name     string
     30 		streamer *pcm.Streamer
     31 	}{
     32 		{"buffered", pcm.NewStreamer(bytes.NewReader(buffered), format)},
     33 		{"streaming", pcm.NewStreamer(stream, format)},
     34 	} {
     35 		t.Run(tc.name, func(t *testing.T) {
     36 			defer tc.streamer.Close()
     37 
     38 			var (
     39 				frames int
     40 				buf    = make([][2]float64, 512)
     41 				peak   float64
     42 			)
     43 			for {
     44 				n, ok := tc.streamer.Stream(buf)
     45 				for _, f := range buf[:n] {
     46 					for _, v := range f {
     47 						if v > peak {
     48 							peak = v
     49 						}
     50 						if v < -1 || v > 1 {
     51 							t.Fatalf("sample %v out of range", v)
     52 						}
     53 					}
     54 				}
     55 				frames += n
     56 				if !ok {
     57 					break
     58 				}
     59 			}
     60 			if err := tc.streamer.Err(); err != nil {
     61 				t.Fatalf("Err: %v", err)
     62 			}
     63 			if frames != wantFrames {
     64 				t.Errorf("got %d frames, want %d", frames, wantFrames)
     65 			}
     66 			// The fixture is music, so it must not be silence.
     67 			if peak <= 0 {
     68 				t.Error("decoded audio is entirely silent or negative")
     69 			}
     70 			t.Logf("%d frames, peak %.4f", frames, peak)
     71 		})
     72 	}
     73 }