[Jingle] User can send DTMF tones using the /dtmf command
This commit is contained in:
parent
44ab50d080
commit
e5062f77ea
2 changed files with 46 additions and 0 deletions
|
@ -98,6 +98,22 @@ class StandardChatCommands(CommandContainer):
|
||||||
raise CommandError(_('Command is not supported for zeroconf accounts'))
|
raise CommandError(_('Command is not supported for zeroconf accounts'))
|
||||||
gajim.connections[self.account].sendPing(self.contact)
|
gajim.connections[self.account].sendPing(self.contact)
|
||||||
|
|
||||||
|
@command('dtmf')
|
||||||
|
@documentation(_("Sends DTMF events through an open audio session"))
|
||||||
|
def dtmf(self, events):
|
||||||
|
if not self.audio_sid:
|
||||||
|
raise CommandError(_("There is no open audio session with this contact"))
|
||||||
|
# Valid values for DTMF tones are *, # or a number
|
||||||
|
events = [event for event in events
|
||||||
|
if event in ('*', '#') or event.isdigit()]
|
||||||
|
if events:
|
||||||
|
session = gajim.connections[self.account].get_jingle_session(
|
||||||
|
self.contact.get_full_jid(), self.audio_sid)
|
||||||
|
content = session.get_content('audio')
|
||||||
|
content.batch_dtmf(events)
|
||||||
|
else:
|
||||||
|
raise CommandError(_("No valid DTMF event specified"))
|
||||||
|
|
||||||
@command('audio')
|
@command('audio')
|
||||||
@documentation(_("Toggle audio session"))
|
@documentation(_("Toggle audio session"))
|
||||||
def audio(self):
|
def audio(self):
|
||||||
|
|
|
@ -47,6 +47,8 @@
|
||||||
|
|
||||||
# * handle different kinds of sink and src elements
|
# * handle different kinds of sink and src elements
|
||||||
|
|
||||||
|
import gobject
|
||||||
|
|
||||||
import gajim
|
import gajim
|
||||||
import xmpp
|
import xmpp
|
||||||
import helpers
|
import helpers
|
||||||
|
@ -831,6 +833,7 @@ class JingleRTPContent(JingleContent):
|
||||||
def __init__(self, session, media, node=None):
|
def __init__(self, session, media, node=None):
|
||||||
JingleContent.__init__(self, session, node)
|
JingleContent.__init__(self, session, node)
|
||||||
self.media = media
|
self.media = media
|
||||||
|
self._dtmf_running = False
|
||||||
self.farsight_media = {'audio': farsight.MEDIA_TYPE_AUDIO,
|
self.farsight_media = {'audio': farsight.MEDIA_TYPE_AUDIO,
|
||||||
'video': farsight.MEDIA_TYPE_VIDEO}[media]
|
'video': farsight.MEDIA_TYPE_VIDEO}[media]
|
||||||
self.got_codecs = False
|
self.got_codecs = False
|
||||||
|
@ -873,6 +876,33 @@ class JingleRTPContent(JingleContent):
|
||||||
self.p2pstream = self.p2psession.new_stream(participant,
|
self.p2pstream = self.p2psession.new_stream(participant,
|
||||||
farsight.DIRECTION_RECV, 'nice', params)
|
farsight.DIRECTION_RECV, 'nice', params)
|
||||||
|
|
||||||
|
def batch_dtmf(self, events):
|
||||||
|
if self._dtmf_running:
|
||||||
|
raise Exception #TODO: Proper exception
|
||||||
|
self._dtmf_running = True
|
||||||
|
self._start_dtmf(events.pop(0))
|
||||||
|
gobject.timeout_add(500, self._next_dtmf, events)
|
||||||
|
|
||||||
|
def _next_dtmf(self, events):
|
||||||
|
self._stop_dtmf()
|
||||||
|
if events:
|
||||||
|
self._start_dtmf(events.pop(0))
|
||||||
|
gobject.timeout_add(500, self._next_dtmf, events)
|
||||||
|
else:
|
||||||
|
self._dtmf_running = False
|
||||||
|
|
||||||
|
def _start_dtmf(self, event):
|
||||||
|
if event in ('*', '#'):
|
||||||
|
event = {'*': farsight.DTMF_EVENT_STAR,
|
||||||
|
'#': farsight.DTMF_EVENT_POUND}[event]
|
||||||
|
else:
|
||||||
|
event = int(event)
|
||||||
|
self.p2psession.start_telephony_event(event, 2,
|
||||||
|
farsight.DTMF_METHOD_RTP_RFC4733)
|
||||||
|
|
||||||
|
def _stop_dtmf(self):
|
||||||
|
self.p2psession.stop_telephony_event(farsight.DTMF_METHOD_RTP_RFC4733)
|
||||||
|
|
||||||
def _fillContent(self, content):
|
def _fillContent(self, content):
|
||||||
content.addChild(xmpp.NS_JINGLE_RTP + ' description',
|
content.addChild(xmpp.NS_JINGLE_RTP + ' description',
|
||||||
attrs={'media': self.media}, payload=self.iter_codecs())
|
attrs={'media': self.media}, payload=self.iter_codecs())
|
||||||
|
|
Loading…
Add table
Reference in a new issue