Fix call gap tone to follow 500ms of missing jitter PCM
This commit is contained in:
1 parent
9e3a417059
commit
1c51df039f
2 files changed
+68
-36
No files matched your search
@@ -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;
|
||||
}
|
||||
Reference in new issue
Block a user