chore: Add WebRTC delegate interface.
This commit is contained in:
parent
72584d679c
commit
60618d1775
|
|
@ -6,6 +6,11 @@ import 'package:sdp_transform/sdp_transform.dart' as sdp_transform;
|
||||||
|
|
||||||
import '../matrix.dart';
|
import '../matrix.dart';
|
||||||
|
|
||||||
|
abstract class WebRTCDelegate {
|
||||||
|
RTCFactory get rtcFactory;
|
||||||
|
VideoRenderer createRenderer();
|
||||||
|
}
|
||||||
|
|
||||||
/// The default life time for call events, in millisecond.
|
/// The default life time for call events, in millisecond.
|
||||||
const lifetimeMs = 10 * 1000;
|
const lifetimeMs = 10 * 1000;
|
||||||
|
|
||||||
|
|
@ -23,6 +28,7 @@ class WrappedMediaStream {
|
||||||
bool audioMuted;
|
bool audioMuted;
|
||||||
bool videoMuted;
|
bool videoMuted;
|
||||||
final Client client;
|
final Client client;
|
||||||
|
VideoRenderer renderer;
|
||||||
|
|
||||||
/// for debug
|
/// for debug
|
||||||
String get title => '$displayName:$purpose:a[$audioMuted]:v[$videoMuted]';
|
String get title => '$displayName:$purpose:a[$audioMuted]:v[$videoMuted]';
|
||||||
|
|
@ -32,6 +38,7 @@ class WrappedMediaStream {
|
||||||
|
|
||||||
WrappedMediaStream(
|
WrappedMediaStream(
|
||||||
{this.stream,
|
{this.stream,
|
||||||
|
required this.renderer,
|
||||||
required this.room,
|
required this.room,
|
||||||
required this.userId,
|
required this.userId,
|
||||||
required this.purpose,
|
required this.purpose,
|
||||||
|
|
@ -39,7 +46,18 @@ class WrappedMediaStream {
|
||||||
required this.audioMuted,
|
required this.audioMuted,
|
||||||
required this.videoMuted});
|
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 {
|
Future<void> dispose() async {
|
||||||
|
renderer.srcObject = null;
|
||||||
if (isLocal() && stream != null) {
|
if (isLocal() && stream != null) {
|
||||||
await stream?.dispose();
|
await stream?.dispose();
|
||||||
stream = null;
|
stream = null;
|
||||||
|
|
@ -69,6 +87,7 @@ class WrappedMediaStream {
|
||||||
|
|
||||||
void setNewStream(MediaStream newStream) {
|
void setNewStream(MediaStream newStream) {
|
||||||
stream = newStream;
|
stream = newStream;
|
||||||
|
renderer.srcObject = stream;
|
||||||
if (onNewStream != null) {
|
if (onNewStream != null) {
|
||||||
onNewStream?.call(stream!);
|
onNewStream?.call(stream!);
|
||||||
}
|
}
|
||||||
|
|
@ -504,6 +523,7 @@ class CallSession {
|
||||||
existingStream.setNewStream(stream);
|
existingStream.setNewStream(stream);
|
||||||
} else {
|
} else {
|
||||||
final newStream = WrappedMediaStream(
|
final newStream = WrappedMediaStream(
|
||||||
|
renderer: voip.delegate.createRenderer(),
|
||||||
userId: client.userID!,
|
userId: client.userID!,
|
||||||
room: opts.room,
|
room: opts.room,
|
||||||
stream: stream,
|
stream: stream,
|
||||||
|
|
@ -563,6 +583,7 @@ class CallSession {
|
||||||
existingStream.setNewStream(stream);
|
existingStream.setNewStream(stream);
|
||||||
} else {
|
} else {
|
||||||
final newStream = WrappedMediaStream(
|
final newStream = WrappedMediaStream(
|
||||||
|
renderer: voip.delegate.createRenderer(),
|
||||||
userId: remoteUser.id,
|
userId: remoteUser.id,
|
||||||
room: opts.room,
|
room: opts.room,
|
||||||
stream: stream,
|
stream: stream,
|
||||||
|
|
@ -752,10 +773,10 @@ class CallSession {
|
||||||
Logs().v('[VOIP] Reject received for call ID ' + callId);
|
Logs().v('[VOIP] Reject received for call ID ' + callId);
|
||||||
// No need to check party_id for reject because if we'd received either
|
// 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
|
// an answer or reject, we wouldn't be in state InviteSent
|
||||||
final shouldTerminate =
|
final shouldTerminate = (state == CallState.kFledgling &&
|
||||||
(state == CallState.kFledgling && direction == CallDirection.kIncoming) ||
|
direction == CallDirection.kIncoming) ||
|
||||||
CallState.kInviteSent == state ||
|
CallState.kInviteSent == state ||
|
||||||
CallState.kRinging == state;
|
CallState.kRinging == state;
|
||||||
|
|
||||||
if (shouldTerminate) {
|
if (shouldTerminate) {
|
||||||
terminate(CallParty.kRemote, reason ?? CallErrorCode.UserHangup, true);
|
terminate(CallParty.kRemote, reason ?? CallErrorCode.UserHangup, true);
|
||||||
|
|
@ -1107,9 +1128,10 @@ class VoIP {
|
||||||
String? get localPartyId => client.deviceID;
|
String? get localPartyId => client.deviceID;
|
||||||
bool background = false;
|
bool background = false;
|
||||||
final Client client;
|
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.onCallInvite.stream.listen(onCallInvite);
|
||||||
client.onCallAnswer.stream.listen(onCallAnswer);
|
client.onCallAnswer.stream.listen(onCallAnswer);
|
||||||
client.onCallCandidates.stream.listen(onCallCandidates);
|
client.onCallCandidates.stream.listen(onCallCandidates);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue