From 0ad80f3906bc6cbd4a2c360e9a745fb6ab66b2c9 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 15:58:11 +0100 Subject: [PATCH] Clarify frame assembly and keep reference PCM arithmetic signed --- src/call/call_headless.c | 1 + tests/test_call_headless_queue.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/call/call_headless.c b/src/call/call_headless.c index 235dd5ea..c5d8af36 100644 --- a/src/call/call_headless.c +++ b/src/call/call_headless.c @@ -118,6 +118,7 @@ static void ca_send_raw(struct call_audio_client* cli, const uint8_t* data, size } } +/* Собрать header+PCM до обращения к очереди, чтобы overflow не оставил часть фрейма. */ static void ca_write_frame(struct call_audio_client* cli, uint8_t type, uint64_t call_id, const uint8_t* data, uint16_t len) { if (len > CA_PCM_FRAME_BYTES || (len && !data)) { diff --git a/tests/test_call_headless_queue.c b/tests/test_call_headless_queue.c index 57decadf..2c580b21 100644 --- a/tests/test_call_headless_queue.c +++ b/tests/test_call_headless_queue.c @@ -82,7 +82,7 @@ static void fixture_start(struct queue_fixture* f) { /* Reference decoder видит и отброшенные кадры: его Opus-состояние совпадает с принимающим. */ static void emit_frame(struct queue_fixture* f, int retained) { int16_t pcm[CA_FRAME_SAMPLES], decoded[CA_FRAME_SAMPLES]; - for (int i = 0; i < CA_FRAME_SAMPLES; ++i) pcm[i] = (int16_t)((f->sequence * 73 + i * 31) % 6000 - 3000); + for (int i = 0; i < CA_FRAME_SAMPLES; ++i) pcm[i] = (int16_t)(((int)f->sequence * 73 + i * 31) % 6000 - 3000); ++f->sequence; uint8_t opus[256]; int len = opus_codec_encode(f->encoder, pcm, CA_FRAME_SAMPLES, opus, sizeof(opus)); CHECK(len > 0);