From: Igor Goncharovskiy Date: Wed, 5 Mar 2014 06:11:21 +0000 (+0000) Subject: Add update_peer function to unistim_rtp_glue, improve other unistim_rtp_glue function... X-Git-Tag: 12.2.0-rc1~99 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9d963d4a54974d8ee84cd3f4f4adb1b969587f5b;p=thirdparty%2Fasterisk.git Add update_peer function to unistim_rtp_glue, improve other unistim_rtp_glue functions conforming to other channel drivers. Do not forget auto-detected and user-selected phone settings on 'unistim reload' ........ Merged revisions 409705 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 409745 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@409746 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_unistim.c b/channels/chan_unistim.c index 2f4b9c6a79..fa4f2c5c13 100644 --- a/channels/chan_unistim.c +++ b/channels/chan_unistim.c @@ -5221,6 +5221,7 @@ static int unistim_indicate(struct ast_channel *ast, int ind, const void *data, if (sub->subtype == SUB_REAL) { send_callerid_screen(s, sub); } + case AST_CONTROL_UPDATE_RTP_PEER: break; case AST_CONTROL_SRCCHANGE: ast_rtp_instance_change_source(sub->rtp); @@ -6272,6 +6273,13 @@ static struct unistim_device *build_device(const char *cat, const struct ast_var } ast_mutex_init(&d->lock); ast_copy_string(d->name, cat, sizeof(d->name)); + d->contrast = -1; + d->output = OUTPUT_HANDSET; + d->previous_output = OUTPUT_HANDSET; + d->volume = VOLUME_LOW; + d->mute = MUTE_OFF; + d->height = DEFAULTHEIGHT; + d->selected = -1; } else { /* Delete existing line information */ AST_LIST_LOCK(&d->lines); @@ -6291,14 +6299,7 @@ static struct unistim_device *build_device(const char *cat, const struct ast_var memset(d->sline, 0, sizeof(d->sline)); memset(d->sp, 0, sizeof(d->sp)); } - ast_copy_string(d->context, DEFAULTCONTEXT, sizeof(d->context)); - d->contrast = -1; - d->output = OUTPUT_HANDSET; - d->previous_output = OUTPUT_HANDSET; - d->volume = VOLUME_LOW; - d->mute = MUTE_OFF; - d->height = DEFAULTHEIGHT; d->selected = -1; d->interdigit_timer = DEFAULT_INTERDIGIT_TIMER; linelabel[0] = '\0'; @@ -6830,15 +6831,51 @@ static enum ast_rtp_glue_result unistim_get_rtp_peer(struct ast_channel *chan, s { struct unistim_subchannel *sub = ast_channel_tech_pvt(chan); + if (!sub) { + return AST_RTP_GLUE_RESULT_FORBID; + } + if (!sub->rtp) { + return AST_RTP_GLUE_RESULT_FORBID; + } + ao2_ref(sub->rtp, +1); *instance = sub->rtp; return AST_RTP_GLUE_RESULT_LOCAL; } +static int unistim_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance *rtp, struct ast_rtp_instance *vrtp, struct ast_rtp_instance *trtp, const struct ast_format_cap *codecs, int nat_active) +{ + struct unistim_subchannel *sub; + struct sockaddr_in them = { 0, }; + struct sockaddr_in us = { 0, }; + + if (!rtp) { + return 0; + } + + sub = ast_channel_tech_pvt(chan); + if (!sub) { + ast_log(LOG_ERROR, "No Private Structure, this is bad\n"); + return -1; + } + { + struct ast_sockaddr tmp; + ast_rtp_instance_get_remote_address(rtp, &tmp); + ast_sockaddr_to_sin(&tmp, &them); + ast_rtp_instance_get_local_address(rtp, &tmp); + ast_sockaddr_to_sin(&tmp, &us); + } + + /* TODO: Set rtp on phone in case of direct rtp (not implemented) */ + + return 0; +} + static struct ast_rtp_glue unistim_rtp_glue = { .type = channel_type, .get_rtp_info = unistim_get_rtp_peer, + .update_peer = unistim_set_rtp_peer, }; /*--- load_module: PBX load module - initialization ---*/