pyVoIP icon indicating copy to clipboard operation
pyVoIP copied to clipboard

audio doesn't work on call, and dtfm isn't capturing values and not working either.

Open coolcunt opened this issue 1 year ago • 6 comments

here's my code,
(password's and the server ip and phone number has been changed obviously cuz of reasons but try it out, i'm currently using python 3.10.0 and the latest version of pyvoip. lmk how it goes (Call works, like it can call the person, but it wont play audio or listen to dtfm inputs, and just auto hangup in 7-9 seconds)

from pyVoIP.VoIP import VoIPPhone, InvalidStateError, CallState import time import wave import socket import logging

SIP_SERVER = "123.45.67.89" SIP_USERNAME = "username" SIP_PASSWORD = "password" PHONE_NUMBER = "+123456789"

Setup logging

logging.basicConfig(level=logging.INFO) logger = logging.getLogger(name)

def get_local_ip(): """Get the local IP address of the machine""" s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even have to be reachable s.connect(('10.254.254.254', 1)) local_ip = s.getsockname()[0] except Exception: local_ip = '127.0.0.1' finally: s.close() return local_ip

def answer(call): try: f = wave.open('raw_audio.wav', 'rb') frames = f.getnframes() data = f.readframes(frames) f.close()

    call.answer()
    call.write_audio(data)

    while call.state == CallState.ANSWERED:
        dtmf = call.get_dtmf()
        if dtmf == "1":
            print("pressed one")
            # Do something
            call.hangup()
        elif dtmf == "2":
            print("pressed 2")
            call.hangup()
        time.sleep(0.1)
except InvalidStateError:
    pass
except:
    call.hangup()

if name == 'main': local_ip = get_local_ip() phone = VoIPPhone( server=SIP_SERVER, port=5060, username=SIP_USERNAME, password=SIP_PASSWORD, myIP=local_ip, callCallback=answer ) phone.start() logger.info(f"Using local IP: {local_ip}") logger.info(f"Calling phone number: {PHONE_NUMBER}") phone.call(PHONE_NUMBER) input('Press enter to disable the phone') phone.stop()

coolcunt avatar Oct 28 '24 21:10 coolcunt

I've got to say that your email user name is rather offensive.

On Mon, Oct 28, 2024 at 2:05 PM coolcunt @.***> wrote:

here's my code, (password's and the server ip and phone number has been changed obviously cuz of reasons but try it out, i'm currently using python 3.10.0 and the latest version of pyvoip. lmk how it goes (Call works, like it can call the person, but it wont play audio or listen to dtfm inputs, and just auto hangup in 7-9 seconds)

from pyVoIP.VoIP import VoIPPhone, InvalidStateError, CallState import time import wave import socket import logging

SIP_SERVER = "123.45.67.89" SIP_USERNAME = "username" SIP_PASSWORD = "password" PHONE_NUMBER = "+123456789" Setup logging

logging.basicConfig(level=logging.INFO) logger = logging.getLogger(name)

def get_local_ip(): """Get the local IP address of the machine""" s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try:

doesn't even have to be reachable

s.connect(('10.254.254.254', 1)) local_ip = s.getsockname()[0] except Exception: local_ip = '127.0.0.1' finally: s.close() return local_ip

def answer(call): try: f = wave.open('raw_audio.wav', 'rb') frames = f.getnframes() data = f.readframes(frames) f.close()

call.answer()
call.write_audio(data)

while call.state == CallState.ANSWERED:
    dtmf = call.get_dtmf()
    if dtmf == "1":
        print("pressed one")
        # Do something
        call.hangup()
    elif dtmf == "2":
        print("pressed 2")
        call.hangup()
    time.sleep(0.1)

except InvalidStateError: pass except: call.hangup()

if name == 'main': local_ip = get_local_ip() phone = VoIPPhone( server=SIP_SERVER, port=5060, username=SIP_USERNAME, password=SIP_PASSWORD, myIP=local_ip, callCallback=answer ) phone.start() logger.info(f"Using local IP: {local_ip}") logger.info(f"Calling phone number: {PHONE_NUMBER}") phone.call(PHONE_NUMBER) input('Press enter to disable the phone') phone.stop()

— Reply to this email directly, view it on GitHub https://github.com/tayler6000/pyVoIP/issues/283, or unsubscribe https://github.com/notifications/unsubscribe-auth/AFU3N5ZZYOQ6G4YN3HZWWSTZ52RLHAVCNFSM6AAAAABQYJ4S7OVHI2DSMVQWIX3LMV43ASLTON2WKOZSGYYTSNJUHA4TQOA . You are receiving this because you are subscribed to this thread.Message ID: @.***>

tomlynn avatar Oct 29 '24 00:10 tomlynn

and that's all u wanted to say? T~T

coolcunt avatar Dec 13 '24 21:12 coolcunt

Don't listen to him. He sounds like an ass anyway.

As for the issue itself; are you using a PJSIP account or a plain SIP account (assuming you're using something like Asterisk/FreePBX here)?

FloppiTuna avatar Dec 13 '24 21:12 FloppiTuna

ah, im using a smth like magnus billing, it's my friend's route, btw update, i was able to fix the dtfm handling and auto hangup if i dont play audio, now on python 3.12.8, but as soon as i try to add audio, it doesnt even call T~T.

`from pyVoIP.VoIP import VoIPPhone, InvalidStateError import time import wave import socket from queue import Queue

def handle_dtmf(call, dtmf_queue): while True: try: digit = call.get_dtmf() if digit: print(f"Received DTMF: {digit}") dtmf_queue.put(digit) time.sleep(0.1) except: # looks like the call dropped break

def make_call(phone): try: # dialing the number now call = phone.call("my_number") # making the call

    # setting up a queue for button presses
    dtmf_queue = Queue()
    
    # starting up the button handler in background
    import threading
    dtmf_thread = threading.Thread(target=handle_dtmf, args=(call, dtmf_queue))
    dtmf_thread.daemon = True
    dtmf_thread.start()
    
    # keeping the call going
    while True:
        try:
            # making sure call is still active
            _ = call.get_dtmf()
            
            # checking for any button presses
            if not dtmf_queue.empty():
                digit = dtmf_queue.get()
                # handling what button was pressed
                if digit == "1":
                    print("Option 1 selected")
                elif digit == "2":
                    print("Option 2 selected") 
                elif digit == "3":
                    print("Option 3 selected")
                    
            time.sleep(0.1)
        except:
            # call ended, we're done here
            break
        
except InvalidStateError:
    pass
except Exception as e:
    print(f"Error making call: {e}")

if name == 'main': # getting our local ip address s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # quick connection to get ip s.connect(('10.255.255.255', 1)) local_ip = s.getsockname()[0] except Exception: local_ip = '127.0.0.1' finally: s.close()

phone = VoIPPhone("my_sip_server", 5060, "my_username", "my_password", myIP=local_ip)
phone.start()

# starting the call now
make_call(phone)

input('press enter to end the call')
phone.stop()`

has no audio here but yea, please help me, any help will be appreciated, thanks. (i removed audio func so it works), (using 1.6.8 stable version)

coolcunt avatar Jan 25 '25 20:01 coolcunt

tried making similar script in 2.0.0a, but it calls faster, but no audio, no dtfm either,

`from pyVoIP.credentials import CredentialsManager from pyVoIP.VoIP.call import VoIPCall, CallState from pyVoIP.VoIP.error import InvalidStateError from pyVoIP.VoIP.phone import VoIPPhone, VoIPPhoneParameter import time import wave import socket from queue import Queue import threading

class Call(VoIPCall): def init(self, *args, **kwargs): super().init(*args, **kwargs) self.dtmf_queue = Queue()

def handle_dtmf(self):
    while True:
        try:
            digit = self.get_dtmf()
            if digit:
                print(f"Received DTMF: {digit}")
                self.dtmf_queue.put(digit)
            time.sleep(0.1)
        except:
            break

def ringing(self, invite_request):
    try:
        f = wave.open('prompt.wav', 'rb')
        frames = f.getnframes()
        data = f.readframes(frames)
        f.close()
        self.answer()
        
        dtmf_thread = threading.Thread(target=self.handle_dtmf)
        dtmf_thread.daemon = True
        dtmf_thread.start()
        
        self.write_audio(data)
        
        while self.state == CallState.ANSWERED:
            if not self.dtmf_queue.empty():
                dtmf = self.dtmf_queue.get()
                if dtmf == "1":
                    if self.transfer("sales"):
                        return
                elif dtmf == "2":
                    if self.transfer(uri="<100@different_regisrar.com>"):
                        return
            time.sleep(0.1)
    except InvalidStateError:
        pass
    except Exception as e:
        print(f"Error in call: {e}")
        self.hangup()

if name == 'main': s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: s.connect(('10.255.255.255', 1)) local_ip = s.getsockname()[0] except Exception: local_ip = '127.0.0.1' finally: s.close()

cm = CredentialsManager()
cm.add("username", "password")
params = VoIPPhoneParameter("sip.example.com", 5060, "username", cm, bind_ip=local_ip, call_class=Call)
phone = VoIPPhone(params)
phone.start()
call = phone.call("+15555555555")
while call.state != CallState.ANSWERED:
    time.sleep(0.1)
input('Press enter to disable the phone')
phone.stop()

` python 3.11,9, win 11, and uh magnus billing based sip, (btw when i tested the old script(with 1.6.8, python 3.12, it worked for dtfm, but no audio),

coolcunt avatar Jan 26 '25 17:01 coolcunt

@FloppiTuna what do u think?

coolcunt avatar Jan 26 '25 17:01 coolcunt