Fix call gap tone to follow 500ms of missing jitter PCM

This commit is contained in:
evgeny committed 2026-09-30 21:14:37 +03:00
1 parent 9e3a417059
commit 1c51df039f
2 files changed
+68 -36

No files matched your search

+36 -16
View File
@@ -8,8 +8,6 @@
#include <cstdio>
#include <cstring>
#include <vector>
#include <chrono>
#include <thread>
static int failures;
#define CHECK(c) do { if (!(c)) { std::printf("FAIL line %d: %s\n", __LINE__, #c); failures++; } } while (0)
@@ -126,26 +124,48 @@ int main() {
uint8_t encoded[512];
int len = opus_codec_encode(encoder, voice, 960, encoded, sizeof(encoded));
CHECK(len > 0);
for (int i = 0; i < 3; i++) call_audio_on_media(nullptr, id, i, 0, encoded, len);
for (int i = 0; i < 30; i++) call_audio_pull_pcm(id, pcm, 480);
// Аудиоустройства и uasync в тесте нет: проверяем реальный срок включения сигнала.
std::this_thread::sleep_for(std::chrono::milliseconds(100));
call_audio_pull_pcm(id, pcm, 480);
bool silent = true;
for (auto value : pcm) if (value) silent = false;
CHECK(silent);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
call_audio_pull_pcm(id, pcm, 480);
silent = true;
for (auto value : pcm) if (value) silent = false;
CHECK(!silent);
for (int i = 0; i < 6; i++) call_audio_on_media(nullptr, id, i+3, 0, encoded, len);
// Без входных пакетов первые 500мс выходного аудио — строго тишина.
for (int tick = 0; tick < 50; tick++) {
CHECK(call_audio_pull_pcm(id, pcm, 480) == 480);
for (auto value : pcm) CHECK(value == 0);
}
CHECK(call_audio_pull_pcm(id, pcm, 480) == 480);
bool audible = false;
for (auto value : pcm) if (value) audible = true;
CHECK(audible);
// Один пакет не возобновляет PCM: писк продолжается при ожидании запаса.
call_audio_on_media(nullptr, id, 0, 0, encoded, len);
CHECK(call_audio_pull_pcm(id, pcm, 480) == 480);
audible = false;
for (auto value : pcm) if (value) audible = true;
CHECK(audible);
for (int i = 1; i < 6; i++) call_audio_on_media(nullptr, id, i, 0, encoded, len);
CHECK(call_audio_pull_pcm(id, pcm, 480) == 480);
call_audio_begin_end(id); // явное завершение прекращает догон и включает финальный тон
CHECK(call_audio_pull_pcm(id, pcm, 480) > 0);
call_audio_release(id);
opus_codec_encoder_destroy(encoder);
}
{
// Порог проходит внутри блока: сначала ровно 500мс тишины, затем тон.
CHECK(call_audio_start(124) == 0);
std::vector<int16_t> output(777);
for (int tick = 0; tick < 30; tick++) {
CHECK(call_audio_pull_pcm(124, output.data(), 777) == 777);
for (auto value : output) CHECK(value == 0);
}
CHECK(call_audio_pull_pcm(124, output.data(), 777) == 777);
for (int i = 0; i < 690; i++) CHECK(output[i] == 0);
bool audible = false;
for (int i = 690; i < 777; i++) if (output[i]) audible = true;
CHECK(audible);
call_audio_release(124);
// Новый звонок не наследует включённый тон и отсчёт предыдущего.
CHECK(call_audio_start(125) == 0);
CHECK(call_audio_pull_pcm(125, output.data(), 777) == 777);
for (auto value : output) CHECK(value == 0);
call_audio_release(125);
}
std::printf("call_jitter: %s\n", failures ? "FAILED" : "PASSED");
return failures ? 1 : 0;
}