示例#1
0
 /// <summary>
 /// Enable or disable sound capture using the device microphone
 /// </summary>
 public void MuteMic(Boolean isMicMuted)
 {
     if (BaseModel.UIDispatcher == null)
     {
         return;
     }
     BaseModel.UIDispatcher.BeginInvoke(() =>
     {
         if (LinphoneCore.CallsNb > 0)
         {
             LinphoneCore.MicMuted = isMicMuted;
             if (CallListener != null)
             {
                 CallListener.MuteStateChanged(isMicMuted);
             }
         }
     });
 }
示例#2
0
        /// <summary>
        /// Callback for LinphoneCoreListener
        /// </summary>
        public void CallState(LinphoneCall call, LinphoneCallState state, string message)
        {
            if (BaseModel.UIDispatcher == null)
            {
                return;
            }
            if (state == LinphoneCallState.OutgoingProgress)
            {
                BaseModel.UIDispatcher.BeginInvoke(() =>
                {
                    Logger.Msg("[LinphoneManager] Outgoing progress\r\n");
                    LookupForContact(call);

                    if (CallListener != null && LinphoneCore.CallsNb > 0)
                    {
                        string sipAddress = call.RemoteAddress.AsStringUriOnly();
                        CallListener.NewCallStarted(sipAddress);
                    }
                });
            }
            else if (state == LinphoneCallState.IncomingReceived)
            {
                BaseModel.UIDispatcher.BeginInvoke(() =>
                {
                    Logger.Msg("[LinphoneManager] Incoming received\r\n");
                    if (false) //TODO: Find a proper way to let the user choose between the two.
                    {
                        BaseModel.CurrentPage.NavigationService.Navigate(new Uri("/Views/IncomingCall.xaml?sip=" + Utils.ReplacePlusInUri(call.RemoteAddress.AsStringUriOnly()), UriKind.RelativeOrAbsolute));
                        //Remove the current page from the back stack to avoid duplicating him after
                        BaseModel.CurrentPage.NavigationService.RemoveBackEntry();
                    }

                    LookupForContact(call);
                });
            }
            else if (state == LinphoneCallState.Connected)
            {
                BaseModel.UIDispatcher.BeginInvoke(() =>
                {
                    Logger.Msg("[LinphoneManager] Connected\r\n");
                    if (CallListener != null)
                    {
                        string sipAddress = call.RemoteAddress.AsStringUriOnly();
                        CallListener.NewCallStarted(sipAddress);
                    }
                });
            }
            else if (state == LinphoneCallState.CallEnd || state == LinphoneCallState.Error)
            {
                BaseModel.UIDispatcher.BeginInvoke(() =>
                {
                    Logger.Msg(String.Format("[LinphoneManager] Call ended: {0}\r\n", message));
                    if (CallListener != null)
                    {
                        CallListener.CallEnded(call);
                    }
                    string text;
                    switch (call.Reason)
                    {
                    case Reason.LinphoneReasonNone:
                    case Reason.LinphoneReasonNotAnswered:
                        break;

                    case Reason.LinphoneReasonDeclined:
                        if (call.Direction == CallDirection.Outgoing)
                        {
                            text = ResourceManager.GetString("CallErrorDeclined", CultureInfo.CurrentCulture);
                            ShowCallError(text.Replace("#address#", call.RemoteAddress.UserName));
                        }
                        break;

                    case Reason.LinphoneReasonNotFound:
                        text = ResourceManager.GetString("CallErrorNotFound", CultureInfo.CurrentCulture);
                        ShowCallError(text.Replace("#address#", call.RemoteAddress.UserName));
                        break;

                    case Reason.LinphoneReasonBusy:
                        text = ResourceManager.GetString("CallErrorBusy", CultureInfo.CurrentCulture);
                        ShowCallError(text.Replace("#address#", call.RemoteAddress.UserName));
                        break;

                    case Reason.LinphoneReasonNotAcceptable:
                        ShowCallError(ResourceManager.GetString("CallErrorNotAcceptable", CultureInfo.CurrentCulture));
                        break;

                    case Reason.LinphoneReasonIOError:
                        ShowCallError(ResourceManager.GetString("CallErrorIOError", CultureInfo.CurrentCulture));
                        break;

                    default:
                        ShowCallError(ResourceManager.GetString("CallErrorUnknown", CultureInfo.CurrentCulture));
                        break;
                    }
                });
            }
            else if (state == LinphoneCallState.Paused || state == LinphoneCallState.PausedByRemote)
            {
                BaseModel.UIDispatcher.BeginInvoke(() =>
                {
                    Logger.Msg("[LinphoneManager] Call paused\r\n");
                    bool pausedByRemote = state == LinphoneCallState.PausedByRemote;
                    if (CallListener != null)
                    {
                        CallListener.PauseStateChanged(call, !pausedByRemote, pausedByRemote);
                    }
                });
            }
            else if (state == LinphoneCallState.StreamsRunning)
            {
                BaseModel.UIDispatcher.BeginInvoke(() =>
                {
                    Logger.Msg("[LinphoneManager] Call running\r\n");
                    if (CallListener != null)
                    {
                        CallListener.PauseStateChanged(call, false, false);
                    }
                });
            }
            else if (state == LinphoneCallState.Released)
            {
                BaseModel.UIDispatcher.BeginInvoke(() =>
                {
                    Logger.Msg("[LinphoneManager] Call released\r\n");
                });
            }
            else if (state == LinphoneCallState.UpdatedByRemote)
            {
                BaseModel.UIDispatcher.BeginInvoke(() =>
                {
                    Boolean videoAdded = false;
                    VideoPolicy policy = LinphoneManager.Instance.LinphoneCore.VideoPolicy;
                    LinphoneCallParams remoteParams = call.RemoteParams;
                    LinphoneCallParams localParams  = call.GetCurrentParamsCopy();
                    if (remoteParams.VideoEnabled && !localParams.VideoEnabled && !LinphoneManager.Instance.LinphoneCore.InConference)
                    {
                        if (policy.AutomaticallyAccept)
                        {
                            localParams.VideoEnabled = true;
                            LinphoneManager.Instance.LinphoneCore.AcceptCallUpdate(call, localParams);
                        }
                        else
                        {
                            videoAdded = true;
                        }
                    }
                    else
                    {
                        LinphoneManager.Instance.LinphoneCore.AcceptCallUpdate(call, localParams);
                    }

                    if (CallListener != null)
                    {
                        CallListener.CallUpdatedByRemote(call, videoAdded);
                    }
                });
            }

            BaseModel.UIDispatcher.BeginInvoke(() =>
            {
                if (CallStateChanged != null)
                {
                    CallStateChanged(call, state);
                }
            });
        }
示例#3
0
 public void SetCall(CallListener u)
 {
     Call = u;
 }
示例#4
0
 public void SetCall(CallListener u)
 {
     Call = u;
 }