forked from livekit/client-sdk-react-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseTrackVolume.ts
More file actions
68 lines (64 loc) · 1.97 KB
/
useTrackVolume.ts
File metadata and controls
68 lines (64 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { type TrackReferenceOrPlaceholder } from '@livekit/components-react';
import {
Track,
type LocalAudioTrack,
type RemoteAudioTrack,
} from 'livekit-client';
import { useEffect, useState } from 'react';
import { addListener, removeListener } from '../events/EventEmitter';
import LiveKitModule from '../LKNativeModule';
import type { MediaStreamTrack } from '@livekit/react-native-webrtc';
/**
* A hook for tracking the volume of an audio track.
*
* @param trackOrTrackReference
* @returns A number between 0-1 representing the volume.
*/
export function useTrackVolume(
trackOrTrackReference?:
| LocalAudioTrack
| RemoteAudioTrack
| TrackReferenceOrPlaceholder
) {
const track =
trackOrTrackReference instanceof Track
? trackOrTrackReference
: <LocalAudioTrack | RemoteAudioTrack | undefined>(
trackOrTrackReference?.publication?.track
);
const mediaStreamTrack = track?.mediaStreamTrack as
| MediaStreamTrack
| undefined;
const hasMediaStreamTrack = mediaStreamTrack != null;
const peerConnectionId = mediaStreamTrack?._peerConnectionId ?? -1;
const mediaStreamTrackId = mediaStreamTrack?.id;
let [volume, setVolume] = useState(0.0);
useEffect(() => {
let listener = Object();
let reactTag: string | null = null;
if (hasMediaStreamTrack) {
reactTag = LiveKitModule.createVolumeProcessor(
peerConnectionId,
mediaStreamTrackId
);
addListener(listener, 'LK_VOLUME_PROCESSED', (event: any) => {
if (event.volume && reactTag && event.id === reactTag) {
setVolume(event.volume);
}
});
}
return () => {
if (hasMediaStreamTrack) {
removeListener(listener);
if (reactTag) {
LiveKitModule.deleteVolumeProcessor(
reactTag,
peerConnectionId,
mediaStreamTrackId
);
}
}
};
}, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId]);
return volume;
}