From 75bd6f1ce1a7e67d55ba6f376bb778ace2681ff3 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 13 Oct 2026 22:29:24 +0200 Subject: [PATCH] Notify media readers when indexed playback data becomes available --- src/stream/stream.c | 8 +++++++- src/stream/stream.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/stream/stream.c b/src/stream/stream.c index acae6656..fe815c78 100644 --- a/src/stream/stream.c +++ b/src/stream/stream.c @@ -327,6 +327,12 @@ static void session_media_work(void *arg) { stream_media_store_finish(s->media); if (!s->media_failed && s->media_next < s->next_seq) again = 1; } + if (!s->closing && s->service->callback && !s->service->stopping && s->owners > s->relay_owners) { + struct stream_event event = {.descriptor = s->descriptor, .type = STREAM_EVENT_AVAILABLE, .first_seq = s->media_next}; + s->service->dispatching++; + s->service->callback(s->service->inst, &event, s->service->arg); + s->service->dispatching--; + } s->holds--; if (s->closing) { if (!s->holds && !s->delivery) session_free(s); } else if (again) session_media_schedule(s); @@ -334,7 +340,7 @@ static void session_media_work(void *arg) { /* Индексация не зависит от позиции/паузы плеера и не создаёт отдельную очередь медиаданных. */ static void session_media_schedule(struct stream_session *s) { - if (!s->media || s->media_work || s->closing || s->media_failed || s->service->stopping) return; + if (!s->media || s->media_work || s->closing || s->service->stopping) return; s->media_work = uasync_call_soon(s->service->inst->ua, s, session_media_work); if (!s->media_work) DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "media index scheduling failed source=%llx", (unsigned long long)s->descriptor.source_node_id); diff --git a/src/stream/stream.h b/src/stream/stream.h index 4ea78179..d742ba23 100644 --- a/src/stream/stream.h +++ b/src/stream/stream.h @@ -20,7 +20,7 @@ struct stream_service; struct stream_parameters { uint8_t n, r; uint16_t block_size; }; /* block_size — максимум RS-части. */ -enum stream_event_type { STREAM_EVENT_DATA, STREAM_EVENT_GAP, STREAM_EVENT_END, STREAM_EVENT_CLOSED }; +enum stream_event_type { STREAM_EVENT_DATA, STREAM_EVENT_GAP, STREAM_EVENT_END, STREAM_EVENT_CLOSED, STREAM_EVENT_AVAILABLE }; enum stream_close_reason { STREAM_CLOSE_STOPPED, STREAM_CLOSE_GROUP, STREAM_CLOSE_SERVICE, STREAM_CLOSE_SOURCE_CHANGED, STREAM_CLOSE_MEMBER, STREAM_CLOSE_FAILED