Advertisement
toko214

voip_client

Apr 18th, 2020
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.60 KB | None | 0 0
  1. import socket
  2. import threading
  3. import time
  4. import pyaudio
  5. import xml.etree.ElementTree as ET
  6. import atexit
  7. import traceback
  8. import sys
  9. import wave
  10.  
  11. p = pyaudio.PyAudio()
  12. CHUNK = 0
  13. FORMAT = pyaudio.paInt16
  14. O_CHANNELS = 0
  15. O_RATE = 0
  16. I_CHANNELS = 0
  17. I_RATE = 0
  18. client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  19. running = True
  20. frames = []
  21.  
  22.  
  23. def initialize():
  24.     # CHANNELS * CHUNK * 2 = 1024
  25.     global O_CHANNELS, O_RATE, I_RATE, I_CHANNELS, CHUNK
  26.     d_input = p.get_default_input_device_info()
  27.     d_output = p.get_default_output_device_info()
  28.     print(d_input)
  29.     print(d_output)
  30.     I_CHANNELS = d_input['maxInputChannels']
  31.     I_RATE = int(d_input['defaultSampleRate'])
  32.     O_CHANNELS = d_output['maxOutputChannels']
  33.     O_RATE = int(d_output['defaultSampleRate'])
  34.     CHUNK = int(4096 / (O_CHANNELS * 2))
  35.     print("CHUNK IS: " + str(CHUNK))
  36.  
  37.  
  38. def exit_handler():
  39.     try:
  40.         print('My application is ending!')
  41.         client_sock.sendto("EXIT".encode(), (HOST, PORT))
  42.         print("closing p object")
  43.         p.terminate()
  44.         client_sock.close()
  45.     except Exception as ex:
  46.         print("exit error: ")
  47.         print(ex)
  48.  
  49.  
  50. def parseXML(xmlfile):
  51.     # create element tree object
  52.     tree = ET.parse(xmlfile)
  53.     # get root element
  54.     root = tree.getroot()
  55.     # create empty list for news items
  56.     newsitems = []
  57.     ip = root.findall("./socket/ip")
  58.     port = root.findall("./socket/port")
  59.     print(type(ip[0].text))
  60.     return ip[0].text, int(port[0].text)
  61.  
  62.  
  63. def send_audio_udp(stream):
  64.     try:
  65.         print("* recording" + "\r\n")
  66.         wf = wave.open("hello.wav", 'wb')
  67.         wf.setnchannels(O_CHANNELS)
  68.         wf.setsampwidth(p.get_sample_size(FORMAT))
  69.         wf.setframerate(O_RATE)
  70.         frfr = []
  71.         #print("len of read is: " + str(len(stream.read(CHUNK))) + "\r\n")
  72.         while running:
  73.             try:
  74.                 data = stream.read(CHUNK, exception_on_overflow=False)
  75.                 client_sock.sendto(data, (HOST, PORT))
  76.                 frfr.append(data)
  77.             except socket.error as ex:
  78.                 print(ex)
  79.                 break
  80.         wf.writeframes(b''.join(frfr))
  81.         wf.close()
  82.     except Exception as exx:
  83.         print("send audio udp exception: \r\n")
  84.         print(exx)
  85.     print("finished sending audio\r\n")
  86.  
  87.  
  88. def play(stream):
  89.     try:
  90.         BUFFER = 10
  91.         print("chunk is: " + str(CHUNK) + "\r\n")
  92.         while running:
  93.             try:
  94.                 while len(frames) > BUFFER:
  95.                     fr = frames.pop(0)
  96.                     stream.write(fr, CHUNK)
  97.             except Exception as ex:
  98.                 print("error while streaming data into speaker:\r\n")
  99.                 print(ex)
  100.                 break
  101.         #wf.close()
  102.  
  103.     except Exception as exx:
  104.         print("play exception: \r\n")
  105.         print(exx)
  106.     print("finished play audio\r\n")
  107.  
  108.  
  109. def recv_audio_udp():
  110.     global running
  111.     try:
  112.         while running:
  113.             data, ip = client_sock.recvfrom(CHUNK * O_CHANNELS * 2)
  114.             frames.append(data)
  115.     except socket.error as ex:
  116.         print("got a socket error: \r\n")
  117.         running = False
  118.         print(ex)
  119.  
  120.     except Exception as exx:
  121.         print("other error: \r\n")
  122.         print(exx)
  123.         return
  124.     print("finish recv\r\n")
  125.  
  126.  
  127. def command():
  128.     global running
  129.     while running:
  130.         try:
  131.             msg = input("enter a command: ")
  132.             if msg == "exit":
  133.                 running = False
  134.                 sys.exit()
  135.         except Exception as ex:
  136.             print("command exception: r\n")
  137.             print(ex)
  138.     print("finish command\r\n")
  139.  
  140.  
  141. def main():
  142.     try:
  143.         initialize()
  144.         client_sock.sendto("im here".encode(), (HOST, PORT))
  145.         print(HOST, PORT)
  146.         data, ip = client_sock.recvfrom(1024)
  147.         data = data.decode()
  148.         print("data is: " + data)
  149.         if data == "recv":
  150.             print("login success\r\n")
  151.             input_stream = p.open(format=FORMAT,
  152.                                 channels=I_CHANNELS,
  153.                                 rate=I_RATE,
  154.                                 input=True,  # input_device_index=device_index,
  155.                                 frames_per_buffer=CHUNK)
  156.             ts = threading.Thread(target=send_audio_udp, args=(input_stream,))
  157.             ts.setDaemon(True)
  158.  
  159.             output_stream = p.open(format=FORMAT,
  160.                             channels=O_CHANNELS,
  161.                             rate=O_RATE,
  162.                             output=True,
  163.                             frames_per_buffer=CHUNK)
  164.             print("after send audio thread\r\n")
  165.             tp = threading.Thread(target=play, args=(output_stream,))
  166.             tp.setDaemon(True)
  167.             tr = threading.Thread(target=recv_audio_udp)
  168.             tr.setDaemon(True)
  169.             tc = threading.Thread(target=command)
  170.             tc.setDaemon(True)
  171.  
  172.             ts.start()
  173.             tp.start()
  174.             tr.start()
  175.             tc.start()
  176.  
  177.             ts.join()
  178.             tp.join()
  179.             tr.join()
  180.             tc.join()
  181.         else:
  182.             print("error")
  183.     except socket.error as ex:
  184.         print("got a socket error in main: \r\n")
  185.         print(ex)
  186.  
  187.     except Exception as exx:
  188.         print("main other error: \r\n")
  189.         print(exx)
  190.         return
  191.  
  192.  
  193. if __name__ == "__main__":
  194.     try:
  195.         HOST, PORT = parseXML("config.xml")
  196.         atexit.register(exit_handler)
  197.         main()
  198.     except Exception as ex:
  199.         print("main error: \r\n")
  200.         print(traceback.format_exc())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement