chore: Add WebRTC delegate interface.

This commit is contained in:
cloudwebrtc 2021-11-27 01:20:04 +08:00
parent 72584d679c
commit 60618d1775
1 changed files with 28 additions and 6 deletions

View File

@ -6,6 +6,11 @@ import 'package:sdp_transform/sdp_transform.dart' as sdp_transform;
import '../matrix.dart';
abstract class WebRTCDelegate {
RTCFactory get rtcFactory;
VideoRenderer createRenderer();
}
/// The default life time for call events, in millisecond.
const lifetimeMs = 10 * 1000;
@ -23,6 +28,7 @@ class WrappedMediaStream {
bool audioMuted;
bool videoMuted;
final Client client;
VideoRenderer renderer;
/// for debug
String get title => '$displayName:$purpose:a[$audioMuted]:v[$videoMuted]';
@ -32,6 +38,7 @@ class WrappedMediaStream {
WrappedMediaStream(
{this.stream,
required this.renderer,
required this.room,
required this.userId,
required this.purpose,
@ -39,7 +46,18 @@ class WrappedMediaStream {
required this.audioMuted,
required this.videoMuted});
/// Initialize the video renderer
Future<void> initialize() async {
await renderer.initialize();
renderer.srcObject = stream;
renderer.onResize = () {
Logs().i(
'onResize [${stream!.id.substring(0, 8)}] ${renderer?.videoWidth} x ${renderer?.videoHeight}');
};
}
Future<void> dispose() async {
renderer.srcObject = null;
if (isLocal() && stream != null) {
await stream?.dispose();
stream = null;
@ -69,6 +87,7 @@ class WrappedMediaStream {
void setNewStream(MediaStream newStream) {
stream = newStream;
renderer.srcObject = stream;
if (onNewStream != null) {
onNewStream?.call(stream!);
}
@ -504,6 +523,7 @@ class CallSession {
existingStream.setNewStream(stream);
} else {
final newStream = WrappedMediaStream(
renderer: voip.delegate.createRenderer(),
userId: client.userID!,
room: opts.room,
stream: stream,
@ -563,6 +583,7 @@ class CallSession {
existingStream.setNewStream(stream);
} else {
final newStream = WrappedMediaStream(
renderer: voip.delegate.createRenderer(),
userId: remoteUser.id,
room: opts.room,
stream: stream,
@ -752,8 +773,8 @@ class CallSession {
Logs().v('[VOIP] Reject received for call ID ' + callId);
// No need to check party_id for reject because if we'd received either
// an answer or reject, we wouldn't be in state InviteSent
final shouldTerminate =
(state == CallState.kFledgling && direction == CallDirection.kIncoming) ||
final shouldTerminate = (state == CallState.kFledgling &&
direction == CallDirection.kIncoming) ||
CallState.kInviteSent == state ||
CallState.kRinging == state;
@ -1107,9 +1128,10 @@ class VoIP {
String? get localPartyId => client.deviceID;
bool background = false;
final Client client;
final RTCFactory factory;
RTCFactory get factory => delegate.rtcFactory;
final WebRTCDelegate delegate;
VoIP(this.client, this.factory) : super() {
VoIP(this.client, this.delegate) : super() {
client.onCallInvite.stream.listen(onCallInvite);
client.onCallAnswer.stream.listen(onCallAnswer);
client.onCallCandidates.stream.listen(onCallCandidates);