public void CallPhone(string phoneNumber)
 {
     var acsNumber = new PhoneNumberIdentifier(phoneNumber, phoneNumber);
     var receivers = new CommunicationIdentifier[] { acsNumber };
     var callOptions = new ACSStartCallOptions
     {
         AudioOptions = new ACSAudioOptions()
     };
     _call = _callAgent.StartCall(receivers, callOptions);
 }
 public override void OnRemoteParticipantsUpdated(ACSCall call, ACSParticipantsUpdatedEventArgs args)
 {
     Logger.Debug($"Remote participants changed");
     foreach (var participant in args.AddedParticipants)
     {
         _videoCallbackManager.HandleRemoteParticipantAdded(participant);
         participant.Delegate = new RemoteParticipantDelegate(_videoCallbackManager);
         _remoteParticipants.Add(participant);
     }
 }
Esempio n. 3
0
        private void callCompleted(ACSCall call, NSError err)
        {
            Logger.Debug("Call setup");
            _call = call;
            // Respond to changes
            _call.Delegate = new CallDelegate(_videoCallbackManager);
            // Setup initial streams. This is clumsy and probably an API flaw...
            // IMHO delegate should be called after setting it on existing state...
            foreach (var remoteParticipant in _call.RemoteParticipants)
            {
                Logger.Debug("Remote participant already in call");
                remoteParticipant.Delegate = new RemoteParticipantDelegate(_videoCallbackManager);
                foreach (var remoteVideoStream in remoteParticipant.VideoStreams)
                {
                    RemoteVideoStreamAdded(remoteVideoStream);
                }
            }

            Logger.Debug("Starting video");
            _call.StartVideo(_localVideoStream, OnVideoStarted);
        }
        public async Task JoinGroup(Guid groupID)
        {
            var camera = _deviceManager
                .Cameras.First(c => c.CameraFacing == ACSCameraFacing.Front);
            _localVideoStream = new ACSLocalVideoStream(camera);
            _localVideoStreamRenderer = new ACSVideoStreamRenderer(_localVideoStream, out var rendererError);
            ThrowIfError(rendererError);
            var renderingOptions = new ACSRenderingOptions(ACSScalingMode.Crop);
            var nativeView = _localVideoStreamRenderer.CreateViewWithOptions(renderingOptions, out var viewError);
            ThrowIfError(viewError);
            var formsView = nativeView.ToView();

            LocalVideoAdded?.Invoke(this, formsView);

            var groupCallLocator = new ACSGroupCallLocator(new NSUuid(groupID.ToString()));
            var callOptions = new ACSJoinCallOptions
            {
                AudioOptions = new ACSAudioOptions(),
                VideoOptions = new ACSVideoOptions(_localVideoStream)
            };
            //callOptions.AudioOptions.Muted = true;
            _call = _callAgent.JoinWithMeetingLocator(groupCallLocator, callOptions);
            // Respond to changes
            _call.Delegate = new CallDelegate(_videoCallbackManager);
            // Setup initial streams. This is clumsy and probably an API flaw...
            // IMHO delegate should be called after setting it on existing state...
            foreach (var remoteParticipant in _call.RemoteParticipants)
            {
                remoteParticipant.Delegate = new RemoteParticipantDelegate(_videoCallbackManager);
                foreach (var remoteVideoStream in remoteParticipant.VideoStreams)
                {
                    RemoteVideoStreamAdded(remoteVideoStream);
                }
            }

            _call.StartVideo(_localVideoStream, OnVideoStarted);
        }
 public override void OnLocalVideoStreamsUpdated(ACSCall call, ACSLocalVideoStreamsUpdatedEventArgs args)
 {
     Logger.Debug($"Local video streams changed");
 }
 public override void OnStateChanged(ACSCall call, ACSPropertyChangedEventArgs args)
 {
     Logger.Debug($"Call state changed: {call.State}");
 }