-
-
Save alr2413/2af816af960e1ce85444428d9b183622 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# $Id$ | |
# | |
# SIP call sample. | |
# | |
# Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org> | |
# | |
# This program is free software; you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation; either version 2 of the License, or | |
# (at your option) any later version. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License | |
# along with this program; if not, write to the Free Software | |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
# | |
import sys | |
import pjsua as pj | |
LOG_LEVEL=3 | |
current_call = None | |
# Logging callback | |
def log_cb(level, str, len): | |
print str, | |
# Callback to receive events from account | |
class MyAccountCallback(pj.AccountCallback): | |
def __init__(self, account=None): | |
pj.AccountCallback.__init__(self, account) | |
# Notification on incoming call | |
def on_incoming_call(self, call): | |
global current_call | |
if current_call: | |
call.answer(486, "Busy") | |
return | |
print "Incoming call from ", call.info().remote_uri | |
print "Press 'a' to answer" | |
current_call = call | |
call_cb = MyCallCallback(current_call) | |
current_call.set_callback(call_cb) | |
current_call.answer(180) | |
### Callback to receive events from Call | |
class MyCallCallback(pj.CallCallback): | |
def __init__(self, call=None): | |
pj.CallCallback.__init__(self, call) | |
# Notification when call state has changed | |
def on_state(self): | |
global current_call | |
print "Call with", self.call.info().remote_uri, | |
print "is", self.call.info().state_text, | |
print "last code =", self.call.info().last_code, | |
print "(" + self.call.info().last_reason + ")" | |
if self.call.info().state == pj.CallState.DISCONNECTED: | |
current_call = None | |
print 'Current call is', current_call | |
# Notification when call's media state has changed. | |
def on_media_state(self): | |
if self.call.info().media_state == pj.MediaState.ACTIVE: | |
# Connect the call to sound device | |
call_slot = self.call.info().conf_slot | |
pj.Lib.instance().conf_connect(call_slot, 0) | |
pj.Lib.instance().conf_connect(0, call_slot) | |
print "Media is now active" | |
else: | |
print "Media is inactive" | |
# Function to make call | |
def make_call(uri): | |
try: | |
print "Making call to", uri | |
return acc.make_call(uri, cb=MyCallCallback()) | |
except pj.Error, e: | |
print "Exception: " + str(e) | |
return None | |
# Create library instance | |
lib = pj.Lib() | |
try: | |
# Init library with default config and some customized | |
# logging config. | |
lib.init(log_cfg = pj.LogConfig(level=LOG_LEVEL, callback=log_cb)) | |
# Create UDP transport which listens to any available port | |
transport = lib.create_transport(pj.TransportType.UDP, | |
pj.TransportConfig(0)) | |
print "\nListening on", transport.info().host, | |
print "port", transport.info().port, "\n" | |
# Start the library | |
lib.start() | |
acc_cfg = pjsua.AccountConfig() | |
acc_cfg.id = "sip:104" | |
acc_cfg.reg_uri = "sip:192.168.1.14" | |
acc_cfg.auth_cred = [ pjsua.AuthCred("*", "104", "pass104")] | |
acc_cb = MyAccountCallback() | |
acc = lib.create_account(acc_cfg, cb = acc_cb) | |
acc.set_transport(transport) | |
# Create local account | |
# acc = lib.create_account_for_transport(transport, cb=MyAccountCallback()) | |
# If argument is specified then make call to the URI | |
if len(sys.argv) > 1: | |
lck = lib.auto_lock() | |
current_call = make_call(sys.argv[1]) | |
print 'Current call is', current_call | |
del lck | |
my_sip_uri = "sip:" + transport.info().host + \ | |
":" + str(transport.info().port) | |
# Menu loop | |
while True: | |
print "My SIP URI is", my_sip_uri | |
print "Menu: m=make call, h=hangup call, a=answer call, q=quit" | |
input = sys.stdin.readline().rstrip("\r\n") | |
if input == "m": | |
if current_call: | |
print "Already have another call" | |
continue | |
print "Enter destination URI to call: ", | |
input = sys.stdin.readline().rstrip("\r\n") | |
if input == "": | |
continue | |
lck = lib.auto_lock() | |
current_call = make_call(input) | |
del lck | |
elif input == "h": | |
if not current_call: | |
print "There is no call" | |
continue | |
current_call.hangup() | |
elif input == "a": | |
if not current_call: | |
print "There is no call" | |
continue | |
current_call.answer(200) | |
elif input == "q": | |
break | |
# Shutdown the library | |
transport = None | |
acc.delete() | |
acc = None | |
lib.destroy() | |
lib = None | |
except pj.Error, e: | |
print "Exception: " + str(e) | |
lib.destroy() | |
lib = None |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment