nx_audio_pcm_test.nx source
↩ module page · 71 lines · 2579 B
1// nx_audio_pcm_test.nx -- smoke for nx_audio_pcm.
2
3import "nx_syscalls.nx"
4import "nx_audio_pcm.nx"
5
6func main() -> i64 {
7 // Construct a 16-sample buffer at 8 kHz
8 let samples: *u8 = (sys_mmap(64)) as *u8
9 var i: nx_size = 0
10 while i < 16 {
11 samples[i] = (100 + i * 8) as u8 // ramp 100..220
12 i = i + 1
13 }
14 let b: *NxPcmBuffer = nx_pcm_buffer_new(samples, 16, 8000)
15 if b.n_samples != 16 { return 1 }
16 if b.sample_rate_hz != 8000 { return 2 }
17
18 // Bad rate refused
19 let bad: *NxPcmBuffer = nx_pcm_buffer_new(samples, 16, 0)
20 if (bad as i64) != 0 { return 3 }
21
22 // duration: 16 samples at 8000 Hz = 2000 us
23 if nx_pcm_duration_us(b) != 2000 { return 4 }
24
25 // Peak amplitude: max deviation from 128
26 // samples are 100..220; deviations are 28..92; peak = 92
27 if nx_pcm_peak_amplitude(b) != 92 { return 5 }
28
29 // Resample to 4000 Hz: should be 8 samples
30 let dst: *u8 = (sys_mmap(32)) as *u8
31 let n_dst: nx_int = nx_pcm_resample_linear(b, dst, 32, 4000)
32 if n_dst != 8 { return 6 }
33
34 // Resample to higher rate: 12000 -> 24 samples
35 let dst2: *u8 = (sys_mmap(64)) as *u8
36 let n_dst2: nx_int = nx_pcm_resample_linear(b, dst2, 64, 12000)
37 if n_dst2 != 24 { return 7 }
38
39 // Too-small dst buffer
40 let small: *u8 = (sys_mmap(2)) as *u8
41 if nx_pcm_resample_linear(b, small, 2, 16000) >= 0 { return 8 }
42
43 // Bad rate to resample
44 if nx_pcm_resample_linear(b, dst, 32, 0) >= 0 { return 9 }
45
46 // Amplitude scale: halve volume
47 let samples2: *u8 = (sys_mmap(16)) as *u8
48 samples2[0] = 228 as u8 // +100 from DC
49 samples2[1] = 28 as u8 // -100 from DC
50 let b2: *NxPcmBuffer = nx_pcm_buffer_new(samples2, 2, 8000)
51 nx_pcm_amplitude_scale_q10(b2, 512) // 0.5x
52 // 228 -> centered=100 -> *0.5=50 -> +128 = 178
53 if (samples2[0] as i64) & 255 != 178 { return 10 }
54 // 28 -> centered=-100 -> *0.5=-50 -> +128 = 78
55 if (samples2[1] as i64) & 255 != 78 { return 11 }
56
57 // Bad scale refused
58 if nx_pcm_amplitude_scale_q10(b2, -1) != NX_PCM_ERR_BAD_SCALE { return 12 }
59
60 // Mix two buffers
61 let dst_buf: *u8 = (sys_mmap(16)) as *u8
62 let src_buf: *u8 = (sys_mmap(16)) as *u8
63 dst_buf[0] = 180 as u8 // +52 from DC
64 src_buf[0] = 178 as u8 // +50 from DC; sum +102 = 230
65 let dst_pcm: *NxPcmBuffer = nx_pcm_buffer_new(dst_buf, 1, 8000)
66 let src_pcm: *NxPcmBuffer = nx_pcm_buffer_new(src_buf, 1, 8000)
67 nx_pcm_mix_into(dst_pcm, src_pcm)
68 if (dst_buf[0] as i64) & 255 != 230 { return 13 }
69
70 return 0
71}