Add local per-member radio mute controls on desktop and Android
This commit is contained in:
1 parent
a069d11ef9
commit
7e19cbaf3a
33 files changed
+735
-27
No files matched your search
+19
-3
@@ -56,6 +56,7 @@ enum rad_phase {
|
||||
P_WAIT_FLAGS,
|
||||
P_TALK1,
|
||||
P_WAIT_RX1,
|
||||
P_WAIT_MUTED_RELAY,
|
||||
P_RADIO_OFF_C,
|
||||
P_WAIT_OFF_C,
|
||||
P_TALK2,
|
||||
@@ -266,7 +267,8 @@ static int node_radio(struct UTUN_INSTANCE* inst, uint64_t nid) {
|
||||
static void rx_frame_cb(struct UTUN_INSTANCE* inst, uint64_t group_id,
|
||||
uint64_t src, uint16_t stream, uint16_t seq,
|
||||
uint8_t fin, const uint8_t* opus, int len, void* arg) {
|
||||
(void)inst; (void)group_id; (void)src; (void)opus; (void)len;
|
||||
(void)opus; (void)len;
|
||||
if (radio_member_muted(inst, group_id, src)) return; /* локальный аудио-потребитель */
|
||||
struct rx_evt* rx = (struct rx_evt*)arg;
|
||||
if (fin) {
|
||||
if (rx->active && stream == rx->stream) rx->fin_seen = 1;
|
||||
@@ -400,8 +402,22 @@ static void rad_tick(void* arg) {
|
||||
break;
|
||||
case P_WAIT_RX1:
|
||||
if (g_rx[IDX_B].frames == N_FRAMES && g_rx[IDX_B].fin_seen && g_rx[IDX_B].seq_ok
|
||||
&& g_rx[IDX_C].frames == N_FRAMES && g_rx[IDX_C].fin_seen && g_rx[IDX_C].seq_ok)
|
||||
&& g_rx[IDX_C].frames == N_FRAMES && g_rx[IDX_C].fin_seen && g_rx[IDX_C].seq_ok) {
|
||||
if (chat_core_toggle_member_radio_mute(B, CH_ID, na) < 0 || !radio_member_muted(B, gid, na) ||
|
||||
radio_member_muted(C, gid, na)) { t->result = 2; uasync_stop(t->ua); return; }
|
||||
memset(g_rx, 0, sizeof(g_rx)); do_talk(A);
|
||||
t->phase = P_WAIT_MUTED_RELAY;
|
||||
}
|
||||
break;
|
||||
case P_WAIT_MUTED_RELAY:
|
||||
if (g_rx[IDX_C].frames == N_FRAMES && g_rx[IDX_C].fin_seen && g_rx[IDX_C].seq_ok) {
|
||||
if (g_rx[IDX_B].frames || g_rx[IDX_B].fin_seen || !radio_is_active(B, gid) ||
|
||||
chat_core_toggle_member_radio_mute(B, CH_ID, na) < 0 || radio_member_muted(B, gid, na)) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_RADIO, "test: locally muted relay blocked downstream or local mute failed");
|
||||
t->result = 2; uasync_stop(t->ua); return;
|
||||
}
|
||||
t->phase = P_RADIO_OFF_C;
|
||||
}
|
||||
break;
|
||||
case P_RADIO_OFF_C:
|
||||
radio_set_active(C, gid, 0);
|
||||
@@ -492,7 +508,7 @@ int main(int argc, char** argv) {
|
||||
|
||||
printf("=== test_radio ===\n"); fflush(stdout);
|
||||
|
||||
TEST("radio: member snapshots/events + relay + off + withdraw"); {
|
||||
TEST("radio: member snapshots/events + local mute relay + off + withdraw"); {
|
||||
struct UASYNC* ua = uasync_create();
|
||||
if (!ua) { FAIL("uasync_create failed"); return 1; }
|
||||
|
||||
|
||||
Reference in new issue
Block a user