11import { getLogger } from '@jitsi/logger' ;
22
3+ import JitsiConference from '../../JitsiConference' ;
34import * as JitsiConferenceEvents from '../../JitsiConferenceEvents' ;
5+ import JitsiLocalTrack from '../RTC/JitsiLocalTrack' ;
46import EventEmitter from '../util/EventEmitter' ;
57
68import { DETECTOR_STATE_CHANGE , VAD_SCORE_PUBLISHED } from './DetectionEvents' ;
@@ -12,13 +14,40 @@ const logger = getLogger('modules/detection/VADAudioAnalyser');
1214 * Sample rate of TrackVADEmitter, it defines how many audio samples are processed at a time.
1315 * @type {number }
1416 */
15- const VAD_EMITTER_SAMPLE_RATE = 4096 ;
17+ const VAD_EMITTER_SAMPLE_RATE : number = 4096 ;
18+
19+ export interface IVADProcessor {
20+ calculateAudioFrameVAD : ( pcmSample : Float32Array | number [ ] ) => number ;
21+ getRequiredPCMFrequency : ( ) => number ;
22+ getSampleLength : ( ) => number ;
23+ }
24+
25+ export interface IVADDetectionService {
26+ changeMuteState : ( isMuted : boolean ) => void ;
27+ isActive : ( ) => boolean ;
28+ on : ( event : string , handler : ( ) => void ) => void ;
29+ processVADScore : ( vadScore : IVADScore ) => void ;
30+ reset : ( ) => void ;
31+ }
32+
33+ export interface IVADScore {
34+ deviceId : string ;
35+ pcmData : Float32Array | number [ ] ;
36+ score : number ;
37+ timestamp : number ;
38+ }
1639
1740/**
1841 * Connects a TrackVADEmitter to the target conference local audio track and manages various services that use
1942 * the data to produce audio analytics (VADTalkMutedDetection and VADNoiseDetection).
2043 */
2144export default class VADAudioAnalyser extends EventEmitter {
45+ private _createVADProcessor : ( ) => IVADProcessor ;
46+ private _vadEmitter : TrackVADEmitter | null ;
47+ private _isVADEmitterRunning : boolean ;
48+ private _detectionServices : IVADDetectionService [ ] ;
49+ private _vadInitTracker : Promise < void > ;
50+
2251 /**
2352 * Creates <tt>VADAudioAnalyser</tt>
2453 * @param {JitsiConference } conference - JitsiConference instance that created us.
@@ -29,7 +58,7 @@ export default class VADAudioAnalyser extends EventEmitter {
2958 * - <tt>calculateAudioFrameVAD(pcmSample)</tt> - Process a 32 float pcm sample of getSampleLength size.
3059 * @constructor
3160 */
32- constructor ( conference , createVADProcessor ) {
61+ constructor ( conference : JitsiConference , createVADProcessor : ( ) => IVADProcessor ) {
3362 super ( ) ;
3463
3564 /**
@@ -77,7 +106,7 @@ export default class VADAudioAnalyser extends EventEmitter {
77106 *
78107 * @param {Object } vadTMDetector
79108 */
80- addVADDetectionService ( vadService ) {
109+ addVADDetectionService ( vadService : IVADDetectionService ) : void {
81110 this . _detectionServices . push ( vadService ) ;
82111 vadService . on ( DETECTOR_STATE_CHANGE , ( ) => {
83112 // When the state of a detector changes check if there are any active detectors attached so that
@@ -99,7 +128,7 @@ export default class VADAudioAnalyser extends EventEmitter {
99128 * Start the {@link TrackVADEmitter} and attach the event listener.
100129 * @returns {void }
101130 */
102- _startVADEmitter ( ) {
131+ _startVADEmitter ( ) : void {
103132 if ( this . _vadEmitter ) {
104133 this . _vadEmitter . on ( VAD_SCORE_PUBLISHED , this . _processVADScore ) ;
105134 this . _vadEmitter . start ( ) ;
@@ -111,7 +140,7 @@ export default class VADAudioAnalyser extends EventEmitter {
111140 * Stop the {@link TrackVADEmitter} and detach the event listener.
112141 * @returns {void }
113142 */
114- _stopVADEmitter ( ) {
143+ _stopVADEmitter ( ) : void {
115144 if ( this . _vadEmitter ) {
116145 this . _vadEmitter . removeListener ( VAD_SCORE_PUBLISHED , this . _processVADScore ) ;
117146 this . _vadEmitter . stop ( ) ;
@@ -129,7 +158,7 @@ export default class VADAudioAnalyser extends EventEmitter {
129158 * @param {string } vadScore.deviceId - Device id of the associated track.
130159 * @listens VAD_SCORE_PUBLISHED
131160 */
132- _processVADScore ( vadScore ) {
161+ _processVADScore ( vadScore : IVADScore ) : void {
133162 for ( const detector of this . _detectionServices ) {
134163 detector . processVADScore ( vadScore ) ;
135164 }
@@ -140,7 +169,7 @@ export default class VADAudioAnalyser extends EventEmitter {
140169 *
141170 * @param {boolean } isMuted
142171 */
143- _changeDetectorsMuteState ( isMuted ) {
172+ _changeDetectorsMuteState ( isMuted : boolean ) : void {
144173 for ( const detector of this . _detectionServices ) {
145174 detector . changeMuteState ( isMuted ) ;
146175 }
@@ -149,19 +178,19 @@ export default class VADAudioAnalyser extends EventEmitter {
149178 /**
150179 * Notifies the detector that a track was added to the associated {@link JitsiConference}.
151180 * Only take into account local audio tracks.
152- * @param {JitsiTrack } track - The added track.
181+ * @param {JitsiLocalTrack } track - The added track.
153182 * @returns {void }
154183 * @listens TRACK_ADDED
155184 */
156- _trackAdded ( track ) {
185+ _trackAdded ( track : JitsiLocalTrack ) : void {
157186 if ( track . isLocalAudioTrack ( ) ) {
158187 // Keep a track promise so we take into account successive TRACK_ADD events being generated so that we
159188 // destroy/create the processing context in the proper order.
160189 this . _vadInitTracker = this . _vadInitTracker . then ( ( ) => this . _createVADProcessor ( ) )
161- . then ( vadProcessor =>
190+ . then ( ( vadProcessor : IVADProcessor ) =>
162191 TrackVADEmitter . create ( track . getDeviceId ( ) , VAD_EMITTER_SAMPLE_RATE , vadProcessor )
163192 )
164- . then ( vadEmitter => {
193+ . then ( ( vadEmitter : TrackVADEmitter ) => {
165194 logger . debug ( 'Created VAD emitter for track: ' , track . getTrackLabel ( ) ) ;
166195
167196 this . _vadEmitter = vadEmitter ;
@@ -179,11 +208,11 @@ export default class VADAudioAnalyser extends EventEmitter {
179208 /**
180209 * Notifies the detector that the mute state of a {@link JitsiConference} track has changed. Only takes into account
181210 * local audio tracks.
182- * @param {JitsiTrack } track - The track whose mute state has changed.
211+ * @param {JitsiLocalTrack } track - The track whose mute state has changed.
183212 * @returns {void }
184213 * @listens TRACK_MUTE_CHANGED
185214 */
186- _trackMuteChanged ( track ) {
215+ _trackMuteChanged ( track : JitsiLocalTrack ) : void {
187216 if ( track . isLocalAudioTrack ( ) ) {
188217 // On a mute toggle reset the state.
189218 this . _vadInitTracker = this . _vadInitTracker . then ( ( ) => {
@@ -197,11 +226,11 @@ export default class VADAudioAnalyser extends EventEmitter {
197226 * Notifies the detector that a track associated with the {@link JitsiConference} was removed. Only takes into
198227 * account local audio tracks. Cleans up resources associated with the track and resets the processing context.
199228 *
200- * @param {JitsiTrack } track - The removed track.
229+ * @param {JitsiLocalTrack } track - The removed track.
201230 * @returns {void }
202231 * @listens TRACK_REMOVED
203232 */
204- _trackRemoved ( track ) {
233+ _trackRemoved ( track : JitsiLocalTrack ) : void {
205234 if ( track . isLocalAudioTrack ( ) ) {
206235 // Use the promise to make sure operations are in sequence.
207236 this . _vadInitTracker = this . _vadInitTracker . then ( ( ) => {
@@ -221,6 +250,4 @@ export default class VADAudioAnalyser extends EventEmitter {
221250 } ) ;
222251 }
223252 }
224-
225-
226253}
0 commit comments