/* 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);
.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,
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");
}
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 */
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;
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);
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");