diff --git a/Makefile b/Makefile index d94f17e02..fdbb2824e 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ AVS_RELEASE := 0 AVS_VERSION := 0.0.$(VER_PATCH) endif -MK_COMPONENTS := toolchain contrib avs tools test android iosx dist +MK_COMPONENTS := toolchain contrib avs tools test android iosx dist scan #--- Configuration --- diff --git a/include/avs_econn.h b/include/avs_econn.h index ec551965a..e47dfd46b 100644 --- a/include/avs_econn.h +++ b/include/avs_econn.h @@ -210,11 +210,18 @@ struct econn_message { struct econn; +enum group_part_muted_state { + MUTED_STATE_UNKNOWN, + MUTED_STATE_MUTED, + MUTED_STATE_UNMUTED +}; + /* member of participant list */ struct econn_group_part { char *userid; char *clientid; bool authorized; + enum group_part_muted_state muted_state; uint32_t ssrca; uint32_t ssrcv; diff --git a/mk/scan.mk b/mk/scan.mk new file mode 100644 index 000000000..d129cf3ab --- /dev/null +++ b/mk/scan.mk @@ -0,0 +1,29 @@ +# +# Makefile Snippet for make scan +# +# + + +SCAN_DIR :=$(BUILD_BASE)/scan +SCAN_EXE := $(shell which scan-build) + +ifeq ($(SCAN_EXE),) + LLVM_ROOT := /usr/local/Cellar/llvm + LLVM_VER := $(shell ls -1 $(LLVM_ROOT) | tail -1) + SCAN_EXE := $(LLVM_ROOT)/$(LLVM_VER)/bin/scan-build +endif + +.PHONY: scan + +scan: + @mkdir -p $(SCAN_DIR) + @$(MAKE) avs_clean + @$(MAKE) contrib + @$(SCAN_EXE) -o $(SCAN_DIR) make $(JOBS) avs + + +.PHONY: scan_clean + +scan_clean: + @rm -rf $(SCAN_DIR) + diff --git a/src/ccall/ccall.c b/src/ccall/ccall.c index 7358f84d5..9e30955f3 100644 --- a/src/ccall/ccall.c +++ b/src/ccall/ccall.c @@ -1550,6 +1550,8 @@ static void ecall_confpart_handler(struct ecall *ecall, struct userinfo *u = find_userinfo_by_hash(ccall, p->userid, p->clientid); if (u) { + bool muted; + if (first && u->se_approved) { info("ccall(%p): setting %s.%s as keygenerator\n", ccall, @@ -1571,12 +1573,30 @@ static void ecall_confpart_handler(struct ecall *ecall, ccall->someone_left = true; u->incall_prev = false; sync_decoders = true; + list_changed = true; } u->incall_now = true; u->ssrca = p->ssrca; u->ssrcv = p->ssrcv; - list_changed = true; + + switch (p->muted_state) { + case MUTED_STATE_UNKNOWN: + muted = u->muted; + break; + case MUTED_STATE_MUTED: + muted = true; + break; + case MUTED_STATE_UNMUTED: + muted = false; + break; + } + + if (muted != u->muted) { + u->muted = muted; + list_changed = true; + } + u->listpos = listpos; listpos++; } @@ -1599,7 +1619,6 @@ static void ecall_confpart_handler(struct ecall *ecall, missing_parts = true; u->listpos = listpos; listpos++; - continue; } } diff --git a/src/econn_fmt/msg.c b/src/econn_fmt/msg.c index bfa0ce948..21367ada6 100644 --- a/src/econn_fmt/msg.c +++ b/src/econn_fmt/msg.c @@ -79,6 +79,19 @@ static int econn_parts_encode(struct json_object *jobj, re_snprintf(ssrc, sizeof(ssrc), "%u", part->ssrcv); jzon_add_str(jpart, "ssrc_video", "%s", ssrc); + switch(part->muted_state) { + case MUTED_STATE_UNMUTED: + jzon_add_bool(jpart, "muted", false); + break; + + case MUTED_STATE_MUTED: + jzon_add_bool(jpart, "muted", true); + break; + + default: + break; + } + json_object_array_add(jparts, jpart); } @@ -121,6 +134,7 @@ static bool part_decode_handler(const char *key, struct json_object *jobj, struct econn_group_part *part; struct list *partl = arg; const char *ssrc; + bool muted; int err; part = mem_zalloc(sizeof(*part), part_destructor); @@ -135,6 +149,16 @@ static bool part_decode_handler(const char *key, struct json_object *jobj, if (err) goto out; + err = jzon_bool(&muted, jobj, "muted"); + if (err) { + err = 0; + part->muted_state = MUTED_STATE_UNKNOWN; + } + else { + part->muted_state = + muted ? MUTED_STATE_MUTED : MUTED_STATE_UNMUTED; + } + ssrc = jzon_str(jobj, "ssrc_audio"); if (ssrc) sscanf(ssrc, "%u", &part->ssrca); @@ -950,7 +974,6 @@ int econn_message_decode(struct econn_message **msgp, err = jzon_int(&status, jobj, "status"); if (err) { status = 0; - err = 0; } msg->u.confconn.status = (enum econn_confconn_status) status; @@ -959,7 +982,6 @@ int econn_message_decode(struct econn_message **msgp, err = jzon_bool(&selective_audio, jobj, "selective_audio"); if (err) { selective_audio = false; - err = 0; } msg->u.confconn.selective_audio = selective_audio; @@ -967,7 +989,6 @@ int econn_message_decode(struct econn_message **msgp, err = jzon_bool(&selective_video, jobj, "selective_video"); if (err) { selective_video = false; - err = 0; } msg->u.confconn.selective_video = selective_video; diff --git a/src/peerflow/peerflow.cpp b/src/peerflow/peerflow.cpp index fe3caa15a..44d7f7053 100644 --- a/src/peerflow/peerflow.cpp +++ b/src/peerflow/peerflow.cpp @@ -2086,6 +2086,7 @@ bool peerflow_is_gathered(const struct iflow *iflow) return false; state = pf->peerConn->ice_gathering_state(); + info("pf(%p): is_gathered state %d\n", iflow, state); return pf->gathered; } diff --git a/src/peerflow/stats.h b/src/peerflow/stats.h index 7bfec3ce7..180149b62 100644 --- a/src/peerflow/stats.h +++ b/src/peerflow/stats.h @@ -87,8 +87,11 @@ class NetStatsCallback : public rtc::RefCountedObject