@livekit/react-native 2.6.4 → 2.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/livekit/reactnative/audio/processing/AudioRecordSamplesDispatcher.kt +2 -1
- package/android/src/main/java/com/livekit/reactnative/audio/processing/AudioSinkManager.kt +8 -2
- package/lib/commonjs/hooks/useMultibandTrackVolume.js +13 -8
- package/lib/commonjs/hooks/useMultibandTrackVolume.js.map +1 -1
- package/lib/commonjs/hooks/useTrackVolume.js +8 -5
- package/lib/commonjs/hooks/useTrackVolume.js.map +1 -1
- package/lib/module/hooks/useMultibandTrackVolume.js +13 -8
- package/lib/module/hooks/useMultibandTrackVolume.js.map +1 -1
- package/lib/module/hooks/useTrackVolume.js +8 -5
- package/lib/module/hooks/useTrackVolume.js.map +1 -1
- package/lib/typescript/lib/commonjs/hooks/useMultibandTrackVolume.d.ts +1 -1
- package/lib/typescript/lib/module/hooks/useMultibandTrackVolume.d.ts +1 -1
- package/package.json +1 -1
- package/src/hooks/useMultibandTrackVolume.ts +15 -10
- package/src/hooks/useTrackVolume.ts +10 -7
|
@@ -21,13 +21,14 @@ import android.os.SystemClock
|
|
|
21
21
|
import org.webrtc.AudioTrackSink
|
|
22
22
|
import org.webrtc.audio.JavaAudioDeviceModule
|
|
23
23
|
import java.nio.ByteBuffer
|
|
24
|
+
import java.util.Collections
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* Dispatches recorded audio samples from the local microphone.
|
|
27
28
|
*/
|
|
28
29
|
class AudioRecordSamplesDispatcher : JavaAudioDeviceModule.SamplesReadyCallback {
|
|
29
30
|
|
|
30
|
-
private val sinks = mutableSetOf<AudioTrackSink>()
|
|
31
|
+
private val sinks = Collections.synchronizedSet(mutableSetOf<AudioTrackSink>())
|
|
31
32
|
|
|
32
33
|
@Synchronized
|
|
33
34
|
fun registerSink(sink: AudioTrackSink) {
|
|
@@ -5,13 +5,14 @@ import com.livekit.reactnative.LiveKitReactNative
|
|
|
5
5
|
import com.oney.WebRTCModule.WebRTCModule
|
|
6
6
|
import org.webrtc.AudioTrack
|
|
7
7
|
import org.webrtc.AudioTrackSink
|
|
8
|
+
import java.util.Collections
|
|
8
9
|
import java.util.UUID
|
|
9
10
|
|
|
10
11
|
private const val LOCAL_PC_ID = -1
|
|
11
12
|
|
|
12
13
|
class AudioSinkManager(val reactContext: ReactContext) {
|
|
13
14
|
|
|
14
|
-
private val sinks = mutableMapOf<String, AudioTrackSink>()
|
|
15
|
+
private val sinks = Collections.synchronizedMap(mutableMapOf<String, AudioTrackSink>())
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* Registers a sink to this manager.
|
|
@@ -35,7 +36,12 @@ class AudioSinkManager(val reactContext: ReactContext) {
|
|
|
35
36
|
* Unregisters a sink from this manager. Does not detach the sink from tracks.
|
|
36
37
|
*/
|
|
37
38
|
fun unregisterSink(sink: AudioTrackSink) {
|
|
38
|
-
sinks
|
|
39
|
+
synchronized(sinks) {
|
|
40
|
+
val keysToRemove = sinks.filterValues { it == sink }.keys
|
|
41
|
+
for(key in keysToRemove) {
|
|
42
|
+
sinks.remove(key)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
39
45
|
}
|
|
40
46
|
|
|
41
47
|
fun getSink(reactTag: String) = sinks[reactTag]
|
|
@@ -27,7 +27,7 @@ const multibandDefaults = {
|
|
|
27
27
|
* @param trackOrTrackReference
|
|
28
28
|
* @returns A number array containing the volume for each frequency band.
|
|
29
29
|
*/
|
|
30
|
-
function useMultibandTrackVolume(trackOrTrackReference, options
|
|
30
|
+
function useMultibandTrackVolume(trackOrTrackReference, options) {
|
|
31
31
|
var _trackOrTrackReferenc;
|
|
32
32
|
const track = trackOrTrackReference instanceof _livekitClient.Track ? trackOrTrackReference : trackOrTrackReference === null || trackOrTrackReference === void 0 || (_trackOrTrackReferenc = trackOrTrackReference.publication) === null || _trackOrTrackReferenc === void 0 ? void 0 : _trackOrTrackReferenc.track;
|
|
33
33
|
const opts = (0, _react.useMemo)(() => {
|
|
@@ -35,30 +35,35 @@ function useMultibandTrackVolume(trackOrTrackReference, options = {}) {
|
|
|
35
35
|
...multibandDefaults,
|
|
36
36
|
...options
|
|
37
37
|
};
|
|
38
|
-
|
|
38
|
+
|
|
39
|
+
// disabled due to use of JSON.stringify, dependencies are reference equality
|
|
40
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
41
|
+
}, [JSON.stringify(options)]);
|
|
39
42
|
const mediaStreamTrack = track === null || track === void 0 ? void 0 : track.mediaStreamTrack;
|
|
43
|
+
const hasMediaStreamTrack = mediaStreamTrack != null;
|
|
44
|
+
const peerConnectionId = (mediaStreamTrack === null || mediaStreamTrack === void 0 ? void 0 : mediaStreamTrack.peerConnectionId) ?? -1;
|
|
45
|
+
const mediaStreamTrackId = mediaStreamTrack === null || mediaStreamTrack === void 0 ? void 0 : mediaStreamTrack.id;
|
|
40
46
|
let [magnitudes, setMagnitudes] = (0, _react.useState)([]);
|
|
41
47
|
(0, _react.useEffect)(() => {
|
|
42
48
|
let listener = Object();
|
|
43
49
|
let reactTag = null;
|
|
44
|
-
if (
|
|
45
|
-
reactTag = _LKNativeModule.default.createMultibandVolumeProcessor(opts,
|
|
50
|
+
if (hasMediaStreamTrack) {
|
|
51
|
+
reactTag = _LKNativeModule.default.createMultibandVolumeProcessor(opts, peerConnectionId, mediaStreamTrackId);
|
|
46
52
|
(0, _EventEmitter.addListener)(listener, 'LK_MULTIBAND_PROCESSED', event => {
|
|
47
53
|
if (event.magnitudes && reactTag && event.id === reactTag) {
|
|
48
|
-
console.log('event received: ', event.magnitudes[0]);
|
|
49
54
|
setMagnitudes(event.magnitudes);
|
|
50
55
|
}
|
|
51
56
|
});
|
|
52
57
|
}
|
|
53
58
|
return () => {
|
|
54
|
-
if (
|
|
59
|
+
if (hasMediaStreamTrack) {
|
|
55
60
|
(0, _EventEmitter.removeListener)(listener);
|
|
56
61
|
if (reactTag) {
|
|
57
|
-
_LKNativeModule.default.deleteMultibandVolumeProcessor(reactTag,
|
|
62
|
+
_LKNativeModule.default.deleteMultibandVolumeProcessor(reactTag, peerConnectionId, mediaStreamTrackId);
|
|
58
63
|
}
|
|
59
64
|
}
|
|
60
65
|
};
|
|
61
|
-
}, [
|
|
66
|
+
}, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId, opts]);
|
|
62
67
|
return magnitudes;
|
|
63
68
|
}
|
|
64
69
|
//# sourceMappingURL=useMultibandTrackVolume.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_livekitClient","require","_react","_EventEmitter","_LKNativeModule","_interopRequireDefault","e","__esModule","default","multibandDefaults","bands","minFrequency","maxFrequency","updateInterval","useMultibandTrackVolume","trackOrTrackReference","options","_trackOrTrackReferenc","track","Track","publication","opts","useMemo","mediaStreamTrack","
|
|
1
|
+
{"version":3,"names":["_livekitClient","require","_react","_EventEmitter","_LKNativeModule","_interopRequireDefault","e","__esModule","default","multibandDefaults","bands","minFrequency","maxFrequency","updateInterval","useMultibandTrackVolume","trackOrTrackReference","options","_trackOrTrackReferenc","track","Track","publication","opts","useMemo","JSON","stringify","mediaStreamTrack","hasMediaStreamTrack","peerConnectionId","mediaStreamTrackId","id","magnitudes","setMagnitudes","useState","useEffect","listener","Object","reactTag","LiveKitModule","createMultibandVolumeProcessor","addListener","event","removeListener","deleteMultibandVolumeProcessor"],"sources":["useMultibandTrackVolume.ts"],"sourcesContent":["import { type TrackReferenceOrPlaceholder } from '@livekit/components-react';\nimport {\n Track,\n type LocalAudioTrack,\n type RemoteAudioTrack,\n} from 'livekit-client';\nimport { useEffect, useMemo, useState } from 'react';\nimport { addListener, removeListener } from '../events/EventEmitter';\nimport LiveKitModule from '../LKNativeModule';\n\n/**\n * Interface for configuring options for the useMultibandTrackVolume hook.\n * @alpha\n */\nexport interface MultiBandTrackVolumeOptions {\n /**\n * the number of bands to split the audio into\n */\n bands?: number;\n /**\n * cut off frequency on the lower end\n */\n minFrequency?: number;\n /**\n * cut off frequency on the higher end\n */\n maxFrequency?: number;\n /**\n * update should run every x ms\n */\n updateInterval?: number;\n}\n\nconst multibandDefaults = {\n bands: 5,\n minFrequency: 1000,\n maxFrequency: 8000,\n updateInterval: 40,\n} as const satisfies MultiBandTrackVolumeOptions;\n\n/**\n * A hook for tracking the volume of an audio track across multiple frequency bands.\n *\n * @param trackOrTrackReference\n * @returns A number array containing the volume for each frequency band.\n */\nexport function useMultibandTrackVolume(\n trackOrTrackReference?:\n | LocalAudioTrack\n | RemoteAudioTrack\n | TrackReferenceOrPlaceholder,\n options?: MultiBandTrackVolumeOptions\n) {\n const track =\n trackOrTrackReference instanceof Track\n ? trackOrTrackReference\n : <LocalAudioTrack | RemoteAudioTrack | undefined>(\n trackOrTrackReference?.publication?.track\n );\n const opts = useMemo(() => {\n return { ...multibandDefaults, ...options };\n\n // disabled due to use of JSON.stringify, dependencies are reference equality\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(options)]);\n const mediaStreamTrack = track?.mediaStreamTrack;\n const hasMediaStreamTrack = mediaStreamTrack != null;\n const peerConnectionId = mediaStreamTrack?.peerConnectionId ?? -1;\n const mediaStreamTrackId = mediaStreamTrack?.id;\n\n let [magnitudes, setMagnitudes] = useState<number[]>([]);\n useEffect(() => {\n let listener = Object();\n let reactTag: string | null = null;\n if (hasMediaStreamTrack) {\n reactTag = LiveKitModule.createMultibandVolumeProcessor(\n opts,\n peerConnectionId,\n mediaStreamTrackId\n );\n addListener(listener, 'LK_MULTIBAND_PROCESSED', (event: any) => {\n if (event.magnitudes && reactTag && event.id === reactTag) {\n setMagnitudes(event.magnitudes);\n }\n });\n }\n return () => {\n if (hasMediaStreamTrack) {\n removeListener(listener);\n if (reactTag) {\n LiveKitModule.deleteMultibandVolumeProcessor(\n reactTag,\n peerConnectionId,\n mediaStreamTrackId\n );\n }\n }\n };\n }, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId, opts]);\n\n return magnitudes;\n}\n"],"mappings":";;;;;;AACA,IAAAA,cAAA,GAAAC,OAAA;AAKA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAC,sBAAA,CAAAJ,OAAA;AAA8C,SAAAI,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE9C;AACA;AACA;AACA;;AAoBA,MAAMG,iBAAiB,GAAG;EACxBC,KAAK,EAAE,CAAC;EACRC,YAAY,EAAE,IAAI;EAClBC,YAAY,EAAE,IAAI;EAClBC,cAAc,EAAE;AAClB,CAAgD;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,uBAAuBA,CACrCC,qBAG+B,EAC/BC,OAAqC,EACrC;EAAA,IAAAC,qBAAA;EACA,MAAMC,KAAK,GACTH,qBAAqB,YAAYI,oBAAK,GAClCJ,qBAAqB,GAEnBA,qBAAqB,aAArBA,qBAAqB,gBAAAE,qBAAA,GAArBF,qBAAqB,CAAEK,WAAW,cAAAH,qBAAA,uBAAlCA,qBAAA,CAAoCC,KACrC;EACP,MAAMG,IAAI,GAAG,IAAAC,cAAO,EAAC,MAAM;IACzB,OAAO;MAAE,GAAGb,iBAAiB;MAAE,GAAGO;IAAQ,CAAC;;IAE3C;IACA;EACF,CAAC,EAAE,CAACO,IAAI,CAACC,SAAS,CAACR,OAAO,CAAC,CAAC,CAAC;EAC7B,MAAMS,gBAAgB,GAAGP,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEO,gBAAgB;EAChD,MAAMC,mBAAmB,GAAGD,gBAAgB,IAAI,IAAI;EACpD,MAAME,gBAAgB,GAAG,CAAAF,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAEE,gBAAgB,KAAI,CAAC,CAAC;EACjE,MAAMC,kBAAkB,GAAGH,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAEI,EAAE;EAE/C,IAAI,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAG,IAAAC,eAAQ,EAAW,EAAE,CAAC;EACxD,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAIC,QAAQ,GAAGC,MAAM,CAAC,CAAC;IACvB,IAAIC,QAAuB,GAAG,IAAI;IAClC,IAAIV,mBAAmB,EAAE;MACvBU,QAAQ,GAAGC,uBAAa,CAACC,8BAA8B,CACrDjB,IAAI,EACJM,gBAAgB,EAChBC,kBACF,CAAC;MACD,IAAAW,yBAAW,EAACL,QAAQ,EAAE,wBAAwB,EAAGM,KAAU,IAAK;QAC9D,IAAIA,KAAK,CAACV,UAAU,IAAIM,QAAQ,IAAII,KAAK,CAACX,EAAE,KAAKO,QAAQ,EAAE;UACzDL,aAAa,CAACS,KAAK,CAACV,UAAU,CAAC;QACjC;MACF,CAAC,CAAC;IACJ;IACA,OAAO,MAAM;MACX,IAAIJ,mBAAmB,EAAE;QACvB,IAAAe,4BAAc,EAACP,QAAQ,CAAC;QACxB,IAAIE,QAAQ,EAAE;UACZC,uBAAa,CAACK,8BAA8B,CAC1CN,QAAQ,EACRT,gBAAgB,EAChBC,kBACF,CAAC;QACH;MACF;IACF,CAAC;EACH,CAAC,EAAE,CAACF,mBAAmB,EAAEC,gBAAgB,EAAEC,kBAAkB,EAAEP,IAAI,CAAC,CAAC;EAErE,OAAOS,UAAU;AACnB","ignoreList":[]}
|
|
@@ -19,12 +19,15 @@ function useTrackVolume(trackOrTrackReference) {
|
|
|
19
19
|
var _trackOrTrackReferenc;
|
|
20
20
|
const track = trackOrTrackReference instanceof _livekitClient.Track ? trackOrTrackReference : trackOrTrackReference === null || trackOrTrackReference === void 0 || (_trackOrTrackReferenc = trackOrTrackReference.publication) === null || _trackOrTrackReferenc === void 0 ? void 0 : _trackOrTrackReferenc.track;
|
|
21
21
|
const mediaStreamTrack = track === null || track === void 0 ? void 0 : track.mediaStreamTrack;
|
|
22
|
+
const hasMediaStreamTrack = mediaStreamTrack != null;
|
|
23
|
+
const peerConnectionId = mediaStreamTrack.peerConnectionId ?? -1;
|
|
24
|
+
const mediaStreamTrackId = mediaStreamTrack.id;
|
|
22
25
|
let [volume, setVolume] = (0, _react.useState)(0.0);
|
|
23
26
|
(0, _react.useEffect)(() => {
|
|
24
27
|
let listener = Object();
|
|
25
28
|
let reactTag = null;
|
|
26
|
-
if (
|
|
27
|
-
reactTag = _LKNativeModule.default.createVolumeProcessor(
|
|
29
|
+
if (hasMediaStreamTrack) {
|
|
30
|
+
reactTag = _LKNativeModule.default.createVolumeProcessor(peerConnectionId, mediaStreamTrackId);
|
|
28
31
|
(0, _EventEmitter.addListener)(listener, 'LK_VOLUME_PROCESSED', event => {
|
|
29
32
|
if (event.volume && reactTag && event.id === reactTag) {
|
|
30
33
|
setVolume(event.volume);
|
|
@@ -32,14 +35,14 @@ function useTrackVolume(trackOrTrackReference) {
|
|
|
32
35
|
});
|
|
33
36
|
}
|
|
34
37
|
return () => {
|
|
35
|
-
if (
|
|
38
|
+
if (hasMediaStreamTrack) {
|
|
36
39
|
(0, _EventEmitter.removeListener)(listener);
|
|
37
40
|
if (reactTag) {
|
|
38
|
-
_LKNativeModule.default.deleteVolumeProcessor(reactTag,
|
|
41
|
+
_LKNativeModule.default.deleteVolumeProcessor(reactTag, peerConnectionId, mediaStreamTrackId);
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
44
|
};
|
|
42
|
-
}, [
|
|
45
|
+
}, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId]);
|
|
43
46
|
return volume;
|
|
44
47
|
}
|
|
45
48
|
//# sourceMappingURL=useTrackVolume.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_livekitClient","require","_react","_EventEmitter","_LKNativeModule","_interopRequireDefault","e","__esModule","default","useTrackVolume","trackOrTrackReference","_trackOrTrackReferenc","track","Track","publication","mediaStreamTrack","volume","setVolume","useState","useEffect","listener","Object","reactTag","LiveKitModule","createVolumeProcessor","
|
|
1
|
+
{"version":3,"names":["_livekitClient","require","_react","_EventEmitter","_LKNativeModule","_interopRequireDefault","e","__esModule","default","useTrackVolume","trackOrTrackReference","_trackOrTrackReferenc","track","Track","publication","mediaStreamTrack","hasMediaStreamTrack","peerConnectionId","mediaStreamTrackId","id","volume","setVolume","useState","useEffect","listener","Object","reactTag","LiveKitModule","createVolumeProcessor","addListener","event","removeListener","deleteVolumeProcessor"],"sources":["useTrackVolume.ts"],"sourcesContent":["import { type TrackReferenceOrPlaceholder } from '@livekit/components-react';\nimport {\n Track,\n type LocalAudioTrack,\n type RemoteAudioTrack,\n} from 'livekit-client';\nimport { useEffect, useState } from 'react';\nimport { addListener, removeListener } from '../events/EventEmitter';\nimport LiveKitModule from '../LKNativeModule';\n\n/**\n * A hook for tracking the volume of an audio track.\n *\n * @param trackOrTrackReference\n * @returns A number between 0-1 representing the volume.\n */\nexport function useTrackVolume(\n trackOrTrackReference?:\n | LocalAudioTrack\n | RemoteAudioTrack\n | TrackReferenceOrPlaceholder\n) {\n const track =\n trackOrTrackReference instanceof Track\n ? trackOrTrackReference\n : <LocalAudioTrack | RemoteAudioTrack | undefined>(\n trackOrTrackReference?.publication?.track\n );\n\n const mediaStreamTrack = track?.mediaStreamTrack;\n const hasMediaStreamTrack = mediaStreamTrack != null;\n const peerConnectionId = mediaStreamTrack.peerConnectionId ?? -1;\n const mediaStreamTrackId = mediaStreamTrack.id;\n\n let [volume, setVolume] = useState(0.0);\n useEffect(() => {\n let listener = Object();\n let reactTag: string | null = null;\n if (hasMediaStreamTrack) {\n reactTag = LiveKitModule.createVolumeProcessor(\n peerConnectionId,\n mediaStreamTrackId\n );\n addListener(listener, 'LK_VOLUME_PROCESSED', (event: any) => {\n if (event.volume && reactTag && event.id === reactTag) {\n setVolume(event.volume);\n }\n });\n }\n return () => {\n if (hasMediaStreamTrack) {\n removeListener(listener);\n if (reactTag) {\n LiveKitModule.deleteVolumeProcessor(\n reactTag,\n peerConnectionId,\n mediaStreamTrackId\n );\n }\n }\n };\n }, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId]);\n\n return volume;\n}\n"],"mappings":";;;;;;AACA,IAAAA,cAAA,GAAAC,OAAA;AAKA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAC,sBAAA,CAAAJ,OAAA;AAA8C,SAAAI,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE9C;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,cAAcA,CAC5BC,qBAG+B,EAC/B;EAAA,IAAAC,qBAAA;EACA,MAAMC,KAAK,GACTF,qBAAqB,YAAYG,oBAAK,GAClCH,qBAAqB,GAEnBA,qBAAqB,aAArBA,qBAAqB,gBAAAC,qBAAA,GAArBD,qBAAqB,CAAEI,WAAW,cAAAH,qBAAA,uBAAlCA,qBAAA,CAAoCC,KACrC;EAEP,MAAMG,gBAAgB,GAAGH,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEG,gBAAgB;EAChD,MAAMC,mBAAmB,GAAGD,gBAAgB,IAAI,IAAI;EACpD,MAAME,gBAAgB,GAAGF,gBAAgB,CAACE,gBAAgB,IAAI,CAAC,CAAC;EAChE,MAAMC,kBAAkB,GAAGH,gBAAgB,CAACI,EAAE;EAE9C,IAAI,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAG,IAAAC,eAAQ,EAAC,GAAG,CAAC;EACvC,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAIC,QAAQ,GAAGC,MAAM,CAAC,CAAC;IACvB,IAAIC,QAAuB,GAAG,IAAI;IAClC,IAAIV,mBAAmB,EAAE;MACvBU,QAAQ,GAAGC,uBAAa,CAACC,qBAAqB,CAC5CX,gBAAgB,EAChBC,kBACF,CAAC;MACD,IAAAW,yBAAW,EAACL,QAAQ,EAAE,qBAAqB,EAAGM,KAAU,IAAK;QAC3D,IAAIA,KAAK,CAACV,MAAM,IAAIM,QAAQ,IAAII,KAAK,CAACX,EAAE,KAAKO,QAAQ,EAAE;UACrDL,SAAS,CAACS,KAAK,CAACV,MAAM,CAAC;QACzB;MACF,CAAC,CAAC;IACJ;IACA,OAAO,MAAM;MACX,IAAIJ,mBAAmB,EAAE;QACvB,IAAAe,4BAAc,EAACP,QAAQ,CAAC;QACxB,IAAIE,QAAQ,EAAE;UACZC,uBAAa,CAACK,qBAAqB,CACjCN,QAAQ,EACRT,gBAAgB,EAChBC,kBACF,CAAC;QACH;MACF;IACF,CAAC;EACH,CAAC,EAAE,CAACF,mBAAmB,EAAEC,gBAAgB,EAAEC,kBAAkB,CAAC,CAAC;EAE/D,OAAOE,MAAM;AACf","ignoreList":[]}
|
|
@@ -21,7 +21,7 @@ const multibandDefaults = {
|
|
|
21
21
|
* @param trackOrTrackReference
|
|
22
22
|
* @returns A number array containing the volume for each frequency band.
|
|
23
23
|
*/
|
|
24
|
-
export function useMultibandTrackVolume(trackOrTrackReference, options
|
|
24
|
+
export function useMultibandTrackVolume(trackOrTrackReference, options) {
|
|
25
25
|
var _trackOrTrackReferenc;
|
|
26
26
|
const track = trackOrTrackReference instanceof Track ? trackOrTrackReference : trackOrTrackReference === null || trackOrTrackReference === void 0 || (_trackOrTrackReferenc = trackOrTrackReference.publication) === null || _trackOrTrackReferenc === void 0 ? void 0 : _trackOrTrackReferenc.track;
|
|
27
27
|
const opts = useMemo(() => {
|
|
@@ -29,30 +29,35 @@ export function useMultibandTrackVolume(trackOrTrackReference, options = {}) {
|
|
|
29
29
|
...multibandDefaults,
|
|
30
30
|
...options
|
|
31
31
|
};
|
|
32
|
-
|
|
32
|
+
|
|
33
|
+
// disabled due to use of JSON.stringify, dependencies are reference equality
|
|
34
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
35
|
+
}, [JSON.stringify(options)]);
|
|
33
36
|
const mediaStreamTrack = track === null || track === void 0 ? void 0 : track.mediaStreamTrack;
|
|
37
|
+
const hasMediaStreamTrack = mediaStreamTrack != null;
|
|
38
|
+
const peerConnectionId = (mediaStreamTrack === null || mediaStreamTrack === void 0 ? void 0 : mediaStreamTrack.peerConnectionId) ?? -1;
|
|
39
|
+
const mediaStreamTrackId = mediaStreamTrack === null || mediaStreamTrack === void 0 ? void 0 : mediaStreamTrack.id;
|
|
34
40
|
let [magnitudes, setMagnitudes] = useState([]);
|
|
35
41
|
useEffect(() => {
|
|
36
42
|
let listener = Object();
|
|
37
43
|
let reactTag = null;
|
|
38
|
-
if (
|
|
39
|
-
reactTag = LiveKitModule.createMultibandVolumeProcessor(opts,
|
|
44
|
+
if (hasMediaStreamTrack) {
|
|
45
|
+
reactTag = LiveKitModule.createMultibandVolumeProcessor(opts, peerConnectionId, mediaStreamTrackId);
|
|
40
46
|
addListener(listener, 'LK_MULTIBAND_PROCESSED', event => {
|
|
41
47
|
if (event.magnitudes && reactTag && event.id === reactTag) {
|
|
42
|
-
console.log('event received: ', event.magnitudes[0]);
|
|
43
48
|
setMagnitudes(event.magnitudes);
|
|
44
49
|
}
|
|
45
50
|
});
|
|
46
51
|
}
|
|
47
52
|
return () => {
|
|
48
|
-
if (
|
|
53
|
+
if (hasMediaStreamTrack) {
|
|
49
54
|
removeListener(listener);
|
|
50
55
|
if (reactTag) {
|
|
51
|
-
LiveKitModule.deleteMultibandVolumeProcessor(reactTag,
|
|
56
|
+
LiveKitModule.deleteMultibandVolumeProcessor(reactTag, peerConnectionId, mediaStreamTrackId);
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
59
|
};
|
|
55
|
-
}, [
|
|
60
|
+
}, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId, opts]);
|
|
56
61
|
return magnitudes;
|
|
57
62
|
}
|
|
58
63
|
//# sourceMappingURL=useMultibandTrackVolume.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Track","useEffect","useMemo","useState","addListener","removeListener","LiveKitModule","multibandDefaults","bands","minFrequency","maxFrequency","updateInterval","useMultibandTrackVolume","trackOrTrackReference","options","_trackOrTrackReferenc","track","publication","opts","mediaStreamTrack","
|
|
1
|
+
{"version":3,"names":["Track","useEffect","useMemo","useState","addListener","removeListener","LiveKitModule","multibandDefaults","bands","minFrequency","maxFrequency","updateInterval","useMultibandTrackVolume","trackOrTrackReference","options","_trackOrTrackReferenc","track","publication","opts","JSON","stringify","mediaStreamTrack","hasMediaStreamTrack","peerConnectionId","mediaStreamTrackId","id","magnitudes","setMagnitudes","listener","Object","reactTag","createMultibandVolumeProcessor","event","deleteMultibandVolumeProcessor"],"sources":["useMultibandTrackVolume.ts"],"sourcesContent":["import { type TrackReferenceOrPlaceholder } from '@livekit/components-react';\nimport {\n Track,\n type LocalAudioTrack,\n type RemoteAudioTrack,\n} from 'livekit-client';\nimport { useEffect, useMemo, useState } from 'react';\nimport { addListener, removeListener } from '../events/EventEmitter';\nimport LiveKitModule from '../LKNativeModule';\n\n/**\n * Interface for configuring options for the useMultibandTrackVolume hook.\n * @alpha\n */\nexport interface MultiBandTrackVolumeOptions {\n /**\n * the number of bands to split the audio into\n */\n bands?: number;\n /**\n * cut off frequency on the lower end\n */\n minFrequency?: number;\n /**\n * cut off frequency on the higher end\n */\n maxFrequency?: number;\n /**\n * update should run every x ms\n */\n updateInterval?: number;\n}\n\nconst multibandDefaults = {\n bands: 5,\n minFrequency: 1000,\n maxFrequency: 8000,\n updateInterval: 40,\n} as const satisfies MultiBandTrackVolumeOptions;\n\n/**\n * A hook for tracking the volume of an audio track across multiple frequency bands.\n *\n * @param trackOrTrackReference\n * @returns A number array containing the volume for each frequency band.\n */\nexport function useMultibandTrackVolume(\n trackOrTrackReference?:\n | LocalAudioTrack\n | RemoteAudioTrack\n | TrackReferenceOrPlaceholder,\n options?: MultiBandTrackVolumeOptions\n) {\n const track =\n trackOrTrackReference instanceof Track\n ? trackOrTrackReference\n : <LocalAudioTrack | RemoteAudioTrack | undefined>(\n trackOrTrackReference?.publication?.track\n );\n const opts = useMemo(() => {\n return { ...multibandDefaults, ...options };\n\n // disabled due to use of JSON.stringify, dependencies are reference equality\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(options)]);\n const mediaStreamTrack = track?.mediaStreamTrack;\n const hasMediaStreamTrack = mediaStreamTrack != null;\n const peerConnectionId = mediaStreamTrack?.peerConnectionId ?? -1;\n const mediaStreamTrackId = mediaStreamTrack?.id;\n\n let [magnitudes, setMagnitudes] = useState<number[]>([]);\n useEffect(() => {\n let listener = Object();\n let reactTag: string | null = null;\n if (hasMediaStreamTrack) {\n reactTag = LiveKitModule.createMultibandVolumeProcessor(\n opts,\n peerConnectionId,\n mediaStreamTrackId\n );\n addListener(listener, 'LK_MULTIBAND_PROCESSED', (event: any) => {\n if (event.magnitudes && reactTag && event.id === reactTag) {\n setMagnitudes(event.magnitudes);\n }\n });\n }\n return () => {\n if (hasMediaStreamTrack) {\n removeListener(listener);\n if (reactTag) {\n LiveKitModule.deleteMultibandVolumeProcessor(\n reactTag,\n peerConnectionId,\n mediaStreamTrackId\n );\n }\n }\n };\n }, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId, opts]);\n\n return magnitudes;\n}\n"],"mappings":"AACA,SACEA,KAAK,QAGA,gBAAgB;AACvB,SAASC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACpD,SAASC,WAAW,EAAEC,cAAc,QAAQ,wBAAwB;AACpE,OAAOC,aAAa,MAAM,mBAAmB;;AAE7C;AACA;AACA;AACA;;AAoBA,MAAMC,iBAAiB,GAAG;EACxBC,KAAK,EAAE,CAAC;EACRC,YAAY,EAAE,IAAI;EAClBC,YAAY,EAAE,IAAI;EAClBC,cAAc,EAAE;AAClB,CAAgD;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,uBAAuBA,CACrCC,qBAG+B,EAC/BC,OAAqC,EACrC;EAAA,IAAAC,qBAAA;EACA,MAAMC,KAAK,GACTH,qBAAqB,YAAYb,KAAK,GAClCa,qBAAqB,GAEnBA,qBAAqB,aAArBA,qBAAqB,gBAAAE,qBAAA,GAArBF,qBAAqB,CAAEI,WAAW,cAAAF,qBAAA,uBAAlCA,qBAAA,CAAoCC,KACrC;EACP,MAAME,IAAI,GAAGhB,OAAO,CAAC,MAAM;IACzB,OAAO;MAAE,GAAGK,iBAAiB;MAAE,GAAGO;IAAQ,CAAC;;IAE3C;IACA;EACF,CAAC,EAAE,CAACK,IAAI,CAACC,SAAS,CAACN,OAAO,CAAC,CAAC,CAAC;EAC7B,MAAMO,gBAAgB,GAAGL,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEK,gBAAgB;EAChD,MAAMC,mBAAmB,GAAGD,gBAAgB,IAAI,IAAI;EACpD,MAAME,gBAAgB,GAAG,CAAAF,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAEE,gBAAgB,KAAI,CAAC,CAAC;EACjE,MAAMC,kBAAkB,GAAGH,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAEI,EAAE;EAE/C,IAAI,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAGxB,QAAQ,CAAW,EAAE,CAAC;EACxDF,SAAS,CAAC,MAAM;IACd,IAAI2B,QAAQ,GAAGC,MAAM,CAAC,CAAC;IACvB,IAAIC,QAAuB,GAAG,IAAI;IAClC,IAAIR,mBAAmB,EAAE;MACvBQ,QAAQ,GAAGxB,aAAa,CAACyB,8BAA8B,CACrDb,IAAI,EACJK,gBAAgB,EAChBC,kBACF,CAAC;MACDpB,WAAW,CAACwB,QAAQ,EAAE,wBAAwB,EAAGI,KAAU,IAAK;QAC9D,IAAIA,KAAK,CAACN,UAAU,IAAII,QAAQ,IAAIE,KAAK,CAACP,EAAE,KAAKK,QAAQ,EAAE;UACzDH,aAAa,CAACK,KAAK,CAACN,UAAU,CAAC;QACjC;MACF,CAAC,CAAC;IACJ;IACA,OAAO,MAAM;MACX,IAAIJ,mBAAmB,EAAE;QACvBjB,cAAc,CAACuB,QAAQ,CAAC;QACxB,IAAIE,QAAQ,EAAE;UACZxB,aAAa,CAAC2B,8BAA8B,CAC1CH,QAAQ,EACRP,gBAAgB,EAChBC,kBACF,CAAC;QACH;MACF;IACF,CAAC;EACH,CAAC,EAAE,CAACF,mBAAmB,EAAEC,gBAAgB,EAAEC,kBAAkB,EAAEN,IAAI,CAAC,CAAC;EAErE,OAAOQ,UAAU;AACnB","ignoreList":[]}
|
|
@@ -13,12 +13,15 @@ export function useTrackVolume(trackOrTrackReference) {
|
|
|
13
13
|
var _trackOrTrackReferenc;
|
|
14
14
|
const track = trackOrTrackReference instanceof Track ? trackOrTrackReference : trackOrTrackReference === null || trackOrTrackReference === void 0 || (_trackOrTrackReferenc = trackOrTrackReference.publication) === null || _trackOrTrackReferenc === void 0 ? void 0 : _trackOrTrackReferenc.track;
|
|
15
15
|
const mediaStreamTrack = track === null || track === void 0 ? void 0 : track.mediaStreamTrack;
|
|
16
|
+
const hasMediaStreamTrack = mediaStreamTrack != null;
|
|
17
|
+
const peerConnectionId = mediaStreamTrack.peerConnectionId ?? -1;
|
|
18
|
+
const mediaStreamTrackId = mediaStreamTrack.id;
|
|
16
19
|
let [volume, setVolume] = useState(0.0);
|
|
17
20
|
useEffect(() => {
|
|
18
21
|
let listener = Object();
|
|
19
22
|
let reactTag = null;
|
|
20
|
-
if (
|
|
21
|
-
reactTag = LiveKitModule.createVolumeProcessor(
|
|
23
|
+
if (hasMediaStreamTrack) {
|
|
24
|
+
reactTag = LiveKitModule.createVolumeProcessor(peerConnectionId, mediaStreamTrackId);
|
|
22
25
|
addListener(listener, 'LK_VOLUME_PROCESSED', event => {
|
|
23
26
|
if (event.volume && reactTag && event.id === reactTag) {
|
|
24
27
|
setVolume(event.volume);
|
|
@@ -26,14 +29,14 @@ export function useTrackVolume(trackOrTrackReference) {
|
|
|
26
29
|
});
|
|
27
30
|
}
|
|
28
31
|
return () => {
|
|
29
|
-
if (
|
|
32
|
+
if (hasMediaStreamTrack) {
|
|
30
33
|
removeListener(listener);
|
|
31
34
|
if (reactTag) {
|
|
32
|
-
LiveKitModule.deleteVolumeProcessor(reactTag,
|
|
35
|
+
LiveKitModule.deleteVolumeProcessor(reactTag, peerConnectionId, mediaStreamTrackId);
|
|
33
36
|
}
|
|
34
37
|
}
|
|
35
38
|
};
|
|
36
|
-
}, [
|
|
39
|
+
}, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId]);
|
|
37
40
|
return volume;
|
|
38
41
|
}
|
|
39
42
|
//# sourceMappingURL=useTrackVolume.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Track","useEffect","useState","addListener","removeListener","LiveKitModule","useTrackVolume","trackOrTrackReference","_trackOrTrackReferenc","track","publication","mediaStreamTrack","volume","setVolume","listener","Object","reactTag","createVolumeProcessor","
|
|
1
|
+
{"version":3,"names":["Track","useEffect","useState","addListener","removeListener","LiveKitModule","useTrackVolume","trackOrTrackReference","_trackOrTrackReferenc","track","publication","mediaStreamTrack","hasMediaStreamTrack","peerConnectionId","mediaStreamTrackId","id","volume","setVolume","listener","Object","reactTag","createVolumeProcessor","event","deleteVolumeProcessor"],"sources":["useTrackVolume.ts"],"sourcesContent":["import { type TrackReferenceOrPlaceholder } from '@livekit/components-react';\nimport {\n Track,\n type LocalAudioTrack,\n type RemoteAudioTrack,\n} from 'livekit-client';\nimport { useEffect, useState } from 'react';\nimport { addListener, removeListener } from '../events/EventEmitter';\nimport LiveKitModule from '../LKNativeModule';\n\n/**\n * A hook for tracking the volume of an audio track.\n *\n * @param trackOrTrackReference\n * @returns A number between 0-1 representing the volume.\n */\nexport function useTrackVolume(\n trackOrTrackReference?:\n | LocalAudioTrack\n | RemoteAudioTrack\n | TrackReferenceOrPlaceholder\n) {\n const track =\n trackOrTrackReference instanceof Track\n ? trackOrTrackReference\n : <LocalAudioTrack | RemoteAudioTrack | undefined>(\n trackOrTrackReference?.publication?.track\n );\n\n const mediaStreamTrack = track?.mediaStreamTrack;\n const hasMediaStreamTrack = mediaStreamTrack != null;\n const peerConnectionId = mediaStreamTrack.peerConnectionId ?? -1;\n const mediaStreamTrackId = mediaStreamTrack.id;\n\n let [volume, setVolume] = useState(0.0);\n useEffect(() => {\n let listener = Object();\n let reactTag: string | null = null;\n if (hasMediaStreamTrack) {\n reactTag = LiveKitModule.createVolumeProcessor(\n peerConnectionId,\n mediaStreamTrackId\n );\n addListener(listener, 'LK_VOLUME_PROCESSED', (event: any) => {\n if (event.volume && reactTag && event.id === reactTag) {\n setVolume(event.volume);\n }\n });\n }\n return () => {\n if (hasMediaStreamTrack) {\n removeListener(listener);\n if (reactTag) {\n LiveKitModule.deleteVolumeProcessor(\n reactTag,\n peerConnectionId,\n mediaStreamTrackId\n );\n }\n }\n };\n }, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId]);\n\n return volume;\n}\n"],"mappings":"AACA,SACEA,KAAK,QAGA,gBAAgB;AACvB,SAASC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,SAASC,WAAW,EAAEC,cAAc,QAAQ,wBAAwB;AACpE,OAAOC,aAAa,MAAM,mBAAmB;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,qBAG+B,EAC/B;EAAA,IAAAC,qBAAA;EACA,MAAMC,KAAK,GACTF,qBAAqB,YAAYP,KAAK,GAClCO,qBAAqB,GAEnBA,qBAAqB,aAArBA,qBAAqB,gBAAAC,qBAAA,GAArBD,qBAAqB,CAAEG,WAAW,cAAAF,qBAAA,uBAAlCA,qBAAA,CAAoCC,KACrC;EAEP,MAAME,gBAAgB,GAAGF,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEE,gBAAgB;EAChD,MAAMC,mBAAmB,GAAGD,gBAAgB,IAAI,IAAI;EACpD,MAAME,gBAAgB,GAAGF,gBAAgB,CAACE,gBAAgB,IAAI,CAAC,CAAC;EAChE,MAAMC,kBAAkB,GAAGH,gBAAgB,CAACI,EAAE;EAE9C,IAAI,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGf,QAAQ,CAAC,GAAG,CAAC;EACvCD,SAAS,CAAC,MAAM;IACd,IAAIiB,QAAQ,GAAGC,MAAM,CAAC,CAAC;IACvB,IAAIC,QAAuB,GAAG,IAAI;IAClC,IAAIR,mBAAmB,EAAE;MACvBQ,QAAQ,GAAGf,aAAa,CAACgB,qBAAqB,CAC5CR,gBAAgB,EAChBC,kBACF,CAAC;MACDX,WAAW,CAACe,QAAQ,EAAE,qBAAqB,EAAGI,KAAU,IAAK;QAC3D,IAAIA,KAAK,CAACN,MAAM,IAAII,QAAQ,IAAIE,KAAK,CAACP,EAAE,KAAKK,QAAQ,EAAE;UACrDH,SAAS,CAACK,KAAK,CAACN,MAAM,CAAC;QACzB;MACF,CAAC,CAAC;IACJ;IACA,OAAO,MAAM;MACX,IAAIJ,mBAAmB,EAAE;QACvBR,cAAc,CAACc,QAAQ,CAAC;QACxB,IAAIE,QAAQ,EAAE;UACZf,aAAa,CAACkB,qBAAqB,CACjCH,QAAQ,EACRP,gBAAgB,EAChBC,kBACF,CAAC;QACH;MACF;IACF,CAAC;EACH,CAAC,EAAE,CAACF,mBAAmB,EAAEC,gBAAgB,EAAEC,kBAAkB,CAAC,CAAC;EAE/D,OAAOE,MAAM;AACf","ignoreList":[]}
|
|
@@ -5,4 +5,4 @@ export const __esModule: boolean;
|
|
|
5
5
|
* @param trackOrTrackReference
|
|
6
6
|
* @returns A number array containing the volume for each frequency band.
|
|
7
7
|
*/
|
|
8
|
-
export function useMultibandTrackVolume(trackOrTrackReference: any, options
|
|
8
|
+
export function useMultibandTrackVolume(trackOrTrackReference: any, options: any): any;
|
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
* @param trackOrTrackReference
|
|
5
5
|
* @returns A number array containing the volume for each frequency band.
|
|
6
6
|
*/
|
|
7
|
-
export function useMultibandTrackVolume(trackOrTrackReference: any, options
|
|
7
|
+
export function useMultibandTrackVolume(trackOrTrackReference: any, options: any): never[];
|
package/package.json
CHANGED
|
@@ -49,7 +49,7 @@ export function useMultibandTrackVolume(
|
|
|
49
49
|
| LocalAudioTrack
|
|
50
50
|
| RemoteAudioTrack
|
|
51
51
|
| TrackReferenceOrPlaceholder,
|
|
52
|
-
options
|
|
52
|
+
options?: MultiBandTrackVolumeOptions
|
|
53
53
|
) {
|
|
54
54
|
const track =
|
|
55
55
|
trackOrTrackReference instanceof Track
|
|
@@ -59,39 +59,44 @@ export function useMultibandTrackVolume(
|
|
|
59
59
|
);
|
|
60
60
|
const opts = useMemo(() => {
|
|
61
61
|
return { ...multibandDefaults, ...options };
|
|
62
|
-
|
|
62
|
+
|
|
63
|
+
// disabled due to use of JSON.stringify, dependencies are reference equality
|
|
64
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
65
|
+
}, [JSON.stringify(options)]);
|
|
63
66
|
const mediaStreamTrack = track?.mediaStreamTrack;
|
|
67
|
+
const hasMediaStreamTrack = mediaStreamTrack != null;
|
|
68
|
+
const peerConnectionId = mediaStreamTrack?.peerConnectionId ?? -1;
|
|
69
|
+
const mediaStreamTrackId = mediaStreamTrack?.id;
|
|
64
70
|
|
|
65
71
|
let [magnitudes, setMagnitudes] = useState<number[]>([]);
|
|
66
72
|
useEffect(() => {
|
|
67
73
|
let listener = Object();
|
|
68
74
|
let reactTag: string | null = null;
|
|
69
|
-
if (
|
|
75
|
+
if (hasMediaStreamTrack) {
|
|
70
76
|
reactTag = LiveKitModule.createMultibandVolumeProcessor(
|
|
71
77
|
opts,
|
|
72
|
-
|
|
73
|
-
|
|
78
|
+
peerConnectionId,
|
|
79
|
+
mediaStreamTrackId
|
|
74
80
|
);
|
|
75
81
|
addListener(listener, 'LK_MULTIBAND_PROCESSED', (event: any) => {
|
|
76
82
|
if (event.magnitudes && reactTag && event.id === reactTag) {
|
|
77
|
-
console.log('event received: ', event.magnitudes[0]);
|
|
78
83
|
setMagnitudes(event.magnitudes);
|
|
79
84
|
}
|
|
80
85
|
});
|
|
81
86
|
}
|
|
82
87
|
return () => {
|
|
83
|
-
if (
|
|
88
|
+
if (hasMediaStreamTrack) {
|
|
84
89
|
removeListener(listener);
|
|
85
90
|
if (reactTag) {
|
|
86
91
|
LiveKitModule.deleteMultibandVolumeProcessor(
|
|
87
92
|
reactTag,
|
|
88
|
-
|
|
89
|
-
|
|
93
|
+
peerConnectionId,
|
|
94
|
+
mediaStreamTrackId
|
|
90
95
|
);
|
|
91
96
|
}
|
|
92
97
|
}
|
|
93
98
|
};
|
|
94
|
-
}, [
|
|
99
|
+
}, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId, opts]);
|
|
95
100
|
|
|
96
101
|
return magnitudes;
|
|
97
102
|
}
|
|
@@ -28,15 +28,18 @@ export function useTrackVolume(
|
|
|
28
28
|
);
|
|
29
29
|
|
|
30
30
|
const mediaStreamTrack = track?.mediaStreamTrack;
|
|
31
|
+
const hasMediaStreamTrack = mediaStreamTrack != null;
|
|
32
|
+
const peerConnectionId = mediaStreamTrack.peerConnectionId ?? -1;
|
|
33
|
+
const mediaStreamTrackId = mediaStreamTrack.id;
|
|
31
34
|
|
|
32
35
|
let [volume, setVolume] = useState(0.0);
|
|
33
36
|
useEffect(() => {
|
|
34
37
|
let listener = Object();
|
|
35
38
|
let reactTag: string | null = null;
|
|
36
|
-
if (
|
|
39
|
+
if (hasMediaStreamTrack) {
|
|
37
40
|
reactTag = LiveKitModule.createVolumeProcessor(
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
peerConnectionId,
|
|
42
|
+
mediaStreamTrackId
|
|
40
43
|
);
|
|
41
44
|
addListener(listener, 'LK_VOLUME_PROCESSED', (event: any) => {
|
|
42
45
|
if (event.volume && reactTag && event.id === reactTag) {
|
|
@@ -45,18 +48,18 @@ export function useTrackVolume(
|
|
|
45
48
|
});
|
|
46
49
|
}
|
|
47
50
|
return () => {
|
|
48
|
-
if (
|
|
51
|
+
if (hasMediaStreamTrack) {
|
|
49
52
|
removeListener(listener);
|
|
50
53
|
if (reactTag) {
|
|
51
54
|
LiveKitModule.deleteVolumeProcessor(
|
|
52
55
|
reactTag,
|
|
53
|
-
|
|
54
|
-
|
|
56
|
+
peerConnectionId,
|
|
57
|
+
mediaStreamTrackId
|
|
55
58
|
);
|
|
56
59
|
}
|
|
57
60
|
}
|
|
58
61
|
};
|
|
59
|
-
}, [
|
|
62
|
+
}, [hasMediaStreamTrack, peerConnectionId, mediaStreamTrackId]);
|
|
60
63
|
|
|
61
64
|
return volume;
|
|
62
65
|
}
|