|
|
|
|
@ -103,36 +103,36 @@ void process(void*) {
|
|
|
|
|
bridge.stopping = false; |
|
|
|
|
} |
|
|
|
|
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); |
|
|
|
|
if (result != STREAM_OK) { |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "desktop viewer open failed id=%llu group=%llx source=%llx result=%d", |
|
|
|
|
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); |
|
|
|
|
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, |
|
|
|
|
(unsigned long long)bridge.viewer.source, result); |
|
|
|
|
closeViewer(StreamRecordKind::Closed, reason); return; |
|
|
|
|
} |
|
|
|
|
output({bridge.viewer.id, 0, StreamRecordKind::Opened}); |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_STREAM, "desktop viewer opened id=%llu group=%llx source=%llx epoch=%llx", |
|
|
|
|
(unsigned long long)bridge.viewer.id, (unsigned long long)bridge.viewer.group, |
|
|
|
|
(unsigned long long)bridge.viewer.source, result); |
|
|
|
|
closeViewer(StreamRecordKind::Closed, reason); return; |
|
|
|
|
} |
|
|
|
|
output({bridge.viewer.id, 0, StreamRecordKind::Opened}); |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_STREAM, "desktop viewer opened id=%llu group=%llx source=%llx epoch=%llx", |
|
|
|
|
(unsigned long long)bridge.viewer.id, (unsigned long long)bridge.viewer.group, |
|
|
|
|
(unsigned long long)bridge.viewer.source, (unsigned long long)bridge.viewer.epoch); |
|
|
|
|
bridge.wantRead = true; |
|
|
|
|
(unsigned long long)bridge.viewer.source, (unsigned long long)bridge.viewer.epoch); |
|
|
|
|
bridge.wantRead = true; |
|
|
|
|
} |
|
|
|
|
if (!bridge.handle) return; |
|
|
|
|
if (bridge.resync) { |
|
|
|
|
|