|
|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
/* Настоящие workers/AEC; граница сервисного PCM заменена наблюдателями без сети/устройства. */ |
|
|
|
|
#include "../src/voice_audio_io.h" |
|
|
|
|
#include "../src/voice_capture_clock.h" |
|
|
|
|
#include "../src/voice_playback_buffer.h" |
|
|
|
|
extern "C" { |
|
|
|
|
#include "call/call_audio.h" |
|
|
|
|
#include "radio/radio_audio.h" |
|
|
|
|
@ -74,6 +75,18 @@ static void reset() {
|
|
|
|
|
} |
|
|
|
|
int main() { |
|
|
|
|
debug_config_init(); debug_set_level(DEBUG_LEVEL_WARN); |
|
|
|
|
// Резерв уменьшается только при стабильной работе; крупный callback и starvation повышают минимум.
|
|
|
|
|
VoicePlaybackBuffer buffering; |
|
|
|
|
buffering.sample(1, 512, false); |
|
|
|
|
buffering.sample(10000000, 512, false); REQUIRE(buffering.blocks == 2); |
|
|
|
|
buffering.sample(10000001, 512, false); REQUIRE(buffering.blocks == 1); |
|
|
|
|
buffering.sample(10020001, 512, true); REQUIRE(buffering.blocks == 2); |
|
|
|
|
buffering.sample(10020002, 512, true); REQUIRE(buffering.blocks == 2); |
|
|
|
|
buffering.sample(10520001, 512, true); REQUIRE(buffering.blocks == 3); |
|
|
|
|
buffering.sample(20520001, 2048, false); REQUIRE(buffering.blocks == 3); |
|
|
|
|
buffering.sample(30520001, 512, false); REQUIRE(buffering.blocks == 2); |
|
|
|
|
buffering.sample(40520001, 512, false); REQUIRE(buffering.blocks == 1); |
|
|
|
|
buffering.reset(); REQUIRE(buffering.blocks == 2); |
|
|
|
|
// Десять минут +/-300ppm дрейфа: связь с физическим временем сохраняется, шага >2мс нет.
|
|
|
|
|
for (double drift : {-0.0003, 0.0003}) { |
|
|
|
|
VoiceCaptureClock clock; |
|
|
|
|
@ -106,9 +119,12 @@ int main() {
|
|
|
|
|
voice.mix(partial, 240, now_us() + 500000); |
|
|
|
|
await([] { return output_position.load() == 240; }); |
|
|
|
|
REQUIRE(output_delay > 4500); |
|
|
|
|
auto latency = voice.outputLatency(); |
|
|
|
|
REQUIRE(latency.outputMs >= latency.queueMs + 450); |
|
|
|
|
voice.mix(partial, 720, now_us()); |
|
|
|
|
await([] { return output_position.load() == 960; }); |
|
|
|
|
voice.stop(); |
|
|
|
|
REQUIRE(voice.outputLatency().outputMs == -1); |
|
|
|
|
voice.start(VoiceAudioIo::Kind::Radio, 7); REQUIRE(voice.startCapture(1, false)); |
|
|
|
|
voice.capture(pcm.data(), 240, 0); voice.setPtt(true); |
|
|
|
|
voice.capture(pcm.data(), 360, 0); voice.setPtt(false); voice.capture(pcm.data(), 360, 0); |
|
|
|
|
|