diff --git a/src/server/s-comms.c b/src/server/s-comms.c
index 01e1be1..b4e2905 100644
--- a/src/server/s-comms.c
+++ b/src/server/s-comms.c
@@ -713,6 +713,19 @@ callback_ws(struct lws *wsi, enum lws_callback_reasons reason, void *user,
* yet, until we get the ws rx
*/
lws_dll2_add_head(&pss->same, &vhd->builders);
+
+ /*
+ * If viewers are already present, tell this new builder to
+ * start reporting immediately.
+ */
+ if (vhd->viewers_are_present) {
+ sai_viewer_state_t *vsend = calloc(1, sizeof(*vsend));
+ if (vsend) {
+ vsend->viewers = 1; /* true */
+ lws_dll2_add_tail(&vsend->list, &pss->viewer_state_owner);
+ lws_callback_on_writable(pss->wsi);
+ }
+ }
break;
}
diff --git a/src/server/s-private.h b/src/server/s-private.h
index c985720..1ff2a36 100644
--- a/src/server/s-private.h
+++ b/src/server/s-private.h
@@ -200,6 +200,7 @@ struct vhd {
const char *notification_key;
unsigned int browser_viewer_count;
+ unsigned int viewers_are_present:1;
sais_t server;
};
diff --git a/src/server/s-websrv.c b/src/server/s-websrv.c
index 9ad9faa..dd3f057 100644
--- a/src/server/s-websrv.c
+++ b/src/server/s-websrv.c
@@ -485,6 +485,7 @@ websrvss_ws_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
{
sai_viewer_state_t *vs = (sai_viewer_state_t *)a.dest;
unsigned int total_viewers = 0;
+ char old_viewers_present = !!m->vhd->viewers_are_present;
/* Store viewer count for this specific sai-web client */
m->viewers = vs->viewers;
@@ -494,23 +495,27 @@ websrvss_ws_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
sum_viewers_cb, &total_viewers);
m->vhd->browser_viewer_count = total_viewers;
- lwsl_notice("%s: Client viewer count %u\n",
- __func__, m->vhd->browser_viewer_count);
- /* Broadcast the new viewer state to all connected builders */
- lws_start_foreach_dll(struct lws_dll2 *, p, m->vhd->builders.head) {
- struct pss *pss_builder = lws_container_of(p,
- struct pss, same);
- sai_viewer_state_t *vsend = calloc(1, sizeof(*vsend));
+ m->vhd->viewers_are_present = !!total_viewers;
- if (vsend) {
- /* Send the new TOTAL viewer count */
- vsend->viewers = m->vhd->browser_viewer_count;
- lws_dll2_add_tail(&vsend->list,
- &pss_builder->viewer_state_owner);
- lws_callback_on_writable(pss_builder->wsi);
- }
- } lws_end_foreach_dll(p);
+ /*
+ * Only broadcast to builders if the state has changed
+ * from 0 viewers to >0, or from >0 viewers to 0.
+ */
+ if (old_viewers_present != m->vhd->viewers_are_present) {
+ lwsl_notice("%s: Viewer presence changed to %d. Broadcasting to builders.\n",
+ __func__, m->vhd->viewers_are_present);
+ lws_start_foreach_dll(struct lws_dll2 *, p, m->vhd->builders.head) {
+ struct pss *pss_builder = lws_container_of(p, struct pss, same);
+ sai_viewer_state_t *vsend = calloc(1, sizeof(*vsend));
+
+ if (vsend) {
+ vsend->viewers = m->vhd->viewers_are_present;
+ lws_dll2_add_tail(&vsend->list, &pss_builder->viewer_state_owner);
+ lws_callback_on_writable(pss_builder->wsi);
+ }
+ } lws_end_foreach_dll(p);
+ }
break;
}
}
@@ -567,21 +572,21 @@ websrvss_srv_state(void *userobj, void *sh, lws_ss_constate_t state,
lws_ss_server_foreach_client(m->vhd->h_ss_websrv,
sum_viewers_cb, &total_viewers);
- if (m->vhd->browser_viewer_count != total_viewers) {
- m->vhd->browser_viewer_count = total_viewers;
- lwsl_notice("%s: A sai-web client disconnected, total viewers now %u\n",
- __func__, total_viewers);
+ m->vhd->browser_viewer_count = total_viewers;
+ char new_viewers_present = !!total_viewers;
+
+ if (m->vhd->viewers_are_present != new_viewers_present) {
+ m->vhd->viewers_are_present = !!new_viewers_present;
+ lwsl_notice("%s: A sai-web client disconnected, viewer presence changed to %d. Broadcasting.\n",
+ __func__, new_viewers_present);
- /* Broadcast new count to builders */
+ /* Broadcast new presence state to builders */
lws_start_foreach_dll(struct lws_dll2 *, p, m->vhd->builders.head) {
- struct pss *pss_builder = lws_container_of(p,
- struct pss, same);
+ struct pss *pss_builder = lws_container_of(p, struct pss, same);
sai_viewer_state_t *vsend = calloc(1, sizeof(*vsend));
-
if (vsend) {
- vsend->viewers = m->vhd->browser_viewer_count;
- lws_dll2_add_tail(&vsend->list,
- &pss_builder->viewer_state_owner);
+ vsend->viewers = new_viewers_present;
+ lws_dll2_add_tail(&vsend->list, &pss_builder->viewer_state_owner);
lws_callback_on_writable(pss_builder->wsi);
}
} lws_end_foreach_dll(p);