|
|
|
|
@ -103,50 +103,50 @@ int main() {
|
|
|
|
|
|
|
|
|
|
TEST("single-source: decode через jitter-буфер выдаёт ненулевой PCM"); { |
|
|
|
|
radio_audio_start(GID); |
|
|
|
|
push_const(SRC_A, 1, 10000, 5); |
|
|
|
|
int mx = pull_max_abs(10); |
|
|
|
|
push_const(SRC_A, 1, 10000, 8); |
|
|
|
|
int mx = pull_max_abs(16); |
|
|
|
|
radio_audio_stop(); |
|
|
|
|
if (mx > 1000) OK(); else FAIL("max|pcm|=%d (ожидали > 1000)", mx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST("mixing: два источника складываются (soft-clip)"); { |
|
|
|
|
radio_audio_start(GID); |
|
|
|
|
push_const(SRC_A, 1, 20000, 5); |
|
|
|
|
push_const(SRC_B, 1, 20000, 5); |
|
|
|
|
int mx = pull_max_abs(10); |
|
|
|
|
push_const(SRC_A, 1, 20000, 8); |
|
|
|
|
push_const(SRC_B, 1, 20000, 8); |
|
|
|
|
int mx = pull_max_abs(16); |
|
|
|
|
radio_audio_stop(); |
|
|
|
|
if (mx > 30000) OK(); else FAIL("max|pcm|=%d (ожидали > 30000 — сумма двух источников)", mx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST("reorder: seq 0,2,1,3 воспроизводятся в порядке 0,1,2,3"); { |
|
|
|
|
const int npulls = 12; |
|
|
|
|
int freqs[4] = {300, 1000, 2000, 3000}; |
|
|
|
|
uint8_t pkt[4][256]; |
|
|
|
|
int lens[4]; |
|
|
|
|
TEST("reorder: seq 0,2,1,3,5,4 воспроизводятся в порядке 0,1,2,3,4,5"); { |
|
|
|
|
const int npulls = 16; |
|
|
|
|
int freqs[6] = {300, 1000, 2000, 3000, 4000, 5000}; |
|
|
|
|
uint8_t pkt[6][256]; |
|
|
|
|
int lens[6]; |
|
|
|
|
int ok = 0; |
|
|
|
|
if (encode_frames(freqs, 4, pkt, lens)) { |
|
|
|
|
int seqs_in[4] = {0, 1, 2, 3}, idx_in[4] = {0, 1, 2, 3}; |
|
|
|
|
int seqs_out[4] = {0, 2, 1, 3}, idx_out[4] = {0, 2, 1, 3}; |
|
|
|
|
if (encode_frames(freqs, 6, pkt, lens)) { |
|
|
|
|
int seqs_in[6] = {0, 1, 2, 3, 4, 5}, idx_in[6] = {0, 1, 2, 3, 4, 5}; |
|
|
|
|
int seqs_out[6] = {0, 2, 1, 3, 5, 4}, idx_out[6] = {0, 2, 1, 3, 5, 4}; |
|
|
|
|
int16_t buf_in[npulls * 960], buf_out[npulls * 960]; |
|
|
|
|
run_burst(pkt, lens, seqs_in, idx_in, 4, buf_in, npulls); |
|
|
|
|
run_burst(pkt, lens, seqs_out, idx_out, 4, buf_out, npulls); |
|
|
|
|
run_burst(pkt, lens, seqs_in, idx_in, 6, buf_in, npulls); |
|
|
|
|
run_burst(pkt, lens, seqs_out, idx_out, 6, buf_out, npulls); |
|
|
|
|
ok = (memcmp(buf_in, buf_out, sizeof(buf_in)) == 0); |
|
|
|
|
} |
|
|
|
|
if (ok) OK(); else FAIL("out-of-order должен дать тот же PCM, что и in-order (reorder не сработал)"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST("late seq: кадр с seq < next_seq дропается"); { |
|
|
|
|
const int npulls = 12; |
|
|
|
|
int freqs[4] = {300, 1000, 2000, 3000}; |
|
|
|
|
uint8_t pkt[4][256]; |
|
|
|
|
int lens[4]; |
|
|
|
|
const int npulls = 16; |
|
|
|
|
int freqs[6] = {300, 1000, 2000, 3000, 4000, 5000}; |
|
|
|
|
uint8_t pkt[6][256]; |
|
|
|
|
int lens[6]; |
|
|
|
|
int ok = 0; |
|
|
|
|
if (encode_frames(freqs, 4, pkt, lens)) { |
|
|
|
|
int seqs_ref[4] = {0, 1, 2, 3}, idx_ref[4] = {0, 1, 2, 3}; |
|
|
|
|
int seqs_late[5] = {0, 1, 2, 3, 0}, idx_late[5] = {0, 1, 2, 3, 0}; /* последний — поздний дубль seq=0 */ |
|
|
|
|
if (encode_frames(freqs, 6, pkt, lens)) { |
|
|
|
|
int seqs_ref[6] = {0, 1, 2, 3, 4, 5}, idx_ref[6] = {0, 1, 2, 3, 4, 5}; |
|
|
|
|
int seqs_late[7] = {0, 1, 2, 3, 4, 5, 0}, idx_late[7] = {0, 1, 2, 3, 4, 5, 0}; /* последний — поздний дубль seq=0 */ |
|
|
|
|
int16_t buf_ref[npulls * 960], buf_late[npulls * 960]; |
|
|
|
|
run_burst(pkt, lens, seqs_ref, idx_ref, 4, buf_ref, npulls); |
|
|
|
|
run_burst(pkt, lens, seqs_late, idx_late, 5, buf_late, npulls); |
|
|
|
|
run_burst(pkt, lens, seqs_ref, idx_ref, 6, buf_ref, npulls); |
|
|
|
|
run_burst(pkt, lens, seqs_late, idx_late, 7, buf_late, npulls); |
|
|
|
|
ok = (memcmp(buf_ref, buf_late, sizeof(buf_ref)) == 0); |
|
|
|
|
} |
|
|
|
|
if (ok) OK(); else FAIL("поздний дубль seq=0 должен быть дропнут (PCM совпадает с эталоном)"); |
|
|
|
|
|