Skip to content

Commit f65d22b

Browse files
committed
feat(DSI) Calculate dominant speakers locally when audio susbscription is enabled on client.
1 parent 4d9a138 commit f65d22b

File tree

12 files changed

+1124
-6
lines changed

12 files changed

+1124
-6
lines changed

JitsiConferenceEventManager.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import EventEmitterForwarder from './modules/util/EventEmitterForwarder';
1414
import JingleSessionPC from './modules/xmpp/JingleSessionPC';
1515
import { MediaType } from './service/RTC/MediaType';
1616
import RTCEvents from './service/RTC/RTCEvents';
17+
import { ReceiverAudioSubscription } from './service/RTC/ReceiverAudioSubscription';
1718
import { VideoType } from './service/RTC/VideoType';
1819
import AuthenticationEvents
1920
from './service/authentication/AuthenticationEvents';
@@ -487,8 +488,27 @@ export default class JitsiConferenceEventManager {
487488
RTCEvents.REMOTE_TRACK_REMOVED,
488489
conference.onRemoteTrackRemoved.bind(conference));
489490

491+
rtc.addListener(
492+
RTCEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED,
493+
(mode, list) => {
494+
conference.eventEmitter.emit(
495+
JitsiConferenceEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED, mode, list);
496+
497+
// We need to update the speaker list if audio subscription mode changes such that it triggers a
498+
// dominant speaker change based on the remote audio levels.
499+
if (conference.statistics && mode !== ReceiverAudioSubscription.ALL) {
500+
const remoteSpeakerIds = Array.isArray(list) ? list.map(source => source.split('-')[0]) : [];
501+
502+
conference.statistics.setSpeakerList(remoteSpeakerIds);
503+
}
504+
}
505+
);
506+
490507
rtc.addListener(RTCEvents.DOMINANT_SPEAKER_CHANGED,
491508
(dominant: string, previous: string[], silence: boolean) => {
509+
if (conference.statistics.dominantSpeakerEnabled) {
510+
return;
511+
}
492512
if ((conference.lastDominantSpeaker !== dominant || conference.dominantSpeakerIsSilent !== silence)
493513
&& conference.room) {
494514
conference.lastDominantSpeaker = dominant;
@@ -598,6 +618,10 @@ export default class JitsiConferenceEventManager {
598618
JitsiConferenceEvents.BEFORE_STATISTICS_DISPOSED);
599619
});
600620

621+
conference.statistics.addDominantSpeakerListener((tpc, dominant, previous) => {
622+
conference.eventEmitter.emit(JitsiConferenceEvents.DOMINANT_SPEAKER_CHANGED, dominant, previous);
623+
});
624+
601625
conference.statistics.addEncodeTimeStatsListener((tpc: TraceablePeerConnection, stats: RTCEncodedAudioFrameMetadata) => {
602626
conference.eventEmitter.emit(
603627
JitsiConferenceEvents.ENCODE_TIME_STATS_RECEIVED, tpc, stats);

JitsiConferenceEvents.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import * as exported from "./JitsiConferenceEvents";
55
describe( "/JitsiConferenceEvents members", () => {
66
const {
77
AUDIO_INPUT_STATE_CHANGE,
8+
AUDIO_SUBSCRIPTION_MODE_CHANGED,
89
AUDIO_UNMUTE_PERMISSIONS_CHANGED,
910
AUTH_STATUS_CHANGED,
1011
BEFORE_STATISTICS_DISPOSED,
@@ -98,6 +99,7 @@ describe( "/JitsiConferenceEvents members", () => {
9899

99100
it( "known members", () => {
100101
expect( AUDIO_INPUT_STATE_CHANGE ).toBe( 'conference.audio_input_state_changed' );
102+
expect( AUDIO_SUBSCRIPTION_MODE_CHANGED ).toBe( 'conference.audio_subscription_mode_changed' );
101103
expect( AUDIO_UNMUTE_PERMISSIONS_CHANGED ).toBe( 'conference.audio_unmute_permissions_changed' );
102104
expect( AUTH_STATUS_CHANGED ).toBe( 'conference.auth_status_changed' );
103105
expect( BEFORE_STATISTICS_DISPOSED ).toBe( 'conference.beforeStatisticsDisposed' );
@@ -185,6 +187,7 @@ describe( "/JitsiConferenceEvents members", () => {
185187
expect( JitsiConferenceEvents ).toBeDefined();
186188

187189
expect( JitsiConferenceEvents.AUDIO_INPUT_STATE_CHANGE ).toBe( 'conference.audio_input_state_changed' );
190+
expect( JitsiConferenceEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED ).toBe( 'conference.audio_subscription_mode_changed' );
188191
expect( JitsiConferenceEvents.AUDIO_UNMUTE_PERMISSIONS_CHANGED ).toBe( 'conference.audio_unmute_permissions_changed' );
189192
expect( JitsiConferenceEvents.AUTH_STATUS_CHANGED ).toBe( 'conference.auth_status_changed' );
190193
expect( JitsiConferenceEvents.BEFORE_STATISTICS_DISPOSED ).toBe( 'conference.beforeStatisticsDisposed' );

JitsiConferenceEvents.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ export enum JitsiConferenceEvents {
99
*/
1010
AUDIO_INPUT_STATE_CHANGE = 'conference.audio_input_state_changed',
1111

12+
/**
13+
* Event indicates that the audio subscription mode changed.
14+
*/
15+
AUDIO_SUBSCRIPTION_MODE_CHANGED = 'conference.audio_subscription_mode_changed',
1216
/**
1317
* Event indicates that the permission for unmuting audio has changed based on the number of audio senders in the
1418
* call and the audio sender limit configured in Jicofo.
@@ -534,6 +538,7 @@ export enum JitsiConferenceEvents {
534538
export const _MEDIA_SESSION_STARTED = JitsiConferenceEvents._MEDIA_SESSION_STARTED;
535539
export const _MEDIA_SESSION_ACTIVE_CHANGED = JitsiConferenceEvents._MEDIA_SESSION_ACTIVE_CHANGED;
536540
export const AUDIO_INPUT_STATE_CHANGE = JitsiConferenceEvents.AUDIO_INPUT_STATE_CHANGE;
541+
export const AUDIO_SUBSCRIPTION_MODE_CHANGED = JitsiConferenceEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED;
537542
export const AUDIO_UNMUTE_PERMISSIONS_CHANGED = JitsiConferenceEvents.AUDIO_UNMUTE_PERMISSIONS_CHANGED;
538543
export const AUTH_STATUS_CHANGED = JitsiConferenceEvents.AUTH_STATUS_CHANGED;
539544
export const AV_MODERATION_APPROVED = JitsiConferenceEvents.AV_MODERATION_APPROVED;

modules/qualitycontrol/ReceiveAudioController.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { getLogger } from '@jitsi/logger';
33
import { isEqual } from 'lodash-es';
44

55
import JitsiConference from '../../JitsiConference';
6+
import { MediaType } from '../../service/RTC/MediaType';
7+
import RTCEvents from '../../service/RTC/RTCEvents';
68
import { IReceiverAudioSubscriptionMessage, ReceiverAudioSubscription } from '../../service/RTC/ReceiverAudioSubscription';
79
import RTC from '../RTC/RTC';
810

@@ -70,6 +72,7 @@ export class ReceiverAudioController {
7072
return;
7173
}
7274
this._subscriptionMode = message.mode;
75+
7376
if (message.mode == ReceiverAudioSubscription.INCLUDE
7477
|| message.mode == ReceiverAudioSubscription.EXCLUDE) {
7578

@@ -92,5 +95,10 @@ export class ReceiverAudioController {
9295
list: this._sourceList,
9396
mode: this._subscriptionMode
9497
});
98+
99+
this._rtc.eventEmitter.emit(RTCEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED, {
100+
list: this._sourceList,
101+
mode: this._subscriptionMode
102+
});
95103
}
96104
}

0 commit comments

Comments
 (0)