code wiki / (root) / nx_audio_pcm_test.nx

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}