diff --git a/lib/opus_codec.c b/lib/opus_codec.c index da07813d..b26f2a5e 100644 --- a/lib/opus_codec.c +++ b/lib/opus_codec.c @@ -151,6 +151,18 @@ int opus_codec_encoder_application_set(opus_codec_encoder_t* enc, int applicatio return opus_encoder_ctl(enc->opus_enc, OPUS_SET_APPLICATION(application)); } +int opus_codec_encoder_delay(opus_codec_encoder_t* enc, int* samples) { + if (!enc || !samples) { DEBUG_ERROR(DEBUG_CATEGORY_CALL, "Opus delay invalid arguments"); return -1; } + opus_int32 delay = 0; + int result = opus_encoder_ctl(enc->opus_enc, OPUS_GET_LOOKAHEAD(&delay)); + if (result != OPUS_OK || delay < 0 || delay > enc->sample_rate) { + DEBUG_ERROR(DEBUG_CATEGORY_CALL, "Opus delay query failed result=%d samples=%d", result, (int)delay); return -1; + } + *samples = delay; + DEBUG_DEBUG(DEBUG_CATEGORY_CALL, "Opus capture delay samples=%d rate=%d", (int)delay, enc->sample_rate); + return 0; +} + const char* opus_codec_strerror(int err) { switch (err) { case OPUS_OK: return "OK"; diff --git a/lib/opus_codec.h b/lib/opus_codec.h index 7c4e60f6..56eff22d 100644 --- a/lib/opus_codec.h +++ b/lib/opus_codec.h @@ -34,6 +34,8 @@ int opus_codec_encoder_bitrate_set(opus_codec_encoder_t* enc, int bitrate_bps); int opus_codec_encoder_complexity_set(opus_codec_encoder_t* enc, int complexity); int opus_codec_encoder_signal_set(opus_codec_encoder_t* enc, int signal_type); int opus_codec_encoder_application_set(opus_codec_encoder_t* enc, int application); +/* Задержка codec в сэмплах на канал; запрашивать после настройки encoder, не задавать константой. */ +int opus_codec_encoder_delay(opus_codec_encoder_t* enc, int* samples); const char* opus_codec_strerror(int err);