From 227209fe93958610c4c1cc3ab3969df8de113c1b Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 5 Mar 2020 00:05:06 +0100 Subject: [PATCH] call gapk to send an RTP stream WIP --- gsm_call_fsm.py | 11 +++++++++++ mncc_sock.py | 8 ++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gsm_call_fsm.py b/gsm_call_fsm.py index a9ad8c0..d858e30 100644 --- a/gsm_call_fsm.py +++ b/gsm_call_fsm.py @@ -12,6 +12,7 @@ import mncc import ctypes import pykka +import subprocess import logging as log @@ -339,6 +340,12 @@ class GsmCallConnector(pykka.ThreadingActor): self.call_a.tell({'type':'connect_rtp', 'rtp':self.rtp_b}) self.call_b.tell({'type':'connect_rtp', 'rtp':self.rtp_a}) + def send_rtp(self, rtp): + cmd = ('osmo-gapk', '-i', '/docker/1frame.fr1', '-f', 'gsm', '-g', 'gsm', '-O', '%s/%s' % (rtp.ip_str(), rtp.port)) + log.info('Sending RTP: %s' % (' '.join(cmd))) + p = subprocess.Popen(cmd) + log.info('Process started: RTP: %s' % p.pid) + def bridge_legs(self): # bridge the voice channels of both call legs in the classic way if self.rtp_bridge: @@ -359,6 +366,10 @@ class GsmCallConnector(pykka.ThreadingActor): log.info('Both A and B in state NULL -> Terminating') self.stop() + if self.state_a == 'ACTIVE' and self.state_b == 'ACTIVE': + self.send_rtp(self.rtp_a) + #self.send_rtp(self.rtp_b) + def on_receive(self, message): if message['type'] == 'call_state_change': self.call_state_change(message['called'], message['old_state'], message['new_state']) diff --git a/mncc_sock.py b/mncc_sock.py index 153d9a6..95c0f07 100644 --- a/mncc_sock.py +++ b/mncc_sock.py @@ -67,9 +67,13 @@ class mncc_data_frame_msg(mncc.gsm_data_frame, mncc_msg_common): class mncc_rtp_msg(mncc.gsm_mncc_rtp, mncc_msg_common): def __str__(self): - return 'mncc_rtp_msg(type=0x%04x, callref=%u, ip=%x, port=%u)' % (self.msg_type, self.callref, self.ip, self.port) + return 'mncc_rtp_msg(type=0x%04x, callref=%u, ip=%s, port=%u)' % (self.msg_type, self.callref, self.ip_str(), self.port) def __unicode__(self): - return u'mncc_rtp_msg(type=0x%04x, callref=%u, ip=%x, port=%u)' % (self.msg_type, self.callref, self.ip, self.port) + return u'mncc_rtp_msg(type=0x%04x, callref=%u, ip=%s, port=%u)' % (self.msg_type, self.callref, self.ip_str(), self.port) + + def ip_str(self): + numbers = reversed([str((self.ip >> (8*b)) & 0xff) for b in range(4)]) + return '.'.join(numbers) class mncc_bridge_msg(mncc.gsm_mncc_bridge, mncc_msg_common): def __str__(self):