Re: Python PJSUA2 : play wave file and record audio example

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi
Even a simple 3 line code is giving same error. Can anyone help on this?

import pjsua2 as pj
recorder=pj.AudioMediaRecorder()
recorder.createRecorder('file.wav');

    return _pjsua2.AudioMediaRecorder_createRecorder(self, file_name, enc_type, max_size, options)
NotImplementedError: Wrong number or type of arguments for overloaded function 'AudioMediaRecorder_createRecorder'.
  Possible C/C++ prototypes are:
    pj::AudioMediaRecorder::createRecorder(pj::string const &,unsigned int,pj_ssize_t,unsigned int)
    pj::AudioMediaRecorder::createRecorder(pj::string const &,unsigned int,pj_ssize_t)
    pj::AudioMediaRecorder::createRecorder(pj::string const &,unsigned int)
    pj::AudioMediaRecorder::createRecorder(pj::string const &)


I tried trunk,2.8 and 2.7 and same error.

Sekar

From: Sekar S <sekarpdkt@xxxxxxxxxxx>
Sent: Saturday, January 5, 2019 10:05 PM
To: pjsip@xxxxxxxxxxxxxxx
Subject: Re: Python PJSUA2 : play wave file and record audio example
 
Hi all

Able to resolve 1st issue, by shifting call.answer to main thread. Struck with second issue, i.e how to create recorder to record to a wave file. Any help is welcome.

            recorder=pj.AudioMediaRecorder()
            recorder.createRecorder('xxxxxxxxxxx/PJSUA2/example/pygui/file.wav');

gives following error
-----------------------------------------------
Traceback (most recent call last):
  File "pjsua2_cli_demo.py", line 33, in onCallState
    self.recorder.createRecorder('xxxxxxxxxxxxxx/PJSUA2/example/pygui/file.wav');
  File "xxxxxxxxxxxxxxxx/.local/lib/python3.6/site-packages/pjsua2.py", line 4110, in createRecorder
    return _pjsua2.AudioMediaRecorder_createRecorder(self, file_name, enc_type, max_size, options)
NotImplementedError: Wrong number or type of arguments for overloaded function 'AudioMediaRecorder_createRecorder'.
  Possible C/C++ prototypes are:
    pj::AudioMediaRecorder::createRecorder(pj::string const &,unsigned int,pj_ssize_t,unsigned int)
    pj::AudioMediaRecorder::createRecorder(pj::string const &,unsigned int,pj_ssize_t)
    pj::AudioMediaRecorder::createRecorder(pj::string const &,unsigned int)
    pj::AudioMediaRecorder::createRecorder(pj::string const &)
------------------------------------------------



Thanks.
Sekar.


From: Sekar S <sekarpdkt@xxxxxxxxxxx>
Sent: Thursday, January 3, 2019 10:04 PM
To: pjsip@xxxxxxxxxxxxxxx
Subject: Re: Python PJSUA2 : play wave file and record audio example
 
Hi

After going thru pygui code, I modified the example as below. I have two issues

1. In each call back function, at the end I need to add a dummy raise exception, else it misbehaves. For example, if I comment dummy exception of onIncomingCall, incoming call will get disconnected with 500 error. In pyGUI, it looks like ttk.master.after() plays critical role. As I am trying it in a headless server (mean only cli), not sure how to handle it?
2. When I try to use createRecorder getting following error
-----------------------------------------------
Traceback (most recent call last):
  File "pjsua2_cli_demo.py", line 33, in onCallState
    self.recorder.createRecorder('xxxxxxxxxxxxxx/PJSUA2/example/pygui/file.wav');
  File "xxxxxxxxxxxxxxxx/.local/lib/python3.6/site-packages/pjsua2.py", line 4110, in createRecorder
    return _pjsua2.AudioMediaRecorder_createRecorder(self, file_name, enc_type, max_size, options)
NotImplementedError: Wrong number or type of arguments for overloaded function 'AudioMediaRecorder_createRecorder'.
  Possible C/C++ prototypes are:
    pj::AudioMediaRecorder::createRecorder(pj::string const &,unsigned int,pj_ssize_t,unsigned int)
    pj::AudioMediaRecorder::createRecorder(pj::string const &,unsigned int,pj_ssize_t)
    pj::AudioMediaRecorder::createRecorder(pj::string const &,unsigned int)
    pj::AudioMediaRecorder::createRecorder(pj::string const &)
------------------------------------------------

Note: I am having issues in replying to same thread. So opened a Stakeworkflow query for same. If this time also, it created to new thread, I will continue to use stakeworkflow




-----------------------------Modified code --------------

import pjsua2 as pj
import time
# Subclass to extend the Account and get notifications etc.

ep=None
# Call class
class Call(pj.Call):
    """
    High level Python Call object, derived from pjsua2's Call object.
    """
    def __init__(self, acc, peer_uri='', chat=None, call_id = pj.PJSUA_INVALID_ID):
        pj.Call.__init__(self, acc, call_id)
        self.acc = acc

        self.aud_med=pj.AudioMedia

    def onCallState(self, prm):
        ci = self.getInfo()
        self.connected = ci.state == pj.PJSIP_INV_STATE_CONFIRMED
        self.recorder=None
        if(self.connected ==True):
            player=pj.AudioMediaPlayer()
            #Play welcome message
            player.createPlayer('xxxxxxxxxxxxxx/PJSUA2/example/pygui/welcomeFull.wav');

            self.recorder=pj.AudioMediaRecorder()
            #self.recorder.createRecorder('xxxxxxxxxxx/PJSUA2/example/pygui/file.wav', enc_type=0, max_size=0, options=0);
            i=0
            for media in ci.media:

                if (media.type == pj.PJMEDIA_TYPE_AUDIO):
                    self.aud_med = self.getMedia(i);
                    break;
                i=i+1;
            if self.aud_med!=None:
                # This will connect the sound device/mic to the call audio media
                mym= pj.AudioMedia.typecastFromMedia(self.aud_med)
                player.startTransmit( mym);
                #mym.startTransmit( self.recorder);        
        if(ci.state==pj.PJSIP_INV_STATE_DISCONNECTED):
            print(">>>>>>>>>>>>>>>>>>>>>>> Call disconnected")
            #mym= pj.AudioMedia.typecastFromMedia(self.aud_med)
            #mym.stopTransmit(self.recorder);
        raise Exception('onCallState done!')        


        if self.chat:
            self.chat.updateCallState(self, ci)

    def onCallMediaState(self, prm):
        ci = self.getInfo()
        for mi in ci.media:
            if mi.type == pj.PJMEDIA_TYPE_AUDIO and \
              (mi.status == pj.PJSUA_CALL_MEDIA_ACTIVE or \
               mi.status == pj.PJSUA_CALL_MEDIA_REMOTE_HOLD):
                if mi.status == pj.PJSUA_CALL_MEDIA_REMOTE_HOLD and not self.onhold:
                    self.chat.addMessage(None, "'%s' sets call onhold" % (self.peerUri))
                    self._onhold_ = True
                elif mi.status == pj.PJSUA_CALL_MEDIA_ACTIVE and self.onhold:
                    self.chat.addMessage(None, "'%s' sets call active" % (self.peerUri))
                    self._onhold_ = False
        raise Exception('onCallMediaState done!')        

class Account(pj.Account):
    def onRegState(self, prm):
        print ("***OnRegState: " + prm.reason)
    def onIncomingCall(self, prm):
        c = Call(self, call_id=prm.callId)
        call_prm = pj.CallOpParam()
        call_prm.statusCode = 180
        c.answer(call_prm)

        ci = c.getInfo()
        msg = "Incoming call  from  '%s'" % (ci.remoteUri)
        print(msg)
        call_prm.statusCode = 200
        c.answer(call_prm)
        raise Exception('onIncomingCall done!')        



# pjsua2 test function
def pjsua2_test():
    # Create and initialize the library
    ep_cfg = pj.EpConfig()
    ep_cfg.uaConfig.threadCnt = 0
    ep_cfg.uaConfig.mainThreadOnly = False
    ep = pj.Endpoint()
    ep.libCreate()
    ep.libInit(ep_cfg)

    # Create SIP transport. Error handling sample is shown
    sipTpConfig = pj.TransportConfig();
    sipTpConfig.port = 12345;
    tp=ep.transportCreate(pj.PJSIP_TRANSPORT_UDP, sipTpConfig);
    # Start the library
    ep.libStart();

    acfg = pj.AccountConfig();

    acfg.idUri = "sip:192.168.1.11:12345";

    # Create the account
    acc = Account();
    acc.create(acfg)


    while True:    
        ep.libHandleEvents(10)


    ep.libDestroy()
    del ep;

#
# main()
#
if __name__ == "__main__":
    pjsua2_test()
_______________________________________________
Visit our blog: http://blog.pjsip.org

pjsip mailing list
pjsip@xxxxxxxxxxxxxxx
http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org

[Index of Archives]     [Asterisk Users]     [Asterisk App Development]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [Linux API]
  Powered by Linux