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 }