Skip to content

Commit

Permalink
feat: onNetworkQuality
Browse files Browse the repository at this point in the history
  • Loading branch information
guoxianzhe committed Oct 23, 2023
1 parent c23c0e7 commit a27ed1d
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 12 deletions.
2 changes: 1 addition & 1 deletion packages/fake/rtc/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "iris-web-rtc-fake",
"version": "0.1.2-dev.2",
"version": "0.1.2-dev.3",
"description": "wait",
"main": "./index.ts",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/rtc/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "iris-web-rtc",
"version": "0.1.2-dev.2",
"version": "0.1.2-dev.3",
"description": "wait",
"main": "./src/index.ts",
"scripts": {
Expand Down
28 changes: 26 additions & 2 deletions packages/rtc/src/engine/IrisClientManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import { AgoraConsole } from '../util';

import { IrisClient } from './IrisClient';
import { IrisClientObserver } from './IrisClientObserver';
import { IrisRtcEngine } from './IrisRtcEngine';
import { IrisIntervalType, IrisRtcEngine } from './IrisRtcEngine';

export type WalkILocalVideoPackageTrackFun = (track: VideoTrackPackage) => void;

Expand Down Expand Up @@ -330,9 +330,32 @@ export class IrisClientManager {
})[0];
}

addRemoteUserPackage(remoteUserPackage: RemoteUserPackage) {
addRemoteUserPackage(
remoteUserPackage: RemoteUserPackage,
agoraRTCClient: IAgoraRTCClient
) {
this.remoteUserPackages.push(remoteUserPackage);
this.irisClientObserver.addRemoteUserPackageObserver(remoteUserPackage);
if (agoraRTCClient) {
let intervalFunction = setInterval(() => {
let stats = agoraRTCClient.getRemoteNetworkQuality();
let connection: NATIVE_RTC.RtcConnection = {
channelId: agoraRTCClient.channelName,
localUid: agoraRTCClient.uid as number,
};
this._engine.rtcEngineEventHandler.onNetworkQualityEx(
connection,
remoteUserPackage.uid as number,
stats[remoteUserPackage.uid].downlinkNetworkQuality,
stats[remoteUserPackage.uid].uplinkNetworkQuality
);
}, this._engine.globalState.networkQualityInterval);
this._engine.addIrisInterval(
IrisIntervalType.networkQuality,
intervalFunction,
remoteUserPackage.uid
);
}
}

removeRemoteUserPackage(uid: UID) {
Expand All @@ -342,6 +365,7 @@ export class IrisClientManager {
this.remoteUserPackages.splice(i, 1);
i--;
this.irisClientObserver.removeRemoteUserPackageObserver(userPackage);
this._engine.removeIrisIntervalByUid(uid);
userPackage.dispose();

break;
Expand Down
28 changes: 26 additions & 2 deletions packages/rtc/src/engine/IrisRtcEngine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import { IrisClientManager } from './IrisClientManager';

export enum IrisIntervalType {
enableAudioVolumeIndication = 0,
networkQuality = 1,
}

export class IrisRtcEngine implements ApiInterceptor {
Expand All @@ -71,6 +72,7 @@ export class IrisRtcEngine implements ApiInterceptor {
public irisIntervalList: {
type: IrisIntervalType;
interval: NodeJS.Timeout;
uid: UID;
}[] = [];
public irisRtcErrorHandler: IrisRtcErrorHandler = new IrisRtcErrorHandler(
this
Expand Down Expand Up @@ -211,19 +213,41 @@ export class IrisRtcEngine implements ApiInterceptor {
await this.irisClientManager.release();
}

public addIrisInterval(type: IrisIntervalType, interval: NodeJS.Timeout) {
public addIrisInterval(
type: IrisIntervalType,
interval: NodeJS.Timeout,
uid: UID
) {
//如果添加的是远端用户的轮训,uid用远端的
this.irisIntervalList.push({
type,
interval,
uid,
});
}

public getIrisIntervalByType(type: IrisIntervalType) {
this.irisIntervalList.filter((a) => type == a.type);
}

public removeIrisIntervalByUid(uid: UID) {
this.irisIntervalList.filter((a) => {
if (uid == a.uid) {
a.interval && clearInterval(a.interval);
} else {
return a;
}
});
}

public removeIrisIntervalByType(type: IrisIntervalType) {
this.irisIntervalList.filter((a) => type != a.type);
this.irisIntervalList.filter((a) => {
if (type == a.type) {
a.interval && clearInterval(a.interval);
} else {
return a;
}
});
}

public clearIrisInterval() {
Expand Down
17 changes: 14 additions & 3 deletions packages/rtc/src/event_handler/IrisClientEventHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,10 @@ export class IrisClientEventHandler {
NATIVE_RTC.VIDEO_SOURCE_TYPE.VIDEO_SOURCE_REMOTE,
IrisAudioSourceType.kAudioSourceTypeRemote
);
this._engine.irisClientManager.addRemoteUserPackage(userPackage);
this._engine.irisClientManager.addRemoteUserPackage(
userPackage,
this.agoraRTCClient
);
} else {
userPackage.update({
uid: user.uid,
Expand Down Expand Up @@ -444,8 +447,16 @@ export class IrisClientEventHandler {
}

onEventNetworkQuality(stats: NetworkQuality): void {
//不能对应 onNetworkQuality, 因为这里是得到自己的网络状况,而 onNetworkQuality 是别人的网络状况
//暂时没有找到对应的回调
let connection: NATIVE_RTC.RtcConnection = {
channelId: this.agoraRTCClient.channelName,
localUid: this.agoraRTCClient.uid as number,
};
this._engine.rtcEngineEventHandler.onNetworkQualityEx(
connection,
0,
stats.downlinkNetworkQuality,
stats.uplinkNetworkQuality
);
}

//todo 后边再做
Expand Down
8 changes: 7 additions & 1 deletion packages/rtc/src/impl/IAgoraRtcEngineExImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,13 @@ export class IRtcEngineExImpl implements NATIVE_RTC.IRtcEngineEx {
canvas.uid,
NATIVE_RTC.VIDEO_SOURCE_TYPE.VIDEO_SOURCE_REMOTE
);
this._engine.irisClientManager.addRemoteUserPackage(userPackage);
let irisClient = this._engine.irisClientManager.getIrisClientByConnection(
connection
);
this._engine.irisClientManager.addRemoteUserPackage(
userPackage,
irisClient?.agoraRTCClient
);
}

return this._engine.returnResult();
Expand Down
3 changes: 2 additions & 1 deletion packages/rtc/src/impl/IAgoraRtcEngineImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1063,7 +1063,8 @@ export class IRtcEngineImpl implements IRtcEngineExtensions {
}, interval);
this._engine.addIrisInterval(
IrisIntervalType.enableAudioVolumeIndication,
intervalFunction
intervalFunction,
agoraRTCClient.uid
);
}
this._engine.globalState.enableAudioVolumeIndication = true;
Expand Down
2 changes: 2 additions & 0 deletions packages/rtc/src/state/IrisGlobalState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ export interface DeviceInfo {
export class IrisGlobalState {
public rtcEngineContext: NATIVE_RTC.RtcEngineContext;

public networkQualityInterval: number = 2000;

//C++ SetAudioProfile() initialize()
public audioProfile: NATIVE_RTC.AUDIO_PROFILE_TYPE;

Expand Down
7 changes: 6 additions & 1 deletion packages/rtc/test/impl/IAgoraRtcEngineImpl.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ describe('IAgoraRtcEngineImpl', () => {
test('joinChannel', async () => {
jest.spyOn(rtcEngineImpl, 'joinChannel2');

expect(irisRtcEngine.irisIntervalList.length == 0).toBeTruthy();
await joinChannel(apiEnginePtr, null);

expect(rtcEngineImpl.joinChannel2).toBeCalledWith(
Expand All @@ -265,6 +266,7 @@ describe('IAgoraRtcEngineImpl', () => {
TEST_UID,
irisRtcEngine.irisClientManager.getIrisClient().irisClientState
);
expect(irisRtcEngine.irisIntervalList.length == 1).toBeTruthy();
});

test('joinChannel', async () => {
Expand Down Expand Up @@ -332,7 +334,8 @@ describe('IAgoraRtcEngineImpl', () => {
expect(
irisRtcEngine.globalState.enableAudioVolumeIndicationConfig.smooth
).toBe(param.smooth);
expect(irisRtcEngine.irisIntervalList.length == 1).toBeTruthy();
//irisIntervalList是因为一个是远端的onnetworkquality 一个是enableAudioVolumeIndication的
expect(irisRtcEngine.irisIntervalList.length == 2).toBeTruthy();
expect(irisRtcEngine.globalState.enableAudioVolumeIndication).toBeTruthy();
jest.advanceTimersByTime(param.interval);
expect(
Expand All @@ -342,9 +345,11 @@ describe('IAgoraRtcEngineImpl', () => {

test('leaveChannel', async () => {
await joinChannel(apiEnginePtr, null);
expect(irisRtcEngine.irisIntervalList.length == 1).toBeTruthy();
jest.spyOn(rtcEngineImpl, 'leaveChannel2');
await callIris(apiEnginePtr, 'RtcEngine_leaveChannel');
expect(rtcEngineImpl.leaveChannel2).toBeCalled();
expect(irisRtcEngine.irisIntervalList.length == 0).toBeTruthy();
});

test('leaveChannel2', async () => {
Expand Down

0 comments on commit a27ed1d

Please sign in to comment.