@abrar71/lib-jitsi-meet 0.0.0
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/LICENSE +202 -0
- package/README.md +26 -0
- package/dist/esm/JitsiConference.js +3692 -0
- package/dist/esm/JitsiConference.js.map +1 -0
- package/dist/esm/JitsiConferenceErrors.js +126 -0
- package/dist/esm/JitsiConferenceErrors.js.map +1 -0
- package/dist/esm/JitsiConferenceEventManager.js +424 -0
- package/dist/esm/JitsiConferenceEventManager.js.map +1 -0
- package/dist/esm/JitsiConferenceEvents.js +431 -0
- package/dist/esm/JitsiConferenceEvents.js.map +1 -0
- package/dist/esm/JitsiConnection.js +187 -0
- package/dist/esm/JitsiConnection.js.map +1 -0
- package/dist/esm/JitsiConnectionErrors.js +52 -0
- package/dist/esm/JitsiConnectionErrors.js.map +1 -0
- package/dist/esm/JitsiConnectionEvents.js +57 -0
- package/dist/esm/JitsiConnectionEvents.js.map +1 -0
- package/dist/esm/JitsiMediaDevices.js +221 -0
- package/dist/esm/JitsiMediaDevices.js.map +1 -0
- package/dist/esm/JitsiMediaDevicesEvents.js +29 -0
- package/dist/esm/JitsiMediaDevicesEvents.js.map +1 -0
- package/dist/esm/JitsiMeetJS.js +499 -0
- package/dist/esm/JitsiMeetJS.js.map +1 -0
- package/dist/esm/JitsiParticipant.js +323 -0
- package/dist/esm/JitsiParticipant.js.map +1 -0
- package/dist/esm/JitsiTrackError.js +122 -0
- package/dist/esm/JitsiTrackError.js.map +1 -0
- package/dist/esm/JitsiTrackErrors.js +91 -0
- package/dist/esm/JitsiTrackErrors.js.map +1 -0
- package/dist/esm/JitsiTrackEvents.js +60 -0
- package/dist/esm/JitsiTrackEvents.js.map +1 -0
- package/dist/esm/JitsiTranscriptionStatus.js +15 -0
- package/dist/esm/JitsiTranscriptionStatus.js.map +1 -0
- package/dist/esm/modules/RTC/BridgeChannel.js +398 -0
- package/dist/esm/modules/RTC/BridgeChannel.js.map +1 -0
- package/dist/esm/modules/RTC/JitsiLocalTrack.js +896 -0
- package/dist/esm/modules/RTC/JitsiLocalTrack.js.map +1 -0
- package/dist/esm/modules/RTC/JitsiRemoteTrack.js +427 -0
- package/dist/esm/modules/RTC/JitsiRemoteTrack.js.map +1 -0
- package/dist/esm/modules/RTC/JitsiTrack.js +453 -0
- package/dist/esm/modules/RTC/JitsiTrack.js.map +1 -0
- package/dist/esm/modules/RTC/MockClasses.js +388 -0
- package/dist/esm/modules/RTC/MockClasses.js.map +1 -0
- package/dist/esm/modules/RTC/RTC.js +658 -0
- package/dist/esm/modules/RTC/RTC.js.map +1 -0
- package/dist/esm/modules/RTC/RTCUtils.js +762 -0
- package/dist/esm/modules/RTC/RTCUtils.js.map +1 -0
- package/dist/esm/modules/RTC/ScreenObtainer.js +380 -0
- package/dist/esm/modules/RTC/ScreenObtainer.js.map +1 -0
- package/dist/esm/modules/RTC/TPCUtils.js +803 -0
- package/dist/esm/modules/RTC/TPCUtils.js.map +1 -0
- package/dist/esm/modules/RTC/TraceablePeerConnection.js +2223 -0
- package/dist/esm/modules/RTC/TraceablePeerConnection.js.map +1 -0
- package/dist/esm/modules/RTCStats/DefaulLogStorage.js +35 -0
- package/dist/esm/modules/RTCStats/DefaulLogStorage.js.map +1 -0
- package/dist/esm/modules/RTCStats/RTCStats.js +219 -0
- package/dist/esm/modules/RTCStats/RTCStats.js.map +1 -0
- package/dist/esm/modules/RTCStats/RTCStatsEvents.js +92 -0
- package/dist/esm/modules/RTCStats/RTCStatsEvents.js.map +1 -0
- package/dist/esm/modules/RTCStats/interfaces.js +2 -0
- package/dist/esm/modules/RTCStats/interfaces.js.map +1 -0
- package/dist/esm/modules/browser/BrowserCapabilities.js +345 -0
- package/dist/esm/modules/browser/BrowserCapabilities.js.map +1 -0
- package/dist/esm/modules/browser/index.js +3 -0
- package/dist/esm/modules/browser/index.js.map +1 -0
- package/dist/esm/modules/connectivity/ConnectionQuality.js +389 -0
- package/dist/esm/modules/connectivity/ConnectionQuality.js.map +1 -0
- package/dist/esm/modules/connectivity/IceFailedHandling.js +84 -0
- package/dist/esm/modules/connectivity/IceFailedHandling.js.map +1 -0
- package/dist/esm/modules/connectivity/NetworkInfo.js +49 -0
- package/dist/esm/modules/connectivity/NetworkInfo.js.map +1 -0
- package/dist/esm/modules/connectivity/TrackStreamingStatus.js +453 -0
- package/dist/esm/modules/connectivity/TrackStreamingStatus.js.map +1 -0
- package/dist/esm/modules/detection/ActiveDeviceDetector.js +79 -0
- package/dist/esm/modules/detection/ActiveDeviceDetector.js.map +1 -0
- package/dist/esm/modules/detection/DetectionEvents.js +58 -0
- package/dist/esm/modules/detection/DetectionEvents.js.map +1 -0
- package/dist/esm/modules/detection/NoAudioSignalDetection.js +127 -0
- package/dist/esm/modules/detection/NoAudioSignalDetection.js.map +1 -0
- package/dist/esm/modules/detection/P2PDominantSpeakerDetection.js +47 -0
- package/dist/esm/modules/detection/P2PDominantSpeakerDetection.js.map +1 -0
- package/dist/esm/modules/detection/TrackVADEmitter.js +190 -0
- package/dist/esm/modules/detection/TrackVADEmitter.js.map +1 -0
- package/dist/esm/modules/detection/VADAudioAnalyser.js +199 -0
- package/dist/esm/modules/detection/VADAudioAnalyser.js.map +1 -0
- package/dist/esm/modules/detection/VADNoiseDetection.js +168 -0
- package/dist/esm/modules/detection/VADNoiseDetection.js.map +1 -0
- package/dist/esm/modules/detection/VADReportingService.js +203 -0
- package/dist/esm/modules/detection/VADReportingService.js.map +1 -0
- package/dist/esm/modules/detection/VADTalkMutedDetection.js +131 -0
- package/dist/esm/modules/detection/VADTalkMutedDetection.js.map +1 -0
- package/dist/esm/modules/e2ee/Context.js +274 -0
- package/dist/esm/modules/e2ee/Context.js.map +1 -0
- package/dist/esm/modules/e2ee/E2EEContext.js +158 -0
- package/dist/esm/modules/e2ee/E2EEContext.js.map +1 -0
- package/dist/esm/modules/e2ee/E2EEErrors.js +10 -0
- package/dist/esm/modules/e2ee/E2EEErrors.js.map +1 -0
- package/dist/esm/modules/e2ee/E2EEncryption.js +87 -0
- package/dist/esm/modules/e2ee/E2EEncryption.js.map +1 -0
- package/dist/esm/modules/e2ee/ExternallyManagedKeyHandler.js +24 -0
- package/dist/esm/modules/e2ee/ExternallyManagedKeyHandler.js.map +1 -0
- package/dist/esm/modules/e2ee/KeyHandler.js +137 -0
- package/dist/esm/modules/e2ee/KeyHandler.js.map +1 -0
- package/dist/esm/modules/e2ee/ManagedKeyHandler.js +182 -0
- package/dist/esm/modules/e2ee/ManagedKeyHandler.js.map +1 -0
- package/dist/esm/modules/e2ee/OlmAdapter.js +860 -0
- package/dist/esm/modules/e2ee/OlmAdapter.js.map +1 -0
- package/dist/esm/modules/e2ee/SAS.js +128 -0
- package/dist/esm/modules/e2ee/SAS.js.map +1 -0
- package/dist/esm/modules/e2ee/Worker.js +102 -0
- package/dist/esm/modules/e2ee/Worker.js.map +1 -0
- package/dist/esm/modules/e2ee/crypto-utils.js +53 -0
- package/dist/esm/modules/e2ee/crypto-utils.js.map +1 -0
- package/dist/esm/modules/e2ee/utils.js +15 -0
- package/dist/esm/modules/e2ee/utils.js.map +1 -0
- package/dist/esm/modules/e2eping/e2eping.js +314 -0
- package/dist/esm/modules/e2eping/e2eping.js.map +1 -0
- package/dist/esm/modules/flags/FeatureFlags.js +36 -0
- package/dist/esm/modules/flags/FeatureFlags.js.map +1 -0
- package/dist/esm/modules/litemode/LiteModeContext.js +50 -0
- package/dist/esm/modules/litemode/LiteModeContext.js.map +1 -0
- package/dist/esm/modules/proxyconnection/CustomSignalingLayer.js +98 -0
- package/dist/esm/modules/proxyconnection/CustomSignalingLayer.js.map +1 -0
- package/dist/esm/modules/proxyconnection/ProxyConnectionPC.js +348 -0
- package/dist/esm/modules/proxyconnection/ProxyConnectionPC.js.map +1 -0
- package/dist/esm/modules/proxyconnection/ProxyConnectionService.js +279 -0
- package/dist/esm/modules/proxyconnection/ProxyConnectionService.js.map +1 -0
- package/dist/esm/modules/proxyconnection/constants.js +14 -0
- package/dist/esm/modules/proxyconnection/constants.js.map +1 -0
- package/dist/esm/modules/qualitycontrol/CodecSelection.js +222 -0
- package/dist/esm/modules/qualitycontrol/CodecSelection.js.map +1 -0
- package/dist/esm/modules/qualitycontrol/MockClasses.js +120 -0
- package/dist/esm/modules/qualitycontrol/MockClasses.js.map +1 -0
- package/dist/esm/modules/qualitycontrol/QualityController.js +366 -0
- package/dist/esm/modules/qualitycontrol/QualityController.js.map +1 -0
- package/dist/esm/modules/qualitycontrol/ReceiveAudioController.js +73 -0
- package/dist/esm/modules/qualitycontrol/ReceiveAudioController.js.map +1 -0
- package/dist/esm/modules/qualitycontrol/ReceiveVideoController.js +216 -0
- package/dist/esm/modules/qualitycontrol/ReceiveVideoController.js.map +1 -0
- package/dist/esm/modules/qualitycontrol/SendVideoController.js +133 -0
- package/dist/esm/modules/qualitycontrol/SendVideoController.js.map +1 -0
- package/dist/esm/modules/recording/JibriSession.js +279 -0
- package/dist/esm/modules/recording/JibriSession.js.map +1 -0
- package/dist/esm/modules/recording/RecordingManager.js +257 -0
- package/dist/esm/modules/recording/RecordingManager.js.map +1 -0
- package/dist/esm/modules/recording/recordingConstants.js +21 -0
- package/dist/esm/modules/recording/recordingConstants.js.map +1 -0
- package/dist/esm/modules/recording/recordingXMLUtils.js +69 -0
- package/dist/esm/modules/recording/recordingXMLUtils.js.map +1 -0
- package/dist/esm/modules/red/red.js +108 -0
- package/dist/esm/modules/red/red.js.map +1 -0
- package/dist/esm/modules/sdp/LocalSdpMunger.js +143 -0
- package/dist/esm/modules/sdp/LocalSdpMunger.js.map +1 -0
- package/dist/esm/modules/sdp/RtxModifier.js +179 -0
- package/dist/esm/modules/sdp/RtxModifier.js.map +1 -0
- package/dist/esm/modules/sdp/SDP.js +848 -0
- package/dist/esm/modules/sdp/SDP.js.map +1 -0
- package/dist/esm/modules/sdp/SDPDiffer.js +96 -0
- package/dist/esm/modules/sdp/SDPDiffer.js.map +1 -0
- package/dist/esm/modules/sdp/SDPUtil.js +798 -0
- package/dist/esm/modules/sdp/SDPUtil.js.map +1 -0
- package/dist/esm/modules/sdp/SampleSdpStrings.js +589 -0
- package/dist/esm/modules/sdp/SampleSdpStrings.js.map +1 -0
- package/dist/esm/modules/sdp/SdpSimulcast.js +196 -0
- package/dist/esm/modules/sdp/SdpSimulcast.js.map +1 -0
- package/dist/esm/modules/sdp/SdpTransformUtil.js +337 -0
- package/dist/esm/modules/sdp/SdpTransformUtil.js.map +1 -0
- package/dist/esm/modules/sdp/constants.js +2 -0
- package/dist/esm/modules/sdp/constants.js.map +1 -0
- package/dist/esm/modules/settings/Settings.js +95 -0
- package/dist/esm/modules/settings/Settings.js.map +1 -0
- package/dist/esm/modules/statistics/AnalyticsAdapter.js +277 -0
- package/dist/esm/modules/statistics/AnalyticsAdapter.js.map +1 -0
- package/dist/esm/modules/statistics/AvgRTPStatsReporter.js +817 -0
- package/dist/esm/modules/statistics/AvgRTPStatsReporter.js.map +1 -0
- package/dist/esm/modules/statistics/LocalStatsCollector.js +149 -0
- package/dist/esm/modules/statistics/LocalStatsCollector.js.map +1 -0
- package/dist/esm/modules/statistics/PreCallTest.js +15 -0
- package/dist/esm/modules/statistics/PreCallTest.js.map +1 -0
- package/dist/esm/modules/statistics/RTPStatsCollector.js +601 -0
- package/dist/esm/modules/statistics/RTPStatsCollector.js.map +1 -0
- package/dist/esm/modules/statistics/SpeakerStats.js +163 -0
- package/dist/esm/modules/statistics/SpeakerStats.js.map +1 -0
- package/dist/esm/modules/statistics/SpeakerStatsCollector.js +161 -0
- package/dist/esm/modules/statistics/SpeakerStatsCollector.js.map +1 -0
- package/dist/esm/modules/statistics/constants.js +7 -0
- package/dist/esm/modules/statistics/constants.js.map +1 -0
- package/dist/esm/modules/statistics/statistics.js +362 -0
- package/dist/esm/modules/statistics/statistics.js.map +1 -0
- package/dist/esm/modules/util/AsyncQueue.js +102 -0
- package/dist/esm/modules/util/AsyncQueue.js.map +1 -0
- package/dist/esm/modules/util/Deferred.js +41 -0
- package/dist/esm/modules/util/Deferred.js.map +1 -0
- package/dist/esm/modules/util/EventEmitter.js +17 -0
- package/dist/esm/modules/util/EventEmitter.js.map +1 -0
- package/dist/esm/modules/util/EventEmitterForwarder.js +52 -0
- package/dist/esm/modules/util/EventEmitterForwarder.js.map +1 -0
- package/dist/esm/modules/util/Listenable.js +106 -0
- package/dist/esm/modules/util/Listenable.js.map +1 -0
- package/dist/esm/modules/util/MathUtil.js +103 -0
- package/dist/esm/modules/util/MathUtil.js.map +1 -0
- package/dist/esm/modules/util/RandomUtil.js +66 -0
- package/dist/esm/modules/util/RandomUtil.js.map +1 -0
- package/dist/esm/modules/util/Retry.js +15 -0
- package/dist/esm/modules/util/Retry.js.map +1 -0
- package/dist/esm/modules/util/ScriptUtil.js +58 -0
- package/dist/esm/modules/util/ScriptUtil.js.map +1 -0
- package/dist/esm/modules/util/StringUtils.js +21 -0
- package/dist/esm/modules/util/StringUtils.js.map +1 -0
- package/dist/esm/modules/util/TestUtils.js +14 -0
- package/dist/esm/modules/util/TestUtils.js.map +1 -0
- package/dist/esm/modules/util/UsernameGenerator.js +436 -0
- package/dist/esm/modules/util/UsernameGenerator.js.map +1 -0
- package/dist/esm/modules/util/XMLUtils.js +135 -0
- package/dist/esm/modules/util/XMLUtils.js.map +1 -0
- package/dist/esm/modules/version/ComponentsVersions.js +52 -0
- package/dist/esm/modules/version/ComponentsVersions.js.map +1 -0
- package/dist/esm/modules/videosipgw/JitsiVideoSIPGWSession.js +137 -0
- package/dist/esm/modules/videosipgw/JitsiVideoSIPGWSession.js.map +1 -0
- package/dist/esm/modules/videosipgw/VideoSIPGW.js +102 -0
- package/dist/esm/modules/videosipgw/VideoSIPGW.js.map +1 -0
- package/dist/esm/modules/videosipgw/VideoSIPGWConstants.js +65 -0
- package/dist/esm/modules/videosipgw/VideoSIPGWConstants.js.map +1 -0
- package/dist/esm/modules/watchRTC/WatchRTC.js +69 -0
- package/dist/esm/modules/watchRTC/WatchRTC.js.map +1 -0
- package/dist/esm/modules/watchRTC/functions.js +31 -0
- package/dist/esm/modules/watchRTC/functions.js.map +1 -0
- package/dist/esm/modules/watchRTC/interfaces.js +2 -0
- package/dist/esm/modules/watchRTC/interfaces.js.map +1 -0
- package/dist/esm/modules/webaudio/AudioMixer.js +74 -0
- package/dist/esm/modules/webaudio/AudioMixer.js.map +1 -0
- package/dist/esm/modules/webaudio/WebAudioUtils.js +13 -0
- package/dist/esm/modules/webaudio/WebAudioUtils.js.map +1 -0
- package/dist/esm/modules/xmpp/AVModeration.js +156 -0
- package/dist/esm/modules/xmpp/AVModeration.js.map +1 -0
- package/dist/esm/modules/xmpp/BreakoutRooms.js +230 -0
- package/dist/esm/modules/xmpp/BreakoutRooms.js.map +1 -0
- package/dist/esm/modules/xmpp/Caps.js +223 -0
- package/dist/esm/modules/xmpp/Caps.js.map +1 -0
- package/dist/esm/modules/xmpp/ChatRoom.js +1877 -0
- package/dist/esm/modules/xmpp/ChatRoom.js.map +1 -0
- package/dist/esm/modules/xmpp/ConnectionPlugin.js +37 -0
- package/dist/esm/modules/xmpp/ConnectionPlugin.js.map +1 -0
- package/dist/esm/modules/xmpp/FileSharing.js +95 -0
- package/dist/esm/modules/xmpp/FileSharing.js.map +1 -0
- package/dist/esm/modules/xmpp/JingleHelperFunctions.js +168 -0
- package/dist/esm/modules/xmpp/JingleHelperFunctions.js.map +1 -0
- package/dist/esm/modules/xmpp/JingleSession.js +166 -0
- package/dist/esm/modules/xmpp/JingleSession.js.map +1 -0
- package/dist/esm/modules/xmpp/JingleSessionPC.js +1969 -0
- package/dist/esm/modules/xmpp/JingleSessionPC.js.map +1 -0
- package/dist/esm/modules/xmpp/JingleSessionState.js +23 -0
- package/dist/esm/modules/xmpp/JingleSessionState.js.map +1 -0
- package/dist/esm/modules/xmpp/Lobby.js +384 -0
- package/dist/esm/modules/xmpp/Lobby.js.map +1 -0
- package/dist/esm/modules/xmpp/MediaSessionEvents.js +12 -0
- package/dist/esm/modules/xmpp/MediaSessionEvents.js.map +1 -0
- package/dist/esm/modules/xmpp/MockClasses.js +77 -0
- package/dist/esm/modules/xmpp/MockClasses.js.map +1 -0
- package/dist/esm/modules/xmpp/Polls.js +87 -0
- package/dist/esm/modules/xmpp/Polls.js.map +1 -0
- package/dist/esm/modules/xmpp/ResumeTask.js +149 -0
- package/dist/esm/modules/xmpp/ResumeTask.js.map +1 -0
- package/dist/esm/modules/xmpp/RoomMetadata.js +96 -0
- package/dist/esm/modules/xmpp/RoomMetadata.js.map +1 -0
- package/dist/esm/modules/xmpp/SignalingLayerImpl.js +313 -0
- package/dist/esm/modules/xmpp/SignalingLayerImpl.js.map +1 -0
- package/dist/esm/modules/xmpp/StropheErrorHandler.js +53 -0
- package/dist/esm/modules/xmpp/StropheErrorHandler.js.map +1 -0
- package/dist/esm/modules/xmpp/StropheLastSuccess.js +52 -0
- package/dist/esm/modules/xmpp/StropheLastSuccess.js.map +1 -0
- package/dist/esm/modules/xmpp/XmppConnection.js +579 -0
- package/dist/esm/modules/xmpp/XmppConnection.js.map +1 -0
- package/dist/esm/modules/xmpp/moderator.js +524 -0
- package/dist/esm/modules/xmpp/moderator.js.map +1 -0
- package/dist/esm/modules/xmpp/sha1.js +165 -0
- package/dist/esm/modules/xmpp/sha1.js.map +1 -0
- package/dist/esm/modules/xmpp/strophe.disco.js +222 -0
- package/dist/esm/modules/xmpp/strophe.disco.js.map +1 -0
- package/dist/esm/modules/xmpp/strophe.emuc.js +206 -0
- package/dist/esm/modules/xmpp/strophe.emuc.js.map +1 -0
- package/dist/esm/modules/xmpp/strophe.jingle.js +404 -0
- package/dist/esm/modules/xmpp/strophe.jingle.js.map +1 -0
- package/dist/esm/modules/xmpp/strophe.logger.js +44 -0
- package/dist/esm/modules/xmpp/strophe.logger.js.map +1 -0
- package/dist/esm/modules/xmpp/strophe.ping.js +170 -0
- package/dist/esm/modules/xmpp/strophe.ping.js.map +1 -0
- package/dist/esm/modules/xmpp/strophe.rayo.js +117 -0
- package/dist/esm/modules/xmpp/strophe.rayo.js.map +1 -0
- package/dist/esm/modules/xmpp/strophe.stream-management.js +365 -0
- package/dist/esm/modules/xmpp/strophe.stream-management.js.map +1 -0
- package/dist/esm/modules/xmpp/strophe.util.js +116 -0
- package/dist/esm/modules/xmpp/strophe.util.js.map +1 -0
- package/dist/esm/modules/xmpp/xmpp.js +973 -0
- package/dist/esm/modules/xmpp/xmpp.js.map +1 -0
- package/dist/esm/service/RTC/BridgeVideoType.js +24 -0
- package/dist/esm/service/RTC/BridgeVideoType.js.map +1 -0
- package/dist/esm/service/RTC/CameraFacingMode.js +21 -0
- package/dist/esm/service/RTC/CameraFacingMode.js.map +1 -0
- package/dist/esm/service/RTC/CodecMimeType.js +36 -0
- package/dist/esm/service/RTC/CodecMimeType.js.map +1 -0
- package/dist/esm/service/RTC/MediaDirection.js +23 -0
- package/dist/esm/service/RTC/MediaDirection.js.map +1 -0
- package/dist/esm/service/RTC/MediaType.js +20 -0
- package/dist/esm/service/RTC/MediaType.js.map +1 -0
- package/dist/esm/service/RTC/RTCEvents.js +111 -0
- package/dist/esm/service/RTC/RTCEvents.js.map +1 -0
- package/dist/esm/service/RTC/ReceiverAudioSubscription.js +27 -0
- package/dist/esm/service/RTC/ReceiverAudioSubscription.js.map +1 -0
- package/dist/esm/service/RTC/Resolutions.js +56 -0
- package/dist/esm/service/RTC/Resolutions.js.map +1 -0
- package/dist/esm/service/RTC/SignalingEvents.js +42 -0
- package/dist/esm/service/RTC/SignalingEvents.js.map +1 -0
- package/dist/esm/service/RTC/SignalingLayer.js +153 -0
- package/dist/esm/service/RTC/SignalingLayer.js.map +1 -0
- package/dist/esm/service/RTC/StandardVideoQualitySettings.js +180 -0
- package/dist/esm/service/RTC/StandardVideoQualitySettings.js.map +1 -0
- package/dist/esm/service/RTC/VideoEncoderScalabilityMode.js +36 -0
- package/dist/esm/service/RTC/VideoEncoderScalabilityMode.js.map +1 -0
- package/dist/esm/service/RTC/VideoType.js +19 -0
- package/dist/esm/service/RTC/VideoType.js.map +1 -0
- package/dist/esm/service/authentication/AuthenticationEvents.js +13 -0
- package/dist/esm/service/authentication/AuthenticationEvents.js.map +1 -0
- package/dist/esm/service/connectivity/ConnectionQualityEvents.js +13 -0
- package/dist/esm/service/connectivity/ConnectionQualityEvents.js.map +1 -0
- package/dist/esm/service/connectivity/Constants.js +3 -0
- package/dist/esm/service/connectivity/Constants.js.map +1 -0
- package/dist/esm/service/e2eping/E2ePingEvents.js +8 -0
- package/dist/esm/service/e2eping/E2ePingEvents.js.map +1 -0
- package/dist/esm/service/statistics/AnalyticsEvents.js +521 -0
- package/dist/esm/service/statistics/AnalyticsEvents.js.map +1 -0
- package/dist/esm/service/statistics/Events.js +36 -0
- package/dist/esm/service/statistics/Events.js.map +1 -0
- package/dist/esm/service/statistics/constants.js +2 -0
- package/dist/esm/service/statistics/constants.js.map +1 -0
- package/dist/esm/service/xmpp/XMPPEvents.js +359 -0
- package/dist/esm/service/xmpp/XMPPEvents.js.map +1 -0
- package/dist/esm/service/xmpp/XMPPExtensioProtocols.js +64 -0
- package/dist/esm/service/xmpp/XMPPExtensioProtocols.js.map +1 -0
- package/dist/esm/test-setup-polyfill.js +34 -0
- package/dist/esm/test-setup-polyfill.js.map +1 -0
- package/dist/esm/tools/gen-version.js +15 -0
- package/dist/esm/tools/gen-version.js.map +1 -0
- package/dist/esm/version.js +3 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/umd/lib-jitsi-meet.e2ee-worker.js +484 -0
- package/dist/umd/lib-jitsi-meet.min.js +3 -0
- package/dist/umd/lib-jitsi-meet.min.js.LICENSE.txt +18 -0
- package/dist/umd/lib-jitsi-meet.min.map +1 -0
- package/package.json +93 -0
- package/types/index.d.ts +16180 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { JitsiConferenceEvents } from '../../JitsiConferenceEvents';
|
|
2
|
+
import { JitsiTrackEvents } from '../../JitsiTrackEvents';
|
|
3
|
+
import EventEmitter from '../util/EventEmitter';
|
|
4
|
+
import { DetectionEvents } from './DetectionEvents';
|
|
5
|
+
// We wait a certain time interval for constant silence input from the current device to account for
|
|
6
|
+
// potential abnormalities and for a better use experience i.e. don't generate event the instant
|
|
7
|
+
// an audio track is added to the tcr.
|
|
8
|
+
// Potential improvement - add this as a configurable parameter.
|
|
9
|
+
const SILENCE_PERIOD_MS = 4000;
|
|
10
|
+
/**
|
|
11
|
+
* Detect if there is no audio input on the current TraceAblePeerConnection selected track. The no audio
|
|
12
|
+
* state must be constant for a configured amount of time in order for the event to be triggered.
|
|
13
|
+
* @fires DetectionEvents.AUDIO_INPUT_STATE_CHANGE
|
|
14
|
+
* @fires DetectionEvents.NO_AUDIO_INPUT
|
|
15
|
+
*/
|
|
16
|
+
export default class NoAudioSignalDetection extends EventEmitter {
|
|
17
|
+
/**
|
|
18
|
+
* Creates new NoAudioSignalDetection.
|
|
19
|
+
*
|
|
20
|
+
* @param conference the JitsiConference instance that created us.
|
|
21
|
+
* @constructor
|
|
22
|
+
*/
|
|
23
|
+
constructor(conference) {
|
|
24
|
+
super();
|
|
25
|
+
this._conference = conference;
|
|
26
|
+
this._timeoutTrigger = null;
|
|
27
|
+
this._hasAudioInput = null;
|
|
28
|
+
this._audioTrack = null;
|
|
29
|
+
this._eventFired = false;
|
|
30
|
+
conference.on(JitsiConferenceEvents.TRACK_ADDED, this._trackAdded.bind(this));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Clear the timeout state.
|
|
34
|
+
*/
|
|
35
|
+
_clearTriggerTimeout() {
|
|
36
|
+
if (this._timeoutTrigger) {
|
|
37
|
+
clearTimeout(this._timeoutTrigger);
|
|
38
|
+
this._timeoutTrigger = null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Generated event triggered by a change in the current conference audio input state.
|
|
43
|
+
*
|
|
44
|
+
* @param {number} audioLevel - The audio level of the ssrc.
|
|
45
|
+
* @fires DetectionEvents.AUDIO_INPUT_STATE_CHANGE
|
|
46
|
+
*/
|
|
47
|
+
_handleAudioInputStateChange(audioLevel) {
|
|
48
|
+
// Current audio input state of the active local track in the conference, true for audio input false for no
|
|
49
|
+
// audio input.
|
|
50
|
+
const status = audioLevel !== 0;
|
|
51
|
+
// If this is the first audio event picked up or the current status is different from the previous trigger
|
|
52
|
+
// the event.
|
|
53
|
+
if (this._hasAudioInput === null || this._hasAudioInput !== status) {
|
|
54
|
+
this._hasAudioInput = status;
|
|
55
|
+
this.emit(DetectionEvents.AUDIO_INPUT_STATE_CHANGE, this._hasAudioInput);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate event triggered by a prolonged period of no audio input.
|
|
60
|
+
*
|
|
61
|
+
* @param {number} audioLevel - The audio level of the ssrc.
|
|
62
|
+
* @fires DetectionEvents.NO_AUDIO_INPUT
|
|
63
|
+
*/
|
|
64
|
+
_handleNoAudioInputDetection(audioLevel) {
|
|
65
|
+
if (this._eventFired) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (audioLevel === 0 && !this._timeoutTrigger) {
|
|
69
|
+
this._timeoutTrigger = setTimeout(() => {
|
|
70
|
+
this._eventFired = true;
|
|
71
|
+
this.emit(DetectionEvents.NO_AUDIO_INPUT);
|
|
72
|
+
}, SILENCE_PERIOD_MS);
|
|
73
|
+
}
|
|
74
|
+
else if (audioLevel !== 0 && this._timeoutTrigger) {
|
|
75
|
+
this._clearTriggerTimeout();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Receives audio level events for all send and receive streams on the current TraceablePeerConnection.
|
|
80
|
+
*
|
|
81
|
+
* @param {TraceablePeerConnection} tpc - TraceablePeerConnection of the owning conference.
|
|
82
|
+
* @param {number} ssrc - The synchronization source identifier (SSRC) of the endpoint/participant/stream
|
|
83
|
+
* being reported.
|
|
84
|
+
* @param {number} audioLevel - The audio level of the ssrc.
|
|
85
|
+
* @param {boolean} isLocal - true for local/send streams or false for remote/receive streams.
|
|
86
|
+
*/
|
|
87
|
+
_audioLevel(tpc, ssrc, audioLevel, isLocal) {
|
|
88
|
+
// We are interested in the local audio streams
|
|
89
|
+
if (!isLocal || !this._audioTrack) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Get currently active local tracks from the TraceablePeerConnection
|
|
93
|
+
const localSSRCs = tpc.localSSRCs.get(this._audioTrack.rtcId);
|
|
94
|
+
// Only target the current active track in the tpc. For some reason audio levels for previous
|
|
95
|
+
// devices are also picked up from the PeerConnection so we filter them out.
|
|
96
|
+
if (!localSSRCs?.ssrcs.includes(ssrc)) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// First handle audio input state change. In case the state changed to no input the no audio input event
|
|
100
|
+
// can try to fire again.
|
|
101
|
+
this._handleAudioInputStateChange(audioLevel);
|
|
102
|
+
this._handleNoAudioInputDetection(audioLevel);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Notifies NoAudioSignalDetection that a JitsiTrack was added to the associated JitsiConference.
|
|
106
|
+
* Only take into account local audio tracks.
|
|
107
|
+
*
|
|
108
|
+
* @param {JitsiTrack} track - The added JitsiTrack.
|
|
109
|
+
*/
|
|
110
|
+
_trackAdded(track) {
|
|
111
|
+
if (track.isLocalAudioTrack()) {
|
|
112
|
+
// Reset state for the new track.
|
|
113
|
+
this._audioTrack = track;
|
|
114
|
+
this._eventFired = false;
|
|
115
|
+
this._clearTriggerTimeout();
|
|
116
|
+
// Listen for the audio levels on the newly added audio track
|
|
117
|
+
track.on(JitsiTrackEvents.NO_AUDIO_INPUT, (audioLevel) => {
|
|
118
|
+
this._handleNoAudioInputDetection(audioLevel);
|
|
119
|
+
});
|
|
120
|
+
track.on(JitsiTrackEvents.TRACK_AUDIO_LEVEL_CHANGED, (audioLevel) => {
|
|
121
|
+
this._handleNoAudioInputDetection(audioLevel);
|
|
122
|
+
this._handleAudioInputStateChange(audioLevel);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=NoAudioSignalDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoAudioSignalDetection.js","sourceRoot":"","sources":["../../../../modules/detection/NoAudioSignalDetection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { JitsiConferenceEvents } from '../../JitsiConferenceEvents';
|
|
2
|
+
import { RTCEvents } from '../../service/RTC/RTCEvents';
|
|
3
|
+
/**
|
|
4
|
+
* The value which we use to say, every sound over this threshold
|
|
5
|
+
* is talking on the mic.
|
|
6
|
+
* @type {number}
|
|
7
|
+
*/
|
|
8
|
+
const SPEECH_DETECT_THRESHOLD = 0.6;
|
|
9
|
+
/**
|
|
10
|
+
* The <tt>P2PDominantSpeakerDetection</tt> is activated only when p2p is
|
|
11
|
+
* currently used.
|
|
12
|
+
* Listens for changes in the audio level changes of the local p2p audio track
|
|
13
|
+
* or remote p2p one and fires dominant speaker events to be able to use
|
|
14
|
+
* features depending on those events (speaker stats), to make them work without
|
|
15
|
+
* the video bridge.
|
|
16
|
+
*/
|
|
17
|
+
export default class P2PDominantSpeakerDetection {
|
|
18
|
+
/**
|
|
19
|
+
* Creates P2PDominantSpeakerDetection
|
|
20
|
+
* @param conference the JitsiConference instance that created us.
|
|
21
|
+
* @constructor
|
|
22
|
+
*/
|
|
23
|
+
constructor(conference) {
|
|
24
|
+
this.conference = conference;
|
|
25
|
+
conference.addEventListener(JitsiConferenceEvents.TRACK_AUDIO_LEVEL_CHANGED, this._audioLevel.bind(this));
|
|
26
|
+
this.myUserID = this.conference.myUserId();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Receives audio level events for all streams in the conference.
|
|
30
|
+
*
|
|
31
|
+
* @param {String} id - The participant id
|
|
32
|
+
* @param {number} audioLevel - The audio level.
|
|
33
|
+
*/
|
|
34
|
+
_audioLevel(id, audioLevel) {
|
|
35
|
+
// we do not process if p2p is not active
|
|
36
|
+
// or audio level is under certain threshold
|
|
37
|
+
// or if the audio level is for local audio track which is muted
|
|
38
|
+
if (!this.conference.isP2PActive()
|
|
39
|
+
|| audioLevel <= SPEECH_DETECT_THRESHOLD
|
|
40
|
+
|| (id === this.myUserID
|
|
41
|
+
&& this.conference.getLocalAudioTrack().isMuted())) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.conference.rtc.eventEmitter.emit(RTCEvents.DOMINANT_SPEAKER_CHANGED, id);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=P2PDominantSpeakerDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"P2PDominantSpeakerDetection.js","sourceRoot":"","sources":["../../../../modules/detection/P2PDominantSpeakerDetection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD;;;;GAIG;AACH,MAAM,uBAAuB,GAAW,GAAG,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAI5C;;;;OAIG;IACH,YAAY,UAA2B;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAE7B,UAAU,CAAC,gBAAgB,CACvB,qBAAqB,CAAC,yBAAyB,EAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACK,WAAW,CAAC,EAAU,EAAE,UAAkB;QAC9C,yCAAyC;QACzC,4CAA4C;QAC5C,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;eAC3B,UAAU,IAAI,uBAAuB;eACrC,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ;mBACb,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC7D,OAAO;QACX,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CACjC,SAAS,CAAC,wBAAwB,EAClC,EAAE,CAAC,CAAC;IACZ,CAAC;CACJ"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import RTC from '../RTC/RTC';
|
|
2
|
+
import EventEmitter from '../util/EventEmitter';
|
|
3
|
+
import { createAudioContext } from '../webaudio/WebAudioUtils';
|
|
4
|
+
import { DetectionEvents } from './DetectionEvents';
|
|
5
|
+
/**
|
|
6
|
+
* Connects an audio JitsiLocalTrack to a vadProcessor using WebAudio ScriptProcessorNode.
|
|
7
|
+
* Once an object is created audio from the local track flows through the ScriptProcessorNode as raw PCM.
|
|
8
|
+
* The PCM is processed by the injected vad module and a voice activity detection score is obtained, the
|
|
9
|
+
* score is published to consumers via an EventEmitter.
|
|
10
|
+
* After work is done with this service the destroy method needs to be called for a proper cleanup.
|
|
11
|
+
*
|
|
12
|
+
* @fires VAD_SCORE_PUBLISHED
|
|
13
|
+
*/
|
|
14
|
+
export default class TrackVADEmitter extends EventEmitter {
|
|
15
|
+
/**
|
|
16
|
+
* Constructor.
|
|
17
|
+
*
|
|
18
|
+
* @param {number} procNodeSampleRate - Sample rate of the ScriptProcessorNode. Possible values 256, 512, 1024,
|
|
19
|
+
* 2048, 4096, 8192, 16384. Passing other values will default to closes neighbor.
|
|
20
|
+
* @param {Object} vadProcessor - VAD processor that allows us to calculate VAD score for PCM samples.
|
|
21
|
+
* @param {JitsiLocalTrack} jitsiLocalTrack - JitsiLocalTrack corresponding to micDeviceId.
|
|
22
|
+
*/
|
|
23
|
+
constructor(procNodeSampleRate, vadProcessor, jitsiLocalTrack) {
|
|
24
|
+
super();
|
|
25
|
+
/**
|
|
26
|
+
* Sample rate of the ScriptProcessorNode.
|
|
27
|
+
*/
|
|
28
|
+
this._procNodeSampleRate = procNodeSampleRate;
|
|
29
|
+
/**
|
|
30
|
+
* VAD Processor that allows us to calculate VAD score for PCM samples
|
|
31
|
+
*/
|
|
32
|
+
this._vadProcessor = vadProcessor;
|
|
33
|
+
/**
|
|
34
|
+
* The JitsiLocalTrack instance.
|
|
35
|
+
*/
|
|
36
|
+
this._localTrack = jitsiLocalTrack;
|
|
37
|
+
/**
|
|
38
|
+
* Buffer to hold residue PCM resulting after a ScriptProcessorNode callback
|
|
39
|
+
*/
|
|
40
|
+
this._bufferResidue = new Float32Array([]);
|
|
41
|
+
/**
|
|
42
|
+
* The AudioContext instance with the preferred sample frequency.
|
|
43
|
+
*/
|
|
44
|
+
this._audioContext = createAudioContext({ sampleRate: vadProcessor.getRequiredPCMFrequency() });
|
|
45
|
+
/**
|
|
46
|
+
* PCM Sample size expected by the VAD Processor instance. We cache it here as this value is used extensively,
|
|
47
|
+
* saves a couple of function calls.
|
|
48
|
+
*/
|
|
49
|
+
this._vadSampleSize = vadProcessor.getSampleLength();
|
|
50
|
+
/**
|
|
51
|
+
* Event listener function that will be called by the ScriptProcessNode with raw PCM data, depending on the set
|
|
52
|
+
* sample rate.
|
|
53
|
+
*/
|
|
54
|
+
this._onAudioProcess = this._onAudioProcess.bind(this);
|
|
55
|
+
this._initializeAudioContext();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Factory method that sets up all the necessary components for the creation of the TrackVADEmitter.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} micDeviceId - Target microphone device id.
|
|
61
|
+
* @param {number} procNodeSampleRate - Sample rate of the proc node.
|
|
62
|
+
* @param {Object} vadProcessor -Module that calculates the voice activity score for a certain audio PCM sample.
|
|
63
|
+
* The processor needs to implement the following functions:
|
|
64
|
+
* - <tt>getSampleLength()</tt> - Returns the sample size accepted by getSampleLength.
|
|
65
|
+
* - <tt>getRequiredPCMFrequency()</tt> - Returns the PCM frequency at which the processor operates.
|
|
66
|
+
* - <tt>calculateAudioFrameVAD(pcmSample)</tt> - Process a 32 float pcm sample of getSampleLength size.
|
|
67
|
+
* @returns {Promise<TrackVADEmitter>} - Promise resolving in a new instance of TrackVADEmitter.
|
|
68
|
+
*/
|
|
69
|
+
static create(micDeviceId, procNodeSampleRate, vadProcessor) {
|
|
70
|
+
return RTC.obtainAudioAndVideoPermissions({
|
|
71
|
+
devices: ['audio'],
|
|
72
|
+
micDeviceId
|
|
73
|
+
}).then((localTrack) => {
|
|
74
|
+
// We only expect one audio track when specifying a device id.
|
|
75
|
+
if (!localTrack[0]) {
|
|
76
|
+
throw new Error(`Failed to create jitsi local track for device id: ${micDeviceId}`);
|
|
77
|
+
}
|
|
78
|
+
return new TrackVADEmitter(procNodeSampleRate, vadProcessor, localTrack[0]);
|
|
79
|
+
// We have no exception handling at this point as there is nothing to clean up, the vadProcessor
|
|
80
|
+
// life cycle is handled by whoever created this instance.
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Sets up the audio graph in the AudioContext.
|
|
85
|
+
*
|
|
86
|
+
* @returns {void}
|
|
87
|
+
*/
|
|
88
|
+
_initializeAudioContext() {
|
|
89
|
+
this._audioSource = this._audioContext.createMediaStreamSource(this._localTrack.stream);
|
|
90
|
+
// TODO AudioProcessingNode is deprecated in the web audio specifications and the recommended replacement
|
|
91
|
+
// is audio worklet, however at the point of implementation AudioProcessingNode was still de de facto way
|
|
92
|
+
// of achieving this functionality and supported in all major browsers as opposed to audio worklet which
|
|
93
|
+
// was only available in Chrome. This todo is just a reminder that we should replace AudioProcessingNode
|
|
94
|
+
// with audio worklet when it's mature enough and has more browser support.
|
|
95
|
+
// We don't need stereo for determining the VAD score so we create a single channel processing node.
|
|
96
|
+
this._audioProcessingNode = this._audioContext.createScriptProcessor(this._procNodeSampleRate, 1, 1);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* ScriptProcessorNode callback, the input parameters contains the PCM audio that is then sent to rnnoise.
|
|
100
|
+
* Rnnoise only accepts PCM samples of 480 bytes whereas the webaudio processor node can't sample at a multiple
|
|
101
|
+
* of 480 thus after each _onAudioProcess callback there will remain and PCM buffer residue equal
|
|
102
|
+
* to _procNodeSampleRate / 480 which will be added to the next sample buffer and so on.\
|
|
103
|
+
*
|
|
104
|
+
*
|
|
105
|
+
* @param {AudioProcessingEvent} audioEvent - Audio event.
|
|
106
|
+
* @returns {void}
|
|
107
|
+
* @fires VAD_SCORE_PUBLISHED
|
|
108
|
+
*/
|
|
109
|
+
_onAudioProcess(audioEvent) {
|
|
110
|
+
// Prepend the residue PCM buffer from the previous process callback.
|
|
111
|
+
const inData = audioEvent.inputBuffer.getChannelData(0);
|
|
112
|
+
const completeInData = [...this._bufferResidue, ...inData];
|
|
113
|
+
const sampleTimestamp = Date.now();
|
|
114
|
+
let i = 0;
|
|
115
|
+
for (; i + this._vadSampleSize < completeInData.length; i += this._vadSampleSize) {
|
|
116
|
+
const pcmSample = completeInData.slice(i, i + this._vadSampleSize);
|
|
117
|
+
// The VAD processor might change the values inside the array so we make a copy.
|
|
118
|
+
const vadScore = this._vadProcessor.calculateAudioFrameVAD(pcmSample.slice());
|
|
119
|
+
this.emit(DetectionEvents.VAD_SCORE_PUBLISHED, {
|
|
120
|
+
deviceId: this._localTrack.getDeviceId(),
|
|
121
|
+
pcmData: pcmSample,
|
|
122
|
+
score: vadScore,
|
|
123
|
+
timestamp: sampleTimestamp
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
this._bufferResidue = new Float32Array(completeInData.slice(i, completeInData.length));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Connects the nodes in the AudioContext to start the flow of audio data.
|
|
130
|
+
*
|
|
131
|
+
* @returns {void}
|
|
132
|
+
*/
|
|
133
|
+
_connectAudioGraph() {
|
|
134
|
+
this._audioProcessingNode.onaudioprocess = this._onAudioProcess;
|
|
135
|
+
this._audioSource.connect(this._audioProcessingNode);
|
|
136
|
+
this._audioProcessingNode.connect(this._audioContext.destination);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Disconnects the nodes in the AudioContext.
|
|
140
|
+
*
|
|
141
|
+
* @returns {void}
|
|
142
|
+
*/
|
|
143
|
+
_disconnectAudioGraph() {
|
|
144
|
+
// Even thought we disconnect the processing node it seems that some callbacks remain queued,
|
|
145
|
+
// resulting in calls with and uninitialized context.
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
147
|
+
this._audioProcessingNode.onaudioprocess = () => { };
|
|
148
|
+
this._audioProcessingNode.disconnect();
|
|
149
|
+
this._audioSource.disconnect();
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Cleanup potentially acquired resources.
|
|
153
|
+
*
|
|
154
|
+
* @returns {void}
|
|
155
|
+
*/
|
|
156
|
+
_cleanupResources() {
|
|
157
|
+
this._disconnectAudioGraph();
|
|
158
|
+
this._localTrack.stopStream();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Start the emitter by connecting the audio graph.
|
|
162
|
+
*
|
|
163
|
+
* @returns {void}
|
|
164
|
+
*/
|
|
165
|
+
start() {
|
|
166
|
+
this._connectAudioGraph();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Stops the emitter by disconnecting the audio graph.
|
|
170
|
+
*
|
|
171
|
+
* @returns {void}
|
|
172
|
+
*/
|
|
173
|
+
stop() {
|
|
174
|
+
this._disconnectAudioGraph();
|
|
175
|
+
this._bufferResidue = new Float32Array([]);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Destroy TrackVADEmitter instance (release resources and stop callbacks).
|
|
179
|
+
*
|
|
180
|
+
* @returns {void}
|
|
181
|
+
*/
|
|
182
|
+
destroy() {
|
|
183
|
+
if (this._destroyed) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this._cleanupResources();
|
|
187
|
+
this._destroyed = true;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=TrackVADEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrackVADEmitter.js","sourceRoot":"","sources":["../../../../modules/detection/TrackVADEmitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { getLogger } from '@jitsi/logger';
|
|
2
|
+
import { JitsiConferenceEvents } from '../../JitsiConferenceEvents';
|
|
3
|
+
import EventEmitter from '../util/EventEmitter';
|
|
4
|
+
import { DetectionEvents } from './DetectionEvents';
|
|
5
|
+
import TrackVADEmitter from './TrackVADEmitter';
|
|
6
|
+
const logger = getLogger('vad:VADAudioAnalyser');
|
|
7
|
+
/**
|
|
8
|
+
* Sample rate of TrackVADEmitter, it defines how many audio samples are processed at a time.
|
|
9
|
+
* @type {number}
|
|
10
|
+
*/
|
|
11
|
+
const VAD_EMITTER_SAMPLE_RATE = 4096;
|
|
12
|
+
/**
|
|
13
|
+
* Connects a TrackVADEmitter to the target conference local audio track and manages various services that use
|
|
14
|
+
* the data to produce audio analytics (VADTalkMutedDetection and VADNoiseDetection).
|
|
15
|
+
*/
|
|
16
|
+
export default class VADAudioAnalyser extends EventEmitter {
|
|
17
|
+
/**
|
|
18
|
+
* Creates <tt>VADAudioAnalyser</tt>
|
|
19
|
+
* @param {JitsiConference} conference - JitsiConference instance that created us.
|
|
20
|
+
* @param {Object} createVADProcessor - Function that creates a Voice activity detection processor. The processor
|
|
21
|
+
* needs to implement the following functions:
|
|
22
|
+
* - <tt>getSampleLength()</tt> - Returns the sample size accepted by getSampleLength.
|
|
23
|
+
* - <tt>getRequiredPCMFrequency()</tt> - Returns the PCM frequency at which the processor operates.
|
|
24
|
+
* - <tt>calculateAudioFrameVAD(pcmSample)</tt> - Process a 32 float pcm sample of getSampleLength size.
|
|
25
|
+
* @constructor
|
|
26
|
+
*/
|
|
27
|
+
constructor(conference, createVADProcessor) {
|
|
28
|
+
super();
|
|
29
|
+
/**
|
|
30
|
+
* Member function that instantiates a VAD processor.
|
|
31
|
+
*/
|
|
32
|
+
this._createVADProcessor = createVADProcessor;
|
|
33
|
+
/**
|
|
34
|
+
* Current {@link TrackVADEmitter}. VAD Emitter uses a {@link JitsiLocalTrack} and VAD processor to generate
|
|
35
|
+
* period voice probability scores.
|
|
36
|
+
*/
|
|
37
|
+
this._vadEmitter = null;
|
|
38
|
+
/**
|
|
39
|
+
* Current state of the _vadEmitter
|
|
40
|
+
*/
|
|
41
|
+
this._isVADEmitterRunning = false;
|
|
42
|
+
/**
|
|
43
|
+
* Array of currently attached VAD processing services.
|
|
44
|
+
*/
|
|
45
|
+
this._detectionServices = [];
|
|
46
|
+
/**
|
|
47
|
+
* Promise used to chain create and destroy operations associated with TRACK_ADDED and TRACK_REMOVED events
|
|
48
|
+
* coming from the conference.
|
|
49
|
+
* Because we have an async created component (VAD Processor) we need to make sure that it's initialized before
|
|
50
|
+
* we destroy it ( when changing the device for instance), or when we use it from an external point of entry
|
|
51
|
+
* i.e. (TRACK_MUTE_CHANGED event callback).
|
|
52
|
+
*/
|
|
53
|
+
this._vadInitTracker = Promise.resolve();
|
|
54
|
+
/**
|
|
55
|
+
* Listens for {@link TrackVADEmitter} events and processes them.
|
|
56
|
+
*/
|
|
57
|
+
this._processVADScore = this._processVADScore.bind(this);
|
|
58
|
+
conference.on(JitsiConferenceEvents.TRACK_ADDED, this._trackAdded.bind(this));
|
|
59
|
+
conference.on(JitsiConferenceEvents.TRACK_REMOVED, this._trackRemoved.bind(this));
|
|
60
|
+
conference.on(JitsiConferenceEvents.TRACK_MUTE_CHANGED, this._trackMuteChanged.bind(this));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Attach a VAD detector service to the analyser and handle it's state changes.
|
|
64
|
+
*
|
|
65
|
+
* @param {Object} vadTMDetector
|
|
66
|
+
*/
|
|
67
|
+
addVADDetectionService(vadService) {
|
|
68
|
+
this._detectionServices.push(vadService);
|
|
69
|
+
vadService.on(DetectionEvents.DETECTOR_STATE_CHANGE, () => {
|
|
70
|
+
// When the state of a detector changes check if there are any active detectors attached so that
|
|
71
|
+
// the _vadEmitter doesn't run needlessly.
|
|
72
|
+
const activeDetector = this._detectionServices.filter(detector => detector.isActive() === true);
|
|
73
|
+
// If there are no active detectors running and the vadEmitter is running then stop the emitter as it is
|
|
74
|
+
// uses a considerable amount of CPU. Otherwise start the service if it's stopped and there is a detector
|
|
75
|
+
// that needs it.
|
|
76
|
+
if (!activeDetector.length && this._isVADEmitterRunning) {
|
|
77
|
+
this._stopVADEmitter();
|
|
78
|
+
}
|
|
79
|
+
else if (!this._isVADEmitterRunning) {
|
|
80
|
+
this._startVADEmitter();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Start the {@link TrackVADEmitter} and attach the event listener.
|
|
86
|
+
* @returns {void}
|
|
87
|
+
*/
|
|
88
|
+
_startVADEmitter() {
|
|
89
|
+
if (this._vadEmitter) {
|
|
90
|
+
this._vadEmitter.on(DetectionEvents.VAD_SCORE_PUBLISHED, this._processVADScore);
|
|
91
|
+
this._vadEmitter.start();
|
|
92
|
+
this._isVADEmitterRunning = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Stop the {@link TrackVADEmitter} and detach the event listener.
|
|
97
|
+
* @returns {void}
|
|
98
|
+
*/
|
|
99
|
+
_stopVADEmitter() {
|
|
100
|
+
if (this._vadEmitter) {
|
|
101
|
+
this._vadEmitter.removeListener(DetectionEvents.VAD_SCORE_PUBLISHED, this._processVADScore);
|
|
102
|
+
this._vadEmitter.stop();
|
|
103
|
+
}
|
|
104
|
+
this._isVADEmitterRunning = false;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Listens for {@link TrackVADEmitter} events and directs them to attached services as needed.
|
|
108
|
+
*
|
|
109
|
+
* @param {Object} vadScore -VAD score emitted by {@link TrackVADEmitter}
|
|
110
|
+
* @param {Date} vadScore.timestamp - Exact time at which processed PCM sample was generated.
|
|
111
|
+
* @param {number} vadScore.score - VAD score on a scale from 0 to 1 (i.e. 0.7)
|
|
112
|
+
* @param {Float32Array} pcmData - Raw PCM data with which the VAD score was calculated.
|
|
113
|
+
* @param {string} vadScore.deviceId - Device id of the associated track.
|
|
114
|
+
* @listens VAD_SCORE_PUBLISHED
|
|
115
|
+
*/
|
|
116
|
+
_processVADScore(vadScore) {
|
|
117
|
+
for (const detector of this._detectionServices) {
|
|
118
|
+
detector.processVADScore(vadScore);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Change the isMuted state of all attached detection services.
|
|
123
|
+
*
|
|
124
|
+
* @param {boolean} isMuted
|
|
125
|
+
*/
|
|
126
|
+
_changeDetectorsMuteState(isMuted) {
|
|
127
|
+
for (const detector of this._detectionServices) {
|
|
128
|
+
detector.changeMuteState(isMuted);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Notifies the detector that a track was added to the associated {@link JitsiConference}.
|
|
133
|
+
* Only take into account local audio tracks.
|
|
134
|
+
* @param {JitsiLocalTrack} track - The added track.
|
|
135
|
+
* @returns {void}
|
|
136
|
+
* @listens TRACK_ADDED
|
|
137
|
+
*/
|
|
138
|
+
_trackAdded(track) {
|
|
139
|
+
if (track.isLocalAudioTrack()) {
|
|
140
|
+
// Keep a track promise so we take into account successive TRACK_ADD events being generated so that we
|
|
141
|
+
// destroy/create the processing context in the proper order.
|
|
142
|
+
this._vadInitTracker = this._vadInitTracker.then(() => this._createVADProcessor())
|
|
143
|
+
.then((vadProcessor) => TrackVADEmitter.create(track.getDeviceId(), VAD_EMITTER_SAMPLE_RATE, vadProcessor))
|
|
144
|
+
.then((vadEmitter) => {
|
|
145
|
+
logger.debug('Created VAD emitter for track: ', track.getTrackLabel());
|
|
146
|
+
this._vadEmitter = vadEmitter;
|
|
147
|
+
// Iterate through the detection services and set their appropriate mute state, depending on
|
|
148
|
+
// service this will trigger a DETECTOR_STATE_CHANGE which in turn might start the _vadEmitter.
|
|
149
|
+
this._changeDetectorsMuteState(track.isMuted());
|
|
150
|
+
})
|
|
151
|
+
.catch(error => {
|
|
152
|
+
logger.warn('Failed to start VADAudioAnalyser', error);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Notifies the detector that the mute state of a {@link JitsiConference} track has changed. Only takes into account
|
|
158
|
+
* local audio tracks.
|
|
159
|
+
* @param {JitsiLocalTrack} track - The track whose mute state has changed.
|
|
160
|
+
* @returns {void}
|
|
161
|
+
* @listens TRACK_MUTE_CHANGED
|
|
162
|
+
*/
|
|
163
|
+
_trackMuteChanged(track) {
|
|
164
|
+
if (track.isLocalAudioTrack()) {
|
|
165
|
+
// On a mute toggle reset the state.
|
|
166
|
+
this._vadInitTracker = this._vadInitTracker.then(() => {
|
|
167
|
+
// Set mute status for the attached detection services.
|
|
168
|
+
this._changeDetectorsMuteState(track.isMuted());
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Notifies the detector that a track associated with the {@link JitsiConference} was removed. Only takes into
|
|
174
|
+
* account local audio tracks. Cleans up resources associated with the track and resets the processing context.
|
|
175
|
+
*
|
|
176
|
+
* @param {JitsiLocalTrack} track - The removed track.
|
|
177
|
+
* @returns {void}
|
|
178
|
+
* @listens TRACK_REMOVED
|
|
179
|
+
*/
|
|
180
|
+
_trackRemoved(track) {
|
|
181
|
+
if (track.isLocalAudioTrack()) {
|
|
182
|
+
// Use the promise to make sure operations are in sequence.
|
|
183
|
+
this._vadInitTracker = this._vadInitTracker.then(() => {
|
|
184
|
+
logger.debug('Removing track from VAD detection - ', track.getTrackLabel());
|
|
185
|
+
// Track was removed, clean up and set appropriate states.
|
|
186
|
+
if (this._vadEmitter) {
|
|
187
|
+
this._stopVADEmitter();
|
|
188
|
+
this._vadEmitter.destroy();
|
|
189
|
+
this._vadEmitter = null;
|
|
190
|
+
}
|
|
191
|
+
// Reset state of detectors when active track is removed.
|
|
192
|
+
for (const detector of this._detectionServices) {
|
|
193
|
+
detector.reset();
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=VADAudioAnalyser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VADAudioAnalyser.js","sourceRoot":"","sources":["../../../../modules/detection/VADAudioAnalyser.ts"],"names":[],"mappings":"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"}
|