|
|
|
|
@ -124,22 +124,36 @@ int main() {
|
|
|
|
|
uint8_t encoded[512]; |
|
|
|
|
int len = opus_codec_encode(encoder, voice, 960, encoded, sizeof(encoded)); |
|
|
|
|
CHECK(len > 0); |
|
|
|
|
// Без входных пакетов первые 500мс выходного аудио — строго тишина.
|
|
|
|
|
for (int tick = 0; tick < 50; tick++) { |
|
|
|
|
// Подготовка микрофона дольше 500мс не вызывает ложный сигнал потери звука.
|
|
|
|
|
for (int tick = 0; tick < 150; tick++) { |
|
|
|
|
CHECK(call_audio_pull_pcm(id, pcm, 480) == 480); |
|
|
|
|
for (auto value : pcm) CHECK(value == 0); |
|
|
|
|
} |
|
|
|
|
// Первый пакет ещё не заполнил запас PCM: продолжается тихое ожидание.
|
|
|
|
|
call_audio_on_media(nullptr, id, 0, 0, encoded, len); |
|
|
|
|
CHECK(call_audio_pull_pcm(id, pcm, 480) == 480); |
|
|
|
|
for (auto value : pcm) CHECK(value == 0); |
|
|
|
|
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); |
|
|
|
|
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; |
|
|
|
|
for (int tick = 0; tick < 120; tick++) { |
|
|
|
|
CHECK(call_audio_pull_pcm(id, pcm, 480) == 480); |
|
|
|
|
if (tick >= 60) for (auto value : pcm) if (std::abs((int)value) > 1000) audible = true; |
|
|
|
|
} |
|
|
|
|
CHECK(audible); |
|
|
|
|
for (int i = 1; i < 6; i++) call_audio_on_media(nullptr, id, i, 0, encoded, len); |
|
|
|
|
// Малого запаса недостаточно для восстановления: сигнал продолжает звучать.
|
|
|
|
|
call_audio_on_media(nullptr, id, 6, 0, encoded, len); |
|
|
|
|
audible = false; |
|
|
|
|
for (int tick = 0; tick < 100; tick++) { |
|
|
|
|
CHECK(call_audio_pull_pcm(id, pcm, 480) == 480); |
|
|
|
|
for (auto value : pcm) if (std::abs((int)value) > 1000) audible = true; |
|
|
|
|
} |
|
|
|
|
CHECK(audible); |
|
|
|
|
for (int i = 7; i < 30; 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); |
|
|
|
|
@ -147,23 +161,45 @@ int main() {
|
|
|
|
|
opus_codec_encoder_destroy(encoder); |
|
|
|
|
} |
|
|
|
|
{ |
|
|
|
|
// Порог проходит внутри блока: сначала ровно 500мс тишины, затем тон.
|
|
|
|
|
// После PCM порог 500мс работает и для блока, который не делит его нацело.
|
|
|
|
|
CHECK(call_audio_start(124) == 0); |
|
|
|
|
auto* encoder = opus_codec_encoder_create(48000, 1); |
|
|
|
|
CHECK(encoder); |
|
|
|
|
int16_t silence[960] = {}; |
|
|
|
|
uint8_t encoded[512]; |
|
|
|
|
int len = opus_codec_encode(encoder, silence, 960, encoded, sizeof(encoded)); |
|
|
|
|
CHECK(len > 0); |
|
|
|
|
for (int i = 0; i < 6; i++) call_audio_on_media(nullptr, 124, i, 0, encoded, len); |
|
|
|
|
std::vector<int16_t> output(777); |
|
|
|
|
for (int tick = 0; tick < 30; tick++) { |
|
|
|
|
under = 0; |
|
|
|
|
for (int tick = 0; tick < 30 && !under; tick++) { |
|
|
|
|
CHECK(call_audio_pull_pcm(124, output.data(), 777) == 777); |
|
|
|
|
CHECK(call_audio_get_stats(124, nullptr, nullptr, nullptr, &under, nullptr) == 0); |
|
|
|
|
} |
|
|
|
|
CHECK(under > 0); |
|
|
|
|
// Первый недобор занимает не более 777 сэмплов; ещё 29 блоков не достигают 500мс.
|
|
|
|
|
for (int tick = 0; tick < 29; tick++) { |
|
|
|
|
CHECK(call_audio_pull_pcm(124, output.data(), 777) == 777); |
|
|
|
|
for (auto value : output) CHECK(value == 0); |
|
|
|
|
for (auto value : output) CHECK(std::abs((int)value) <= 5); |
|
|
|
|
} |
|
|
|
|
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; |
|
|
|
|
for (int tick = 0; tick < 2; tick++) { |
|
|
|
|
CHECK(call_audio_pull_pcm(124, output.data(), 777) == 777); |
|
|
|
|
for (auto value : output) if (std::abs((int)value) > 1000) audible = true; |
|
|
|
|
} |
|
|
|
|
CHECK(audible); |
|
|
|
|
call_audio_release(124); |
|
|
|
|
opus_codec_encoder_destroy(encoder); |
|
|
|
|
// Новый звонок не наследует включённый тон и отсчёт предыдущего.
|
|
|
|
|
CHECK(call_audio_start(125) == 0); |
|
|
|
|
CHECK(call_audio_pull_pcm(125, output.data(), 777) == 777); |
|
|
|
|
for (auto value : output) CHECK(value == 0); |
|
|
|
|
// Завершение звучит даже у звонка, который ещё не получил первого PCM.
|
|
|
|
|
call_audio_begin_end(125); |
|
|
|
|
CHECK(call_audio_pull_pcm(125, output.data(), 777) == 777); |
|
|
|
|
audible = false; |
|
|
|
|
for (auto value : output) if (value) audible = true; |
|
|
|
|
CHECK(audible); |
|
|
|
|
call_audio_release(125); |
|
|
|
|
} |
|
|
|
|
std::printf("call_jitter: %s\n", failures ? "FAILED" : "PASSED"); |
|
|
|
|
|