Skip to content

Commit bfd788b

Browse files
authored
Migrate modules\detection\VADAudioAnalyser.ts (#2827)
1 parent b225c92 commit bfd788b

1 file changed

Lines changed: 44 additions & 17 deletions

File tree

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { getLogger } from '@jitsi/logger';
22

3+
import JitsiConference from '../../JitsiConference';
34
import * as JitsiConferenceEvents from '../../JitsiConferenceEvents';
5+
import JitsiLocalTrack from '../RTC/JitsiLocalTrack';
46
import EventEmitter from '../util/EventEmitter';
57

68
import { 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
*/
2144
export 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

Comments
 (0)