Add local per-member radio mute controls on desktop and Android

This commit is contained in:
evgeny committed 2026-10-07 13:35:25 +02:00
1 parent a069d11ef9
commit 7e19cbaf3a
33 files changed
+735 -27

No files matched your search

+19 -3
View File
@@ -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; }