fix: allow passing a WrappedMediaStream to GroupCall.enter() to use as the local user media stream
currently in the app we start the group call (but do not enter it), then we use the localStreams provided by it to show the setup page (enable/disable media devices). This causes some issues because the user hasn't joined the group call so the member state events don't update and the group call is killed if they just sit on the setup call page. Also creating a group call, sends notifications in our apps but no one has entered it. With this MR, apps can get their own user media, then edit that stream on setup page add it to GroupCall.enter(stream). This way, a group call doesn't have to be started and we get to do the setup page as well.
This commit is contained in:
parent
2ecb09e555
commit
046e2caf7d
|
|
@ -348,13 +348,21 @@ class GroupCall {
|
|||
|
||||
/// Initializes the local user media stream.
|
||||
/// The media stream must be prepared before the group call enters.
|
||||
Future<WrappedMediaStream> initLocalStream() async {
|
||||
/// if you allow the user to configure their camera and such ahead of time,
|
||||
/// you can pass that `stream` on to this function.
|
||||
/// This allows you to configure the camera before joining the call without
|
||||
/// having to reopen the stream and possibly losing settings.
|
||||
Future<WrappedMediaStream> initLocalStream(
|
||||
{WrappedMediaStream? stream}) async {
|
||||
if (state != GroupCallState.LocalCallFeedUninitialized) {
|
||||
throw Exception('Cannot initialize local call feed in the $state state.');
|
||||
}
|
||||
|
||||
setState(GroupCallState.InitializingLocalCallFeed);
|
||||
|
||||
WrappedMediaStream localWrappedMediaStream;
|
||||
|
||||
if (stream == null) {
|
||||
MediaStream stream;
|
||||
|
||||
try {
|
||||
|
|
@ -366,7 +374,7 @@ class GroupCall {
|
|||
}
|
||||
|
||||
final userId = client.userID;
|
||||
final newStream = WrappedMediaStream(
|
||||
localWrappedMediaStream = WrappedMediaStream(
|
||||
renderer: voip.delegate.createRenderer(),
|
||||
stream: stream,
|
||||
userId: userId!,
|
||||
|
|
@ -378,14 +386,17 @@ class GroupCall {
|
|||
isWeb: voip.delegate.isWeb,
|
||||
isGroupCall: true,
|
||||
);
|
||||
} else {
|
||||
localWrappedMediaStream = stream;
|
||||
}
|
||||
|
||||
localUserMediaStream = newStream;
|
||||
localUserMediaStream = localWrappedMediaStream;
|
||||
await localUserMediaStream!.initialize();
|
||||
await addUserMediaStream(newStream);
|
||||
await addUserMediaStream(localWrappedMediaStream);
|
||||
|
||||
setState(GroupCallState.LocalCallFeedInitialized);
|
||||
|
||||
return newStream;
|
||||
return localWrappedMediaStream;
|
||||
}
|
||||
|
||||
Future<void> updateAudioDevice() async {
|
||||
|
|
@ -406,16 +417,15 @@ class GroupCall {
|
|||
}
|
||||
|
||||
/// enter the group call.
|
||||
Future<void> enter() async {
|
||||
Future<void> enter({WrappedMediaStream? stream}) async {
|
||||
if (!(state == GroupCallState.LocalCallFeedUninitialized ||
|
||||
state == GroupCallState.LocalCallFeedInitialized)) {
|
||||
throw Exception('Cannot enter call in the $state state');
|
||||
}
|
||||
|
||||
if (state == GroupCallState.LocalCallFeedUninitialized) {
|
||||
await initLocalStream();
|
||||
await initLocalStream(stream: stream);
|
||||
}
|
||||
|
||||
await _addParticipant(
|
||||
(await room.requestUser(client.userID!, ignoreErrors: true))!);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue