From 97fea6e80925b261a8ca1bbcc28174192cd0bb6c Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 14 Oct 2026 16:30:38 +0200 Subject: [PATCH] Use shared media opening in desktop and Android viewers --- .../libutun_lite/stream_bridge.c | 55 +++++-------------- tools/chatgui/transport/stream_bridge.cpp | 21 +------ 2 files changed, 18 insertions(+), 58 deletions(-) diff --git a/tools/chatgui-android/libutun_lite/stream_bridge.c b/tools/chatgui-android/libutun_lite/stream_bridge.c index 9fb76e94..4e28dbb7 100644 --- a/tools/chatgui-android/libutun_lite/stream_bridge.c +++ b/tools/chatgui-android/libutun_lite/stream_bridge.c @@ -7,7 +7,6 @@ #include "../../../src/utun_instance.h" #include "../../../src/chat/chat_core.h" #include "../../../src/stream/stream.h" -#include "../../../src/stream/stream_member.h" #include "../../../src/stream/stream_media.h" #include "../../../src/stream/stream_network.h" #include "../../../src/stream/stream_publisher.h" @@ -172,48 +171,24 @@ static void media_process(void *arg) { if (stream_watch_sources(media_inst, watch_group) != STREAM_OK) DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "Android stream source watch failed group=%llx", (unsigned long long)watch_group); } - struct android_media_session *sessions[] = {&viewer}; - for (unsigned i = 0; i < 1; i++) { - struct android_media_session *s = sessions[i]; - if (s->opening) { - if (s->stopping) { media_close(s, 5); continue; } - s->opening = 0; - int result = STREAM_OK; - s->reason = STREAM_CLOSE_FAILED; - if (s->source && s->expected_epoch) { - struct stream_member_state state; - result = stream_member_load(media_inst, s->group, s->source, &state, NULL); - if (result == STREAM_OK && (!state.published || state.source.source_epoch != s->expected_epoch)) { - DEBUG_WARN(DEBUG_CATEGORY_STREAM, "Android selected source changed group=%llx source=%llx expected=%llx actual=%llx", - (unsigned long long)s->group, (unsigned long long)s->source, (unsigned long long)s->expected_epoch, - (unsigned long long)(state.published ? state.source.source_epoch : 0)); - result = STREAM_ERR_CONFLICT; s->reason = STREAM_CLOSE_SOURCE_CHANGED; - } - } - if (result == STREAM_OK) result = s->source ? stream_subscribe_open(media_inst, s->group, s->source, &s->handle) - : stream_publish_open(media_inst, s->group, NULL, &s->handle); - if (result == STREAM_OK) result = stream_media_enable(s->handle, - s->source ? STREAM_MEDIA_TRACK_VIDEO | (s->listen_audio ? STREAM_MEDIA_TRACK_AUDIO : 0) : 0); - struct stream_info info; - if (result == STREAM_OK) { - result = stream_get_info(s->handle, &info); - if (result == STREAM_OK) { - s->epoch = info.descriptor.source_epoch; - if (s->expected_epoch && s->epoch != s->expected_epoch) { - DEBUG_WARN(DEBUG_CATEGORY_STREAM, "Android viewer opened stale epoch id=%llu", (unsigned long long)s->id); - result = STREAM_ERR_CONFLICT; s->reason = STREAM_CLOSE_SOURCE_CHANGED; - } - } - } + if (viewer.opening) { + if (viewer.stopping) media_close(&viewer, 5); + else { + viewer.opening = 0; + int result = stream_media_open(media_inst, viewer.group, viewer.source, viewer.expected_epoch, + STREAM_MEDIA_TRACK_VIDEO | (viewer.listen_audio ? STREAM_MEDIA_TRACK_AUDIO : 0), &viewer.handle); + viewer.reason = result == STREAM_ERR_CONFLICT ? STREAM_CLOSE_SOURCE_CHANGED : STREAM_CLOSE_FAILED; if (result != STREAM_OK) { DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "Android stream open failed id=%llu group=%llx source=%llx result=%d", - (unsigned long long)s->id, (unsigned long long)s->group, (unsigned long long)s->source, result); - media_close(s, 6); + (unsigned long long)viewer.id, (unsigned long long)viewer.group, (unsigned long long)viewer.source, result); + media_close(&viewer, 6); } else { - if (s->source) { viewer_status_id = s->id; memset(&viewer_status, 0, sizeof(viewer_status)); } - media_output(s->id, 4, NULL, 0, 0, NULL, 0); - DEBUG_INFO(DEBUG_CATEGORY_STREAM, "Android stream opened id=%llu publisher=%d group=%llx source=%llx", - (unsigned long long)s->id, !s->source, (unsigned long long)s->group, (unsigned long long)s->source); + viewer.epoch = viewer.expected_epoch; + viewer_status_id = viewer.id; memset(&viewer_status, 0, sizeof(viewer_status)); + media_output(viewer.id, 4, NULL, 0, 0, NULL, 0); + DEBUG_INFO(DEBUG_CATEGORY_STREAM, "Android viewer opened id=%llu group=%llx source=%llx epoch=%llx", + (unsigned long long)viewer.id, (unsigned long long)viewer.group, + (unsigned long long)viewer.source, (unsigned long long)viewer.epoch); } } } diff --git a/tools/chatgui/transport/stream_bridge.cpp b/tools/chatgui/transport/stream_bridge.cpp index 24346786..e1ddb676 100644 --- a/tools/chatgui/transport/stream_bridge.cpp +++ b/tools/chatgui/transport/stream_bridge.cpp @@ -9,7 +9,6 @@ extern "C" { #include "../../../lib/u_async.h" #include "../../../src/utun_instance.h" #include "../../../src/stream/stream.h" -#include "../../../src/stream/stream_member.h" } namespace { @@ -114,23 +113,9 @@ void process(void*) { if (bridge.opening) { bridge.opening = false; bridge.viewer = bridge.requested; bridge.requested = {}; bridge.status = {}; bridge.statusId = bridge.viewer.id; bridge.position = -1; bridge.waiting = false; - stream_member_state member{}; - int reason = STREAM_CLOSE_FAILED; - int result = stream_member_load(bridge.inst, bridge.viewer.group, bridge.viewer.source, &member, nullptr); - if (result == STREAM_OK && (!member.published || member.source.source_epoch != bridge.viewer.epoch)) { - DEBUG_WARN(DEBUG_CATEGORY_STREAM, "desktop selected source changed source=%llx expected=%llx actual=%llx", - (unsigned long long)bridge.viewer.source, (unsigned long long)bridge.viewer.epoch, - (unsigned long long)(member.published ? member.source.source_epoch : 0)); - result = STREAM_ERR_CONFLICT; reason = STREAM_CLOSE_SOURCE_CHANGED; - } - if (result == STREAM_OK) result = stream_subscribe_open(bridge.inst, bridge.viewer.group, bridge.viewer.source, &bridge.handle); - stream_info info{}; - if (result == STREAM_OK) result = stream_get_info(bridge.handle, &info); - if (result == STREAM_OK && info.descriptor.source_epoch != bridge.viewer.epoch) { - DEBUG_WARN(DEBUG_CATEGORY_STREAM, "desktop reader encountered stale local epoch"); - result = STREAM_ERR_CONFLICT; reason = STREAM_CLOSE_SOURCE_CHANGED; - } - if (result == STREAM_OK) result = stream_media_enable(bridge.handle, STREAM_MEDIA_TRACK_VIDEO | STREAM_MEDIA_TRACK_AUDIO); + int result = stream_media_open(bridge.inst, bridge.viewer.group, bridge.viewer.source, bridge.viewer.epoch, + STREAM_MEDIA_TRACK_VIDEO | STREAM_MEDIA_TRACK_AUDIO, &bridge.handle); + int reason = result == STREAM_ERR_CONFLICT ? STREAM_CLOSE_SOURCE_CHANGED : STREAM_CLOSE_FAILED; if (result != STREAM_OK) { DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "desktop viewer open failed id=%llu group=%llx source=%llx result=%d", (unsigned long long)bridge.viewer.id, (unsigned long long)bridge.viewer.group,