From 9ca0e613619e6ae798427bcd77340fa2d359e27b Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 19 Oct 2026 21:07:44 +0200 Subject: [PATCH] Expose nonblocking call clock access through both mutexes --- src/call/call_audio.c | 7 +++++++ src/call/call_audio.h | 3 +++ 2 files changed, 10 insertions(+) diff --git a/src/call/call_audio.c b/src/call/call_audio.c index 2500e03e..991425b4 100644 --- a/src/call/call_audio.c +++ b/src/call/call_audio.c @@ -577,6 +577,13 @@ int call_audio_get_clock(uint64_t call_id, int64_t now_us, struct call_clock_sna return present ? 0 : -1; } +int call_audio_try_clock(uint64_t call_id, int64_t now_us, struct call_clock_snapshot* out) { + memset(out, 0, sizeof(*out)); out->pts_us = -1; + if (pthread_mutex_trylock(&g_mtx)) return 0; + int result = g_active && call_id == g_call_id && g_vj ? call_jitter_try_clock(g_vj, now_us, out) : -1; + pthread_mutex_unlock(&g_mtx); return result; +} + int call_audio_get_diagnostics(uint64_t call_id, struct call_jitter_diagnostics* out) { if (!out) { DEBUG_ERROR(DEBUG_CATEGORY_CALL, "call diagnostics: missing output"); return -1; } memset(out, 0, sizeof(*out)); diff --git a/src/call/call_audio.h b/src/call/call_audio.h index 8a609035..e60e295d 100644 --- a/src/call/call_audio.h +++ b/src/call/call_audio.h @@ -72,6 +72,9 @@ void call_audio_on_media(struct UTUN_INSTANCE* inst, uint64_t call_id, void call_audio_playback_progress(uint64_t call_id, uint64_t epoch, uint64_t position, int64_t at_us, int64_t now_us, int measured); int call_audio_get_clock(uint64_t call_id, int64_t now_us, struct call_clock_snapshot* out); +/* Планировщик: 1 — снимок получен (valid может быть 0), 0 — одна из блокировок занята, + * -1 — звонка нет. out обязателен. BUSY не означает invalid и не сдвигает видеорасписание. */ +int call_audio_try_clock(uint64_t call_id, int64_t now_us, struct call_clock_snapshot* out); /* Playback worker: старый аппаратный якорь недействителен до progress нового выхода. PCM/JB сохраняются. */ void call_audio_suspend_device(uint64_t call_id, uint64_t epoch); /* Любой поток: диагностический снимок без потребления событий CALL_STATS. */