Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions JitsiConferenceEventManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import EventEmitterForwarder from './modules/util/EventEmitterForwarder';
import JingleSessionPC from './modules/xmpp/JingleSessionPC';
import { MediaType } from './service/RTC/MediaType';
import RTCEvents from './service/RTC/RTCEvents';
import { ReceiverAudioSubscription } from './service/RTC/ReceiverAudioSubscription';
import { VideoType } from './service/RTC/VideoType';
import AuthenticationEvents
from './service/authentication/AuthenticationEvents';
Expand Down Expand Up @@ -487,8 +488,27 @@ export default class JitsiConferenceEventManager {
RTCEvents.REMOTE_TRACK_REMOVED,
conference.onRemoteTrackRemoved.bind(conference));

rtc.addListener(
RTCEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED,
(mode, list) => {
conference.eventEmitter.emit(
JitsiConferenceEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED, mode, list);

// We need to update the speaker list if audio subscription mode changes such that it triggers a
// dominant speaker change based on the remote audio levels.
if (conference.statistics && mode !== ReceiverAudioSubscription.ALL) {
const remoteSpeakerIds = Array.isArray(list) ? list.map(source => source.split('-')[0]) : [];

conference.statistics.setSpeakerList(remoteSpeakerIds);
}
}
);

rtc.addListener(RTCEvents.DOMINANT_SPEAKER_CHANGED,
(dominant: string, previous: string[], silence: boolean) => {
if (conference.statistics.dominantSpeakerEnabled) {
return;
}
if ((conference.lastDominantSpeaker !== dominant || conference.dominantSpeakerIsSilent !== silence)
&& conference.room) {
conference.lastDominantSpeaker = dominant;
Expand Down Expand Up @@ -598,6 +618,10 @@ export default class JitsiConferenceEventManager {
JitsiConferenceEvents.BEFORE_STATISTICS_DISPOSED);
});

conference.statistics.addDominantSpeakerListener((tpc, dominant, previous) => {
conference.eventEmitter.emit(JitsiConferenceEvents.DOMINANT_SPEAKER_CHANGED, dominant, previous);
});

conference.statistics.addEncodeTimeStatsListener((tpc: TraceablePeerConnection, stats: RTCEncodedAudioFrameMetadata) => {
conference.eventEmitter.emit(
JitsiConferenceEvents.ENCODE_TIME_STATS_RECEIVED, tpc, stats);
Expand Down
3 changes: 3 additions & 0 deletions JitsiConferenceEvents.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import * as exported from "./JitsiConferenceEvents";
describe( "/JitsiConferenceEvents members", () => {
const {
AUDIO_INPUT_STATE_CHANGE,
AUDIO_SUBSCRIPTION_MODE_CHANGED,
AUDIO_UNMUTE_PERMISSIONS_CHANGED,
AUTH_STATUS_CHANGED,
BEFORE_STATISTICS_DISPOSED,
Expand Down Expand Up @@ -98,6 +99,7 @@ describe( "/JitsiConferenceEvents members", () => {

it( "known members", () => {
expect( AUDIO_INPUT_STATE_CHANGE ).toBe( 'conference.audio_input_state_changed' );
expect( AUDIO_SUBSCRIPTION_MODE_CHANGED ).toBe( 'conference.audio_subscription_mode_changed' );
expect( AUDIO_UNMUTE_PERMISSIONS_CHANGED ).toBe( 'conference.audio_unmute_permissions_changed' );
expect( AUTH_STATUS_CHANGED ).toBe( 'conference.auth_status_changed' );
expect( BEFORE_STATISTICS_DISPOSED ).toBe( 'conference.beforeStatisticsDisposed' );
Expand Down Expand Up @@ -185,6 +187,7 @@ describe( "/JitsiConferenceEvents members", () => {
expect( JitsiConferenceEvents ).toBeDefined();

expect( JitsiConferenceEvents.AUDIO_INPUT_STATE_CHANGE ).toBe( 'conference.audio_input_state_changed' );
expect( JitsiConferenceEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED ).toBe( 'conference.audio_subscription_mode_changed' );
expect( JitsiConferenceEvents.AUDIO_UNMUTE_PERMISSIONS_CHANGED ).toBe( 'conference.audio_unmute_permissions_changed' );
expect( JitsiConferenceEvents.AUTH_STATUS_CHANGED ).toBe( 'conference.auth_status_changed' );
expect( JitsiConferenceEvents.BEFORE_STATISTICS_DISPOSED ).toBe( 'conference.beforeStatisticsDisposed' );
Expand Down
5 changes: 5 additions & 0 deletions JitsiConferenceEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ export enum JitsiConferenceEvents {
*/
AUDIO_INPUT_STATE_CHANGE = 'conference.audio_input_state_changed',

/**
* Event indicates that the audio subscription mode changed.
*/
AUDIO_SUBSCRIPTION_MODE_CHANGED = 'conference.audio_subscription_mode_changed',
/**
* Event indicates that the permission for unmuting audio has changed based on the number of audio senders in the
* call and the audio sender limit configured in Jicofo.
Expand Down Expand Up @@ -534,6 +538,7 @@ export enum JitsiConferenceEvents {
export const _MEDIA_SESSION_STARTED = JitsiConferenceEvents._MEDIA_SESSION_STARTED;
export const _MEDIA_SESSION_ACTIVE_CHANGED = JitsiConferenceEvents._MEDIA_SESSION_ACTIVE_CHANGED;
export const AUDIO_INPUT_STATE_CHANGE = JitsiConferenceEvents.AUDIO_INPUT_STATE_CHANGE;
export const AUDIO_SUBSCRIPTION_MODE_CHANGED = JitsiConferenceEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED;
export const AUDIO_UNMUTE_PERMISSIONS_CHANGED = JitsiConferenceEvents.AUDIO_UNMUTE_PERMISSIONS_CHANGED;
export const AUTH_STATUS_CHANGED = JitsiConferenceEvents.AUTH_STATUS_CHANGED;
export const AV_MODERATION_APPROVED = JitsiConferenceEvents.AV_MODERATION_APPROVED;
Expand Down
9 changes: 7 additions & 2 deletions modules/qualitycontrol/ReceiveAudioController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { getLogger } from '@jitsi/logger';
import { isEqual } from 'lodash-es';

import JitsiConference from '../../JitsiConference';
import RTCEvents from '../../service/RTC/RTCEvents';
import { IReceiverAudioSubscriptionMessage, ReceiverAudioSubscription } from '../../service/RTC/ReceiverAudioSubscription';
import RTC from '../RTC/RTC';

Expand Down Expand Up @@ -70,6 +71,7 @@ export class ReceiverAudioController {
return;
}
this._subscriptionMode = message.mode;

if (message.mode == ReceiverAudioSubscription.INCLUDE
|| message.mode == ReceiverAudioSubscription.EXCLUDE) {

Expand All @@ -88,9 +90,12 @@ export class ReceiverAudioController {
this._sourceList = [];
}

this._rtc.sendReceiverAudioSubscriptionMessage({
const payload = {
list: this._sourceList,
mode: this._subscriptionMode
});
};

this._rtc.sendReceiverAudioSubscriptionMessage(payload);
this._rtc.eventEmitter.emit(RTCEvents.AUDIO_SUBSCRIPTION_MODE_CHANGED, payload);
}
}
Loading