-
Notifications
You must be signed in to change notification settings - Fork 64
Expand file tree
/
Copy pathuseMultibandTrackVolume.ts
More file actions
106 lines (99 loc) · 2.99 KB
/
useMultibandTrackVolume.ts
File metadata and controls
106 lines (99 loc) · 2.99 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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import { type TrackReferenceOrPlaceholder } from '@livekit/components-react';
import {
Track,
type LocalAudioTrack,
type RemoteAudioTrack,
} from 'livekit-client';
import { useEffect, useMemo, useState } from 'react';
import { addListener, removeListener } from '../events/EventEmitter';
import LiveKitModule from '../LKNativeModule';
import type { MediaStreamTrack } from '@livekit/react-native-webrtc';
/**
* Interface for configuring options for the useMultibandTrackVolume hook.
* @alpha
*/
export interface MultiBandTrackVolumeOptions {
/**
* the number of bands to split the audio into
*/
bands?: number;
/**
* cut off frequency on the lower end
*/
minFrequency?: number;
/**
* cut off frequency on the higher end
*/
maxFrequency?: number;
/**
* update should run every x ms
*/
updateInterval?: number;
}
const multibandDefaults = {
bands: 5,
minFrequency: 1000,
maxFrequency: 8000,
updateInterval: 40,
} as const satisfies MultiBandTrackVolumeOptions;
/**
* A hook for tracking the volume of an audio track across multiple frequency bands.
*
* @param trackOrTrackReference
* @returns A number array containing the volume for each frequency band.
*/
export function useMultibandTrackVolume(
trackOrTrackReference?:
| LocalAudioTrack
| RemoteAudioTrack
| TrackReferenceOrPlaceholder,
options?: MultiBandTrackVolumeOptions
) {
const track =
trackOrTrackReference instanceof Track
? trackOrTrackReference
: <LocalAudioTrack | RemoteAudioTrack | undefined>(
trackOrTrackReference?.publication?.track
);
const opts = useMemo(() => {
return { ...multibandDefaults, ...options };
// disabled due to use of JSON.stringify, dependencies are reference equality
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [JSON.stringify(options)]);
const mediaStreamTrack = track?.mediaStreamTrack as
| MediaStreamTrack
| undefined;
const hasMediaStreamTrack = mediaStreamTrack != null;
const peerConnectionId = mediaStreamTrack?._peerConnectionId ?? -1;
const mediaStreamTrackId = mediaStreamTrack?.id;
let [magnitudes, setMagnitudes] = useState<number[]>([]);
useEffect(() => {
let listener = Object();
let reactTag: string | null = null;
if (hasMediaStreamTrack) {
reactTag = LiveKitModule.createMultibandVolumeProcessor(
opts,
peerConnectionId,
mediaStreamTrackId
);
addListener(listener, 'LK_MULTIBAND_PROCESSED', (event: any) => {
if (event.magnitudes && reactTag && event.id === reactTag) {
setMagnitudes(event.magnitudes);
}
});
}
return () => {
if (hasMediaStreamTrack) {
removeListener(listener);
if (reactTag) {
LiveKitModule.deleteMultibandVolumeProcessor(
reactTag,
peerConnectionId,
mediaStreamTrackId
);
}
}
};
}, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId, opts]);
return magnitudes;
}