summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--channels/chan_gtalk.c46
1 files changed, 38 insertions, 8 deletions
diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c
index 0647d3e6c..00f873ab4 100644
--- a/channels/chan_gtalk.c
+++ b/channels/chan_gtalk.c
@@ -173,7 +173,7 @@ AST_MUTEX_DEFINE_STATIC(gtalklock); /*!< Protect the interface list (of gtalk_pv
/* Forward declarations */
static struct ast_channel *gtalk_request(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause);
-static int gtalk_digit(struct ast_channel *ast, char digit, unsigned int duration);
+/*static int gtalk_digit(struct ast_channel *ast, char digit, unsigned int duration);*/
static int gtalk_sendtext(struct ast_channel *ast, const char *text);
static int gtalk_digit_begin(struct ast_channel *ast, char digit);
static int gtalk_digit_end(struct ast_channel *ast, char digit, unsigned int duration);
@@ -201,7 +201,10 @@ static const struct ast_channel_tech gtalk_tech = {
.send_text = gtalk_sendtext,
.send_digit_begin = gtalk_digit_begin,
.send_digit_end = gtalk_digit_end,
- .bridge = ast_rtp_instance_bridge,
+ /* XXX TODO native bridging is causing odd problems with DTMF pass-through with
+ * the gtalk servers. Enable native bridging once the source of this problem has
+ * been identified.
+ .bridge = ast_rtp_instance_bridge, */
.call = gtalk_call,
.hangup = gtalk_hangup,
.answer = gtalk_answer,
@@ -412,7 +415,7 @@ static int gtalk_invite(struct gtalk_pvt *p, char *to, char *from, char *sid, in
if (codecs_num) {
/* only propose DTMF within an audio session */
- iks_insert_attrib(payload_telephone, "id", "106");
+ iks_insert_attrib(payload_telephone, "id", "101");
iks_insert_attrib(payload_telephone, "name", "telephone-event");
iks_insert_attrib(payload_telephone, "clockrate", "8000");
}
@@ -997,6 +1000,8 @@ static struct gtalk_pvt *gtalk_alloc(struct gtalk *client, const char *us, const
return NULL;
}
ast_rtp_instance_set_prop(tmp->rtp, AST_RTP_PROPERTY_RTCP, 1);
+ ast_rtp_instance_set_prop(tmp->rtp, AST_RTP_PROPERTY_DTMF, 1);
+ ast_rtp_instance_dtmf_mode_set(tmp->rtp, AST_RTP_DTMF_MODE_RFC2833);
ast_rtp_codecs_payloads_clear(ast_rtp_instance_get_codecs(tmp->rtp), tmp->rtp);
/* add user configured codec capabilites */
@@ -1590,14 +1595,39 @@ static int gtalk_sendtext(struct ast_channel *chan, const char *text)
static int gtalk_digit_begin(struct ast_channel *chan, char digit)
{
- return gtalk_digit(chan, digit, 0);
+ struct gtalk_pvt *p = chan->tech_pvt;
+ int res = 0;
+
+ ast_mutex_lock(&p->lock);
+ if (p->rtp) {
+ ast_rtp_instance_dtmf_begin(p->rtp, digit);
+ } else {
+ res = -1;
+ }
+ ast_mutex_unlock(&p->lock);
+
+ return res;
}
static int gtalk_digit_end(struct ast_channel *chan, char digit, unsigned int duration)
{
- return gtalk_digit(chan, digit, duration);
+ struct gtalk_pvt *p = chan->tech_pvt;
+ int res = 0;
+
+ ast_mutex_lock(&p->lock);
+ if (p->rtp) {
+ ast_rtp_instance_dtmf_end_with_duration(p->rtp, digit, duration);
+ } else {
+ res = -1;
+ }
+ ast_mutex_unlock(&p->lock);
+
+ return res;
}
+/* This function is of not in use at the moment, but I am choosing to leave this
+ * within the code base as a reference to how DTMF is possible through
+ * jingle signaling. However, google currently does DTMF through the RTP.
static int gtalk_digit(struct ast_channel *ast, char digit, unsigned int duration)
{
struct gtalk_pvt *p = ast->tech_pvt;
@@ -1623,8 +1653,8 @@ static int gtalk_digit(struct ast_channel *ast, char digit, unsigned int duratio
ast_aji_increment_mid(client->connection->mid);
iks_insert_attrib(gtalk, "xmlns", "http://jabber.org/protocol/gtalk");
iks_insert_attrib(gtalk, "action", "session-info");
- /* put the initiator attribute to lower case if we receive the call
- * otherwise GoogleTalk won't establish the session */
+ // put the initiator attribute to lower case if we receive the call
+ // otherwise GoogleTalk won't establish the session
if (!p->initiator) {
char c;
char *t = lowerthem = ast_strdupa(p->them);
@@ -1651,7 +1681,7 @@ static int gtalk_digit(struct ast_channel *ast, char digit, unsigned int duratio
ast_mutex_unlock(&p->lock);
return 0;
}
-
+*/
static int gtalk_sendhtml(struct ast_channel *ast, int subclass, const char *data, int datalen)
{
ast_log(LOG_NOTICE, "XXX Implement gtalk sendhtml XXX\n");