Skip to content

Commit ec67dcb

Browse files
authored
Feat/#203-C: 캠/마이크 on/off 기능 (#209)
마이크가 켜진 상태일 때 꺼진 것으로 UI 상 표시되는 문제. 캠도 이와 같은 문제가 있었음. 이를 해결.
1 parent 9a9e649 commit ec67dcb

File tree

3 files changed

+59
-6
lines changed

3 files changed

+59
-6
lines changed

client/src/components/ConfMediaBar/index.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from 'react';
1+
import { useEffect, useState } from 'react';
22
import { useConfMediaStreams } from 'src/hooks/useConfMediaStreams';
33
import useSocketContext from 'src/hooks/useSocketContext';
44

@@ -8,10 +8,18 @@ import style from './style.module.scss';
88

99
function ConfMediaBar() {
1010
const { workspaceSocket: socket } = useSocketContext();
11-
const streams = useConfMediaStreams(socket);
11+
const [streams, setMyTrack] = useConfMediaStreams(socket);
1212

13-
const [isMicOn, setIsMicOn] = useState(false);
14-
const [isCamOn, setIsCamOn] = useState(false);
13+
const [isMicOn, setIsMicOn] = useState(true);
14+
const [isCamOn, setIsCamOn] = useState(true);
15+
16+
useEffect(() => {
17+
setMyTrack('audio', isMicOn);
18+
}, [isMicOn]);
19+
20+
useEffect(() => {
21+
setMyTrack('video', isCamOn);
22+
}, [isCamOn]);
1523

1624
return (
1725
<div className={style['conf-bar']}>

client/src/hooks/useConfMediaStreams.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,29 @@ import { useEffect, useState } from 'react';
22
import { Socket, io } from 'socket.io-client';
33
import { STUN_SERVER } from 'src/constants/rtc';
44
import RTC from 'src/utils/rtc';
5+
import { setTrack, TrackKind } from 'src/utils/trackSetter';
56

6-
export function useConfMediaStreams(socket: Socket) {
7+
export function useConfMediaStreams(socket: Socket):
8+
[Map<string, MediaStream>, (kind: TrackKind, turnOn: boolean) => void] {
79
const [mediaStreams, setMediaStreams] = useState<Map<string, MediaStream>>(
810
new Map(),
911
);
12+
const [myStream, setMyStream] = useState<MediaStream>();
13+
14+
const setMyTrack = async (kind: TrackKind, turnOn: boolean) => {
15+
if (!myStream) {
16+
return;
17+
}
18+
setTrack(myStream, kind, turnOn);
19+
};
1020

1121
const initRTC = async () => {
1222
const userMedia = await navigator.mediaDevices.getUserMedia({
1323
video: true,
1424
audio: true,
1525
});
26+
27+
setMyStream(userMedia);
1628
setMediaStreams((prev) =>
1729
copyMapWithOperation(prev, (map) => map.set('me', userMedia)),
1830
);
@@ -38,7 +50,7 @@ export function useConfMediaStreams(socket: Socket) {
3850
initRTC();
3951
}, []);
4052

41-
return mediaStreams;
53+
return [mediaStreams, setMyTrack];
4254
}
4355

4456
// TODO: 코드 반복때문에 만든 함수. 더 좋은 방법 있으면 고치기
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
export type TrackKind = 'audio' | 'video';
2+
3+
const getAllTracks = async (stream: MediaStream) => {
4+
if (!stream) {
5+
return;
6+
}
7+
8+
const tracks = stream.getTracks();
9+
return tracks;
10+
}
11+
12+
const getTrack = async (stream: MediaStream, kind: TrackKind) => {
13+
const tracks = await getAllTracks(stream);
14+
if (!tracks) {
15+
return;
16+
}
17+
18+
const track = tracks.find(track => track.kind === kind);
19+
return track;
20+
}
21+
22+
export const setTrack = async (stream: MediaStream, kind: TrackKind, turnOn: boolean) => {
23+
if (!stream) {
24+
return;
25+
}
26+
27+
const track = await getTrack(stream, kind);
28+
if (!track) {
29+
return;
30+
}
31+
32+
track.enabled = turnOn;
33+
}

0 commit comments

Comments
 (0)