예제 #1
0
        /// <summary>
        /// 拨号或者接听
        /// </summary>
        /// <param name="number"></param>
        public void PickUp(string number)
        {
            // accept incoming call
            if (call != null && call.IsIncoming)
            {
                RaiseMessage?.Invoke("Talking");
                call.Answer();
                return;
            }

            // dial
            if (call != null)
            {
                return;
            }

            if (string.IsNullOrEmpty(number))
            {
                return;
            }

            if (phoneLine.RegState != RegState.RegistrationSucceeded)
            {
                RaiseMessage?.Invoke("Phone line must be registered!");
                return;
            }

            call = softPhone.CreateCallObject(phoneLine, number);
            SubscribeToCallEvents(call);
            call.Start();
            RaiseMessage?.Invoke($"Calling {number}");
        }
예제 #2
0
        private void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            switch (e.State)
            {
            case CallState.Ringing:
                StateChanged?.Invoke(PhoneState.Ringing);
                break;

            case CallState.InCall:
                StateChanged?.Invoke(PhoneState.InCall);
                break;

            default:
                StateChanged?.Invoke(PhoneState.Other);
                break;
            }
            RaiseMessage?.Invoke(e.State.ToString());

            if (e.State == CallState.Answered)
            {
                if (microphone != null)
                {
                    microphone.Start();
                }

                if (speaker != null)
                {
                    speaker.Start();
                }

                mediaSender.AttachToCall(call);
                mediaReceiver.AttachToCall(call);
                return;
            }

            if (e.State.IsCallEnded())
            {
                if (microphone != null)
                {
                    microphone.Stop();
                }

                if (speaker != null)
                {
                    speaker.Stop();
                }

                mediaSender.Detach();
                mediaReceiver.Detach();

                UnsubscribeFromCallEvents(sender as IPhoneCall);
                call = null;
                StateChanged?.Invoke(PhoneState.CallEnded);
            }
        }
예제 #3
0
        private void softPhone_IncomingCall(object sender, VoIPEventArgs <IPhoneCall> e)
        {
            var incomingCall = e.Item as IPhoneCall;

            if (call != null)
            {
                incomingCall.Reject();
                return;
            }

            call = incomingCall;
            SubscribeToCallEvents(call);

            StateChanged?.Invoke(PhoneState.InCall);
            RaiseMessage?.Invoke(String.Format("Incoming call from {0}", e.Item.DialInfo.CallerDisplay));
        }
예제 #4
0
        void ProcessEvent(string eventInfo)
        {
            if (string.IsNullOrWhiteSpace(eventInfo))
            {
                return;
            }
            var info = eventInfo.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);

            switch (info[0])
            {
            case "RaiseMessage":
                RaiseMessage?.Invoke(info[1]);
                break;

            case "StateMessageChanged":
                StateMessageChanged?.Invoke(info[1]);
                break;

            case "StateChanged":
                StateChanged?.Invoke((PhoneState)Enum.Parse(typeof(PhoneState), info[1]));
                break;
            }
        }
예제 #5
0
        private void call_DtmfReceived(object sender, VoIPEventArgs <DtmfInfo> e)
        {
            DtmfSignal signal = e.Item.Signal;

            RaiseMessage?.Invoke(String.Format("DTMF signal received: {0} ", signal.Signal));
        }