Skip to content

Commit e30945e

Browse files
committed
libsl,webui: add local track mute handling
1 parent abcd022 commit e30945e

9 files changed

Lines changed: 68 additions & 20 deletions

File tree

libsl/include/studiolink.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ struct slaudio *sl_track_audio(struct sl_track *track);
173173
int sl_track_dial(struct sl_track *track, struct pl *peer);
174174
void sl_track_accept(struct sl_track *track);
175175
void sl_track_hangup(struct sl_track *track);
176+
void sl_track_toggle_mute(struct sl_track *track);
176177
void sl_track_ws_send(void);
177178

178179

@@ -185,6 +186,7 @@ int sl_audio_close(void);
185186
int sl_audio_alloc(struct slaudio **audiop, struct sl_track *track);
186187
int slaudio_odict(struct odict **o, struct slaudio *a);
187188
int sl_audio_set_device(struct slaudio *audio, int play_idx, int src_idx);
189+
void sl_audio_mute(struct slaudio *audio, bool mute);
188190

189191

190192
/******************************************************************************

libsl/src/audio.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ struct amix {
2525
struct aumix_source *aumix_src;
2626
char *device;
2727
uint16_t speaker_id;
28-
bool muted;
2928
};
3029

3130
struct ausrc_st {
@@ -252,8 +251,6 @@ static int amix_alloc(struct amix **amixp, const char *device)
252251

253252
aumix_source_readh(amix->aumix_src, mix_readh);
254253

255-
amix->muted = true;
256-
257254
out:
258255
if (err) {
259256
mem_deref(amix);
@@ -322,7 +319,6 @@ static int src_alloc(struct ausrc_st **stp, const struct ausrc *as,
322319

323320
st->amix = mem_ref(amix);
324321

325-
/* aumix_source_mute(amix->aumix_src, amix->muted); */
326322
aumix_source_enable(amix->aumix_src, true);
327323

328324
warning("debug %H\n", aumix_debug, aumix);
@@ -396,7 +392,6 @@ static int play_alloc(struct auplay_st **stp, const struct auplay *ap,
396392

397393
st->amix = mem_ref(amix);
398394

399-
/* aumix_source_mute(amix->aumix_src, amix->muted); */
400395
aumix_source_enable(amix->aumix_src, true);
401396

402397
goto out;
@@ -666,6 +661,12 @@ int sl_audio_alloc(struct slaudio **audiop, struct sl_track *track)
666661
}
667662

668663

664+
void sl_audio_mute(struct slaudio *audio, bool mute)
665+
{
666+
aumix_source_mute(audio->mix_src, mute);
667+
}
668+
669+
669670
int sl_audio_init(void)
670671
{
671672
struct sl_config *conf = sl_conf();

libsl/src/http/server.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,22 @@ static void http_req_handler(struct http_conn *conn,
328328
goto out;
329329
}
330330

331+
332+
if (0 == pl_strcasecmp(&msg->path, "/api/v1/track/mute") &&
333+
0 == pl_strcasecmp(&msg->met, "POST")) {
334+
struct pl pltrack = PL_INIT;
335+
err = re_regex(msg->prm.p, msg->prm.l, "track=[0-9]+",
336+
&pltrack);
337+
if (err)
338+
goto err;
339+
340+
sl_track_toggle_mute(sl_track_by_id(pl_u32(&pltrack)));
341+
http_sreply(conn, 200, "OK", "text/html", "", 0);
342+
343+
goto out;
344+
}
345+
346+
331347
#ifndef RELEASE
332348
/* Default return OPTIONS - needed on dev for preflight CORS Check
333349
* @TODO: add release test */

libsl/src/tracks.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct sl_track {
2121
char name[64];
2222
char error[128];
2323
enum sl_track_status status;
24+
bool muted;
2425
union
2526
{
2627
struct local local;
@@ -90,6 +91,7 @@ int sl_tracks_json(struct re_printf *pf, void *arg)
9091
odict_entry_add(o_track, "name", ODICT_STRING, track->name);
9192
odict_entry_add(o_track, "status", ODICT_INT, track->status);
9293
odict_entry_add(o_track, "error", ODICT_STRING, track->error);
94+
odict_entry_add(o_track, "muted", ODICT_BOOL, track->muted);
9395
odict_entry_add(o_tracks, str_itoa(track->id, id, 10),
9496
ODICT_OBJECT, o_track);
9597
o_track = mem_deref(o_track);
@@ -170,6 +172,7 @@ int sl_track_add(struct sl_track **trackp, enum sl_track_type type)
170172
track->id = sl_track_next_id();
171173
track->type = type;
172174
track->status = SL_TRACK_IDLE;
175+
track->muted = false;
173176

174177
list_append(&tracks, &track->le, track);
175178
list_sort(&tracks, sort_handler, NULL);
@@ -302,6 +305,18 @@ void sl_track_hangup(struct sl_track *track)
302305
}
303306

304307

308+
void sl_track_toggle_mute(struct sl_track *track)
309+
{
310+
/* only allowed for local track currently */
311+
if (!track || track->id != 1)
312+
return;
313+
314+
local_track->muted = !local_track->muted;
315+
sl_audio_mute(local_track->u.local.slaudio, local_track->muted);
316+
sl_track_ws_send();
317+
}
318+
319+
305320
void sl_track_ws_send(void)
306321
{
307322
char *json_str = mem_zalloc(SL_MAX_JSON + 1, NULL);

test/integration.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ a_user_can_add_tracks() {
125125
[ "$track_count" == "2" ]
126126
}
127127

128+
a_user_can_mute_track() {
129+
curl_post /api/v1/track/mute?track=1
130+
}
131+
128132
a_user_can_delete_tracks() {
129133
track_count=$(ws_test /ws/v1/tracks | jq ".[].type" | grep -c remote)
130134
[ "$track_count" == "2" ]
@@ -152,6 +156,7 @@ main() {
152156
a_user_gets_404_if_page_not_exists
153157
a_user_can_connect_with_websocket
154158
a_user_can_add_tracks
159+
a_user_can_mute_track
155160
a_user_can_delete_tracks
156161
}
157162

test/src/tracks.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
static int test_track_add(void)
66
{
7-
char json_str[8192] = {0};
8-
struct odict *o = NULL;
7+
char json_str[8192] = {0};
8+
struct odict *o = NULL;
99
const struct odict_entry *o_entry = NULL;
1010
struct sl_track *track;
1111
int err;

webui/src/api.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ export default {
2828
api_request('DELETE', '/tracks', String(id));
2929
},
3030

31+
track_mute(id: number) {
32+
api_request('POST', '/track/mute?track=' + String(id), null);
33+
},
34+
3135
audio_device(track: number, mic: number, speaker: number) {
3236
api_request('PUT', '/audio/device?track=' + String(track), String(mic) + ";" + String(speaker));
3337
},
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<template>
22
<div class="flex justify-center space-x-5 sm:space-x-16 mb-5 mx-auto">
3-
<button :class="[muted ? 'bg-red-900 hover:bg-red-800' : 'bg-sl-08dp hover:bg-neutral-700']"
3+
<button :class="[tracks.isMuted(1) ? 'bg-red-900 hover:bg-red-800' : 'bg-sl-08dp hover:bg-neutral-700']"
44
class="rounded-full h-20 w-20 flex items-center justify-center shadow-sm uppercase font-semibold"
5-
@click="muted = !muted">
5+
@click="api.track_mute(1)">
66
Mute
77
</button>
88
<button :class="[record ? 'bg-red-900 hover:bg-red-800' : 'bg-sl-08dp hover:bg-neutral-700']"
@@ -13,16 +13,13 @@
1313
</div>
1414
</template>
1515

16-
<script lang="ts">
17-
import { defineComponent } from "vue";
16+
<script setup lang="ts">
17+
import { ref } from 'vue'
18+
import api from '../api'
19+
import { tracks} from '../states/tracks'
20+
21+
22+
const record = ref(false)
23+
1824
19-
export default defineComponent({
20-
data() {
21-
return {
22-
muted: false,
23-
record: false,
24-
chat: false
25-
};
26-
},
27-
});
2825
</script>

webui/src/states/tracks.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ interface Track {
2121
id: number
2222
name: string
2323
status: TrackStatus
24+
muted: boolean
2425
error: string
2526
}
2627

@@ -58,6 +59,7 @@ interface Tracks {
5859
websocket(ws_host: string): void
5960
isValid(id: number): boolean
6061
isSelected(id: number): boolean
62+
isMuted(id: number): boolean
6163
localState(id: number): LocalTrackStates
6264
select(id: number): void
6365
selected(): number,
@@ -109,12 +111,14 @@ export const tracks: Tracks = {
109111
error: "",
110112
local: LocalTrackStates.Setup,
111113
name: tracks[key].name,
114+
muted: tracks[key].muted
112115
}
113116
last_key = parseInt(key)
114117
}
115118

116119
this.state[tracks[key].id].name = tracks[key].name
117120
this.state[tracks[key].id].status = tracks[key].status
121+
this.state[tracks[key].id].muted = tracks[key].muted
118122

119123
if (tracks[key].type == 'local') {
120124
this.local_tracks.push(tracks[key])
@@ -152,6 +156,10 @@ export const tracks: Tracks = {
152156
return false
153157
},
154158

159+
isMuted(id: number): boolean {
160+
return this.state[id]?.muted
161+
},
162+
155163
localState(id: number): LocalTrackStates {
156164
return this.state[id].local
157165
},

0 commit comments

Comments
 (0)