Index: channels/chan_jingle.c =================================================================== --- channels/chan_jingle.c (revision 116882) +++ channels/chan_jingle.c (working copy) @@ -573,7 +573,7 @@ if (tmp) { tmp->alreadygone = 1; if (tmp->owner) - ast_queue_hangup(tmp->owner, -1); + ast_queue_hangup_with_cause(tmp->owner, -1); } else ast_log(LOG_NOTICE, "Whoa, didn't find call!\n"); jingle_response(client, pak, NULL, NULL); Index: channels/chan_h323.c =================================================================== --- channels/chan_h323.c (revision 116882) +++ channels/chan_h323.c (working copy) @@ -342,7 +342,7 @@ ast_debug(1, "Process pending hangup for %s\n", c->name); c->_softhangup |= AST_SOFTHANGUP_DEV; c->hangupcause = pvt->hangupcause; - ast_queue_hangup(c, pvt->hangupcause); + ast_queue_hangup_with_cause(c, pvt->hangupcause); pvt->needhangup = 0; pvt->newstate = pvt->newcontrol = pvt->newdigit = pvt->DTMFsched = -1; } @@ -2379,7 +2379,7 @@ /* Send hangup */ if (pvt->owner) { pvt->owner->_softhangup |= AST_SOFTHANGUP_DEV; - ast_queue_hangup(pvt->owner, -1); + ast_queue_hangup_with_cause(pvt->owner, -1); ast_channel_unlock(pvt->owner); } ast_mutex_unlock(&pvt->lock); @@ -2404,7 +2404,7 @@ if (pvt->owner && !ast_channel_trylock(pvt->owner)) { pvt->owner->_softhangup |= AST_SOFTHANGUP_DEV; pvt->owner->hangupcause = pvt->hangupcause = cause; - ast_queue_hangup(pvt->owner, cause); + ast_queue_hangup_with_cause(pvt->owner, cause); ast_channel_unlock(pvt->owner); } else { Index: channels/chan_zap.c =================================================================== --- channels/chan_zap.c (revision 116882) +++ channels/chan_zap.c (working copy) @@ -4523,7 +4523,7 @@ /* It hasn't been long enough since the last flashook. This is probably a bounce on hanging up. Hangup both channels now */ if (p->subs[SUB_THREEWAY].owner) - ast_queue_hangup(p->subs[SUB_THREEWAY].owner, AST_CAUSE_NO_ANSWER); + ast_queue_hangup_with_cause(p->subs[SUB_THREEWAY].owner, AST_CAUSE_NO_ANSWER); p->subs[SUB_THREEWAY].owner->_softhangup |= AST_SOFTHANGUP_DEV; ast_debug(1, "Looks like a bounced flash, hanging up both calls on %d\n", p->channel); ast_channel_unlock(p->subs[SUB_THREEWAY].owner); @@ -10121,7 +10121,7 @@ ast_mutex_lock(&p->lock); } if (p->subs[x].owner) { - ast_queue_hangup(p->subs[x].owner, AST_CAUSE_PRE_EMPTED); + ast_queue_hangup_with_cause(p->subs[x].owner, AST_CAUSE_PRE_EMPTED); ast_channel_unlock(p->subs[x].owner); } } Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 116882) +++ channels/chan_sip.c (working copy) @@ -2979,7 +2979,7 @@ if (pkt->owner->owner) { sip_alreadygone(pkt->owner); ast_log(LOG_WARNING, "Hanging up call %s - no reply to our critical packet.\n", pkt->owner->callid); - ast_queue_hangup(pkt->owner->owner, AST_CAUSE_PROTOCOL_ERROR); + ast_queue_hangup_with_cause(pkt->owner->owner, AST_CAUSE_PROTOCOL_ERROR); ast_channel_unlock(pkt->owner->owner); } else { /* If no channel owner, destroy now */ @@ -3121,7 +3121,7 @@ if (p->owner) { ast_log(LOG_WARNING, "Autodestruct on dialog '%s' with owner in place (Method: %s)\n", p->callid, sip_methods[p->method].text); - ast_queue_hangup(p->owner, AST_CAUSE_PROTOCOL_ERROR); + ast_queue_hangup_with_cause(p->owner, AST_CAUSE_PROTOCOL_ERROR); } else if (p->refer) { ast_debug(3, "Finally hanging up channel after transfer: %s\n", p->callid); transmit_request_with_auth(p, SIP_BYE, 0, XMIT_RELIABLE, 1); @@ -15828,7 +15828,7 @@ */ xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE); if (p->owner && !req->ignore) { - ast_queue_hangup(p->owner, AST_CAUSE_NORMAL_CLEARING); + ast_queue_hangup_with_cause(p->owner, AST_CAUSE_NORMAL_CLEARING); append_history(p, "Hangup", "Got 487 on CANCEL request from us. Queued AST hangup request"); } else if (!req->ignore) { update_call_counter(p, DEC_CALL_LIMIT); @@ -15909,7 +15909,7 @@ if (p->owner) { if (!p->refer) { ast_log(LOG_WARNING, "Notify answer on an owned channel? - %s\n", p->owner->name); - ast_queue_hangup(p->owner, AST_CAUSE_NORMAL_UNSPECIFIED); + ast_queue_hangup_with_cause(p->owner, AST_CAUSE_NORMAL_UNSPECIFIED); } else { ast_debug(4, "Got OK on REFER Notify message\n"); } @@ -16469,7 +16469,7 @@ default: /* Send hangup */ if (owner && sipmethod != SIP_MESSAGE && sipmethod != SIP_INFO && sipmethod != SIP_BYE) - ast_queue_hangup(p->owner, AST_CAUSE_PROTOCOL_ERROR); + ast_queue_hangup_with_cause(p->owner, AST_CAUSE_PROTOCOL_ERROR); break; } /* ACK on invite */ @@ -16523,7 +16523,7 @@ ast_debug(1, "Got 200 OK on NOTIFY for transfer\n"); } else ast_log(LOG_WARNING, "Notify answer on an owned channel?\n"); - /* ast_queue_hangup(p->owner, -1); Disabled */ + /* ast_queue_hangup_with_cause(p->owner, -1); Disabled */ } else { if (!p->subscribed && !p->refer) p->needdestroy = 1; @@ -18373,7 +18373,7 @@ stop_media_flows(p); /* Immediately stop RTP, VRTP and UDPTL as applicable */ if (p->owner) - ast_queue_hangup(p->owner, -1); + ast_queue_hangup_with_cause(p->owner, -1); else sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); if (p->initreq.len > 0) { @@ -18532,15 +18532,15 @@ ast_queue_control(c, AST_CONTROL_UNHOLD); ast_async_goto(bridged_to, p->context, p->refer->refer_to, 1); } else - ast_queue_hangup(p->owner, -1); + ast_queue_hangup_with_cause(p->owner, -1); } } else { ast_log(LOG_WARNING, "Invalid transfer information from '%s'\n", ast_inet_ntoa(p->recv.sin_addr)); if (p->owner) - ast_queue_hangup(p->owner, AST_CAUSE_PROTOCOL_ERROR); + ast_queue_hangup_with_cause(p->owner, AST_CAUSE_PROTOCOL_ERROR); } } else if (p->owner) { - ast_queue_hangup(p->owner, -1); + ast_queue_hangup_with_cause(p->owner, -1); ast_debug(3, "Received bye, issuing owner hangup\n"); } else { sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); Index: channels/chan_iax2.c =================================================================== --- channels/chan_iax2.c (revision 116882) +++ channels/chan_iax2.c (working copy) @@ -1779,7 +1779,7 @@ usleep(1); ast_mutex_lock(&iaxsl[callno]); } else { - ast_queue_hangup(iaxs[callno]->owner, -1); + ast_queue_hangup_with_cause(iaxs[callno]->owner, -1); ast_channel_unlock(iaxs[callno]->owner); break; } @@ -2234,7 +2234,7 @@ /* If there's an owner, prod it to give up */ /* It is ok to use ast_queue_hangup() here instead of iax2_queue_hangup() * because we already hold the owner channel lock. */ - ast_queue_hangup(owner, -1); + ast_queue_hangup_with_cause(owner, -1); } if (pvt->peercallno) { @@ -2295,7 +2295,10 @@ ast_log(LOG_WARNING, "Max retries exceeded to host %s on %s (type = %d, subclass = %d, ts=%d, seqno=%d)\n", ast_inet_ntoa(iaxs[f->callno]->addr.sin_addr),iaxs[f->callno]->owner->name , f->af.frametype, f->af.subclass, f->ts, f->oseqno); iaxs[callno]->error = ETIMEDOUT; if (iaxs[callno]->owner) { - struct ast_frame fr = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP, .seqno = AST_CAUSE_DESTINATION_OUT_OF_ORDER }; + struct ast_frame fr = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP }; + // because data/data_int is an anonymous member, we cannot set it at declaration + // that's why we initialize it after declaring fr + fr.data_int = AST_CAUSE_DESTINATION_OUT_OF_ORDER; /* Hangup the fd */ iax2_queue_frame(callno, &fr); /* XXX */ /* Remember, owner could disappear */ Index: channels/chan_oss.c =================================================================== --- channels/chan_oss.c (revision 116882) +++ channels/chan_oss.c (working copy) @@ -1040,7 +1040,7 @@ } o->hookstate = 0; if (o->owner) - ast_queue_hangup(o->owner, AST_CAUSE_NORMAL_CLEARING); + ast_queue_hangup_with_cause(o->owner, AST_CAUSE_NORMAL_CLEARING); setformat(o, O_CLOSE); return CLI_SUCCESS; } Index: channels/chan_misdn.c =================================================================== --- channels/chan_misdn.c (revision 116882) +++ channels/chan_misdn.c (working copy) @@ -2320,13 +2320,13 @@ if (!p) { ast_log(LOG_WARNING, " --> Channel not connected ??\n"); - ast_queue_hangup(ast, AST_CAUSE_NETWORK_OUT_OF_ORDER); + ast_queue_hangup_with_cause(ast, AST_CAUSE_NETWORK_OUT_OF_ORDER); } if (!p->bc) { chan_misdn_log(1, 0, " --> Got Answer, but theres no bc obj ??\n"); - ast_queue_hangup(ast, AST_CAUSE_PROTOCOL_ERROR); + ast_queue_hangup_with_cause(ast, AST_CAUSE_PROTOCOL_ERROR); } tmp = pbx_builtin_getvar_helper(p->ast, "CRYPT_KEY"); @@ -3665,7 +3665,7 @@ send_cause2ast(ch->ast, ch->bc, ch); if (ch->ast) - ast_queue_hangup(ch->ast, ch->bc->cause); + ast_queue_hangup_with_cause(ch->ast, ch->bc->cause); cb_log(2, port, " --> queue_hangup\n"); } else { cb_log(1, port, "Cannot hangup chan, no ast\n"); Index: channels/chan_skinny.c =================================================================== --- channels/chan_skinny.c (revision 116882) +++ channels/chan_skinny.c (working copy) @@ -4554,7 +4554,7 @@ if ((res = attempt_transfer(p)) < 0) { if (sub->next && sub->next->owner) { sub->next->alreadygone = 1; - ast_queue_hangup(sub->next->owner, -1); + ast_queue_hangup_with_cause(sub->next->owner, -1); } } else if (res) { ast_log(LOG_WARNING, "Transfer attempt failed\n"); @@ -4566,7 +4566,7 @@ /* If there is another active call, skinny_hangup will ring the phone with the other call */ if (sub->owner) { sub->alreadygone = 1; - ast_queue_hangup(sub->owner, -1); + ast_queue_hangup_with_cause(sub->owner, -1); } else { ast_log(LOG_WARNING, "Skinny(%s@%s-%d) channel already destroyed\n", l->name, d->name, sub->callid); @@ -5263,7 +5263,7 @@ if ((res = attempt_transfer(p)) < 0) { if (sub->next && sub->next->owner) { sub->next->alreadygone = 1; - ast_queue_hangup(sub->next->owner, -1); + ast_queue_hangup_with_cause(sub->next->owner, -1); } } else if (res) { ast_log(LOG_WARNING, "Transfer attempt failed\n"); @@ -5275,7 +5275,7 @@ /* If there is another active call, skinny_hangup will ring the phone with the other call */ if (sub->owner) { sub->alreadygone = 1; - ast_queue_hangup(sub->owner, -1); + ast_queue_hangup_with_cause(sub->owner, -1); } else { ast_log(LOG_WARNING, "Skinny(%s@%s-%d) channel already destroyed\n", l->name, d->name, sub->callid); Index: channels/chan_alsa.c =================================================================== --- channels/chan_alsa.c (revision 116882) +++ channels/chan_alsa.c (working copy) @@ -765,7 +765,7 @@ hookstate = 0; grab_owner(); if (alsa.owner) { - ast_queue_hangup(alsa.owner, AST_CAUSE_NORMAL_CLEARING); + ast_queue_hangup_with_cause(alsa.owner, AST_CAUSE_NORMAL_CLEARING); ast_channel_unlock(alsa.owner); } } Index: channels/chan_mgcp.c =================================================================== --- channels/chan_mgcp.c (revision 116882) +++ channels/chan_mgcp.c (working copy) @@ -610,7 +610,7 @@ for(;;) { if (sub->owner) { if (!ast_channel_trylock(sub->owner)) { - ast_queue_hangup(sub->owner, -1); + ast_queue_hangup_with_cause(sub->owner, -1); ast_channel_unlock(sub->owner); break; } else { Index: channels/chan_unistim.c =================================================================== --- channels/chan_unistim.c (revision 116882) +++ channels/chan_unistim.c (working copy) @@ -1125,7 +1125,7 @@ if (sub->owner) { /* Call in progress ? */ if (unistimdebug) ast_verb(0, "Aborting call\n"); - ast_queue_hangup(sub->owner, AST_CAUSE_NETWORK_OUT_OF_ORDER); + ast_queue_hangup_with_cause(sub->owner, AST_CAUSE_NETWORK_OUT_OF_ORDER); } } else ast_log(LOG_WARNING, "Freeing a client with no subchannel !\n"); @@ -1974,11 +1974,11 @@ if (attempt_transfer(sub, l->subs[SUB_THREEWAY]) < 0) ast_verb(0, "attempt_transfer failed.\n"); } else - ast_queue_hangup(sub->owner, -1); + ast_queue_hangup_with_cause(sub->owner, -1); } else { if (l->subs[SUB_THREEWAY]) { if (l->subs[SUB_THREEWAY]->owner) - ast_queue_hangup(l->subs[SUB_THREEWAY]->owner, AST_CAUSE_NORMAL_CLEARING); + ast_queue_hangup_with_cause(l->subs[SUB_THREEWAY]->owner, AST_CAUSE_NORMAL_CLEARING); else ast_log(LOG_WARNING, "threeway sub without owner\n"); } else @@ -2312,7 +2312,7 @@ if (unistimdebug) ast_verb(0, "Transfer canceled, hangup our threeway channel\n"); if (p->subs[SUB_THREEWAY]->owner) - ast_queue_hangup(p->subs[SUB_THREEWAY]->owner, AST_CAUSE_NORMAL_CLEARING); + ast_queue_hangup_with_cause(p->subs[SUB_THREEWAY]->owner, AST_CAUSE_NORMAL_CLEARING); else ast_log(LOG_WARNING, "Canceling a threeway channel without owner\n"); return; @@ -2368,7 +2368,7 @@ /* start switch */ if (ast_pthread_create(&t, NULL, unistim_ss, c)) { display_last_error("Unable to create switch thread"); - ast_queue_hangup(c, AST_CAUSE_SWITCH_CONGESTION); + ast_queue_hangup_with_cause(c, AST_CAUSE_SWITCH_CONGESTION); } } else ast_log(LOG_WARNING, "Unable to create channel for %s@%s\n", Index: channels/chan_local.c =================================================================== --- channels/chan_local.c (revision 116882) +++ channels/chan_local.c (working copy) @@ -537,9 +537,12 @@ { struct local_pvt *p = ast->tech_pvt; int isoutbound; - struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP, .seqno = ast->hangupcause }; + struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP }; struct ast_channel *ochan = NULL; int glaredetect = 0, res = 0; + // because data/data_int is an anonymous member, we cannot set it at declaration + // that's why we initialize it after declaring f + f.data_int = ast->hangupcause; if (!p) return -1; Index: channels/chan_gtalk.c =================================================================== --- channels/chan_gtalk.c (revision 116882) +++ channels/chan_gtalk.c (working copy) @@ -620,7 +620,7 @@ ast_getformatname_multiple(s2, BUFSIZ, tmp->peercapability), ast_getformatname_multiple(s3, BUFSIZ, tmp->jointcapability)); /* close session if capabilities don't match */ - ast_queue_hangup(tmp->owner, -1); + ast_queue_hangup_with_cause(tmp->owner, -1); return -1; @@ -749,7 +749,7 @@ if (tmp) { tmp->alreadygone = 1; if (tmp->owner) - ast_queue_hangup(tmp->owner, -1); + ast_queue_hangup_with_cause(tmp->owner, -1); } else ast_log(LOG_NOTICE, "Whoa, didn't find call!\n"); gtalk_response(client, from, pak, NULL, NULL); Index: apps/app_alarmreceiver.c =================================================================== --- apps/app_alarmreceiver.c (revision 116882) +++ apps/app_alarmreceiver.c (working copy) @@ -252,8 +252,8 @@ /* If they hung up, leave */ if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) { - if (f->seqno) { - chan->hangupcause = f->seqno; + if (f->data_int) { + chan->hangupcause = f->data_int; } ast_frfree(f); res = -1; Index: apps/app_milliwatt.c =================================================================== --- apps/app_milliwatt.c (revision 116882) +++ apps/app_milliwatt.c (working copy) @@ -61,9 +61,9 @@ .frametype = AST_FRAME_VOICE, .subclass = AST_FORMAT_ULAW, .offset = AST_FRIENDLY_OFFSET, - .data = buf + AST_FRIENDLY_OFFSET, .src = __FUNCTION__, }; + wf.data = buf + AST_FRIENDLY_OFFSET; /* Instead of len, use samples, because channel.c generator_force * generate(chan, tmp, 0, 160) ignores len. In any case, len is Index: apps/app_dial.c =================================================================== --- apps/app_dial.c (revision 116882) +++ apps/app_dial.c (working copy) @@ -789,8 +789,9 @@ strcpy(pa->status, "CANCEL"); ast_cdr_noanswer(in->cdr); if (f) { - if (f->seqno) - in->hangupcause = f->seqno; + if (f->data_int) { + in->hangupcause = f->data_int; + } ast_frfree(f); } return NULL; Index: apps/app_disa.c =================================================================== --- apps/app_disa.c (revision 116882) +++ apps/app_disa.c (working copy) @@ -195,8 +195,8 @@ } if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) { - if (f->seqno) - chan->hangupcause = f->seqno; + if (f->data_int) + chan->hangupcause = f->data_int; ast_frfree(f); ast_clear_flag(chan, AST_FLAG_END_DTMF_ONLY); return -1; Index: apps/app_externalivr.c =================================================================== --- apps/app_externalivr.c (revision 116882) +++ apps/app_externalivr.c (working copy) @@ -566,8 +566,8 @@ } else if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) { ast_chan_log(LOG_NOTICE, chan, "Got AST_CONTROL_HANGUP\n"); send_eivr_event(eivr_events, 'H', NULL, chan); - if (f->seqno) { - chan->hangupcause = f->seqno; + if (f->data_int) { + chan->hangupcause = f->data_int; } ast_frfree(f); res = -1; Index: apps/app_queue.c =================================================================== --- apps/app_queue.c (revision 116882) +++ apps/app_queue.c (working copy) @@ -2648,8 +2648,9 @@ /* Got hung up */ *to = -1; if (f) { - if (f->seqno) - in->hangupcause = f->seqno; + if (f->data_int) { + in->hangupcause = f->data_int; + } ast_frfree(f); } return NULL; Index: apps/app_followme.c =================================================================== --- apps/app_followme.c (revision 116882) +++ apps/app_followme.c (working copy) @@ -607,8 +607,8 @@ switch(f->subclass) { case AST_CONTROL_HANGUP: ast_verb(3, "%s received a hangup frame.\n", winner->name); - if (f->seqno) { - winner->hangupcause = f->seqno; + if (f->data_int) { + winner->hangupcause = f->data_int; } if (dg == 0) { ast_verb(3, "The calling channel hungup. Need to drop everyone else.\n"); Index: include/asterisk/channel.h =================================================================== --- include/asterisk/channel.h (revision 116882) +++ include/asterisk/channel.h (working copy) @@ -731,8 +731,17 @@ * * \note The channel does not need to be locked before calling this function. */ -int ast_queue_hangup(struct ast_channel *chan, int cause); +int ast_queue_hangup(struct ast_channel *chan); +/*! + * \brief Queue a hangup frame with hangupcause set + * + * \note The channel does not need to be locked before calling this function. + * \param chan channel to queue frame onto + * \param cause the hangup cause + */ +int ast_queue_hangup_with_cause(struct ast_channel *chan, int cause); + /*! * \brief Queue a control frame with payload * Index: include/asterisk/frame.h =================================================================== --- include/asterisk/frame.h (revision 116882) +++ include/asterisk/frame.h (working copy) @@ -156,7 +156,7 @@ /*! Optional source of frame for debugging */ const char *src; /*! Pointer to actual data */ - void *data; + union { void *data; int data_int; }; /*! Global delivery time */ struct timeval delivery; /*! For placing in a linked list */ Index: main/channel.c =================================================================== --- main/channel.c (revision 116882) +++ main/channel.c (working copy) @@ -1007,18 +1007,30 @@ } /*! \brief Queue a hangup frame for channel */ -int ast_queue_hangup(struct ast_channel *chan, int cause) +int ast_queue_hangup(struct ast_channel *chan) { struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP }; + /* Yeah, let's not change a lock-critical value without locking */ + if (!ast_channel_trylock(chan)) { + chan->_softhangup |= AST_SOFTHANGUP_DEV; + ast_channel_unlock(chan); + } + return ast_queue_frame(chan, &f); +} +/*! \brief Queue a hangup frame for channel */ +int ast_queue_hangup_with_cause(struct ast_channel *chan, int cause) +{ + struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP }; + if (cause >= 0) - f.seqno = cause; + f.data_int = cause; /* Yeah, let's not change a lock-critical value without locking */ if (!ast_channel_trylock(chan)) { chan->_softhangup |= AST_SOFTHANGUP_DEV; if (cause < 0) - f.seqno = chan->hangupcause; + f.data_int = chan->hangupcause; ast_channel_unlock(chan); } @@ -2428,7 +2440,7 @@ /* Interpret hangup and return NULL */ /* XXX why not the same for frames from the channel ? */ if (f->frametype == AST_FRAME_CONTROL && f->subclass == AST_CONTROL_HANGUP) { - cause = f->seqno; + cause = f->data_int; ast_frfree(f); f = NULL; } @@ -4872,10 +4884,10 @@ struct ast_frame frame = { .frametype = AST_FRAME_VOICE, .subclass = AST_FORMAT_SLINEAR, - .data = buf, .samples = samples, .datalen = sizeof(buf), }; + frame.data = buf; memset(buf, 0, sizeof(buf)); Index: main/app.c =================================================================== --- main/app.c (revision 116882) +++ main/app.c (working copy) @@ -337,10 +337,10 @@ struct ast_frame f = { .frametype = AST_FRAME_VOICE, .subclass = AST_FORMAT_SLINEAR, - .data = buf + AST_FRIENDLY_OFFSET / 2, .offset = AST_FRIENDLY_OFFSET, }; int res; + f.data = buf + AST_FRIENDLY_OFFSET / 2; len = samples * 2; if (len > sizeof(buf) - AST_FRIENDLY_OFFSET) { Index: main/audiohook.c =================================================================== --- main/audiohook.c (revision 116882) +++ main/audiohook.c (working copy) @@ -158,10 +158,10 @@ struct ast_frame frame = { .frametype = AST_FRAME_VOICE, .subclass = AST_FORMAT_SLINEAR, - .data = buf, .datalen = sizeof(buf), .samples = samples, }; + frame.data = buf; /* Ensure the factory is able to give us the samples we want */ if (samples > ast_slinfactory_available(factory)) @@ -185,10 +185,10 @@ struct ast_frame frame = { .frametype = AST_FRAME_VOICE, .subclass = AST_FORMAT_SLINEAR, - .data = NULL, .datalen = sizeof(buf1), .samples = samples, }; + frame.data = NULL; /* Make sure both factories have the required samples */ usable_read = (ast_slinfactory_available(&audiohook->read_factory) >= samples ? 1 : 0); Index: codecs/codec_resample.c =================================================================== --- codecs/codec_resample.c (revision 116882) +++ codecs/codec_resample.c (working copy) @@ -168,8 +168,8 @@ .datalen = sizeof(slin16_slin8_ex), .samples = sizeof(slin16_slin8_ex) / sizeof(slin16_slin8_ex[0]), .src = __PRETTY_FUNCTION__, - .data = slin16_slin8_ex, }; + f.data = slin16_slin8_ex; return &f; } @@ -182,8 +182,8 @@ .datalen = sizeof(slin8_slin16_ex), .samples = sizeof(slin8_slin16_ex) / sizeof(slin8_slin16_ex[0]), .src = __PRETTY_FUNCTION__, - .data = slin8_slin16_ex, }; + f.data = slin8_slin16_ex; return &f; } Index: codecs/codec_g722.c =================================================================== --- codecs/codec_g722.c (revision 116882) +++ codecs/codec_g722.c (working copy) @@ -140,8 +140,8 @@ .datalen = sizeof(g722_slin_ex), .samples = sizeof(g722_slin_ex) * 2, .src = __PRETTY_FUNCTION__, - .data = g722_slin_ex, }; + f.data = g722_slin_ex; return &f; } @@ -154,8 +154,8 @@ .datalen = sizeof(g722_slin_ex), .samples = sizeof(g722_slin_ex) * 2, .src = __PRETTY_FUNCTION__, - .data = g722_slin_ex, }; + f.data = g722_slin_ex; return &f; } @@ -168,8 +168,8 @@ .datalen = sizeof(slin_g722_ex), .samples = sizeof(slin_g722_ex) / sizeof(slin_g722_ex[0]), .src = __PRETTY_FUNCTION__, - .data = slin_g722_ex, }; + f.data = slin_g722_ex; return &f; } @@ -182,8 +182,8 @@ .datalen = sizeof(slin_g722_ex), .samples = sizeof(slin_g722_ex) / sizeof(slin_g722_ex[0]), .src = __PRETTY_FUNCTION__, - .data = slin_g722_ex, }; + f.data = slin_g722_ex; return &f; } Index: codecs/codec_g726.c =================================================================== --- codecs/codec_g726.c (revision 116882) +++ codecs/codec_g726.c (working copy) @@ -794,8 +794,8 @@ .datalen = sizeof(g726_slin_ex), .samples = sizeof(g726_slin_ex) * 2, /* 2 samples per byte */ .src = __PRETTY_FUNCTION__, - .data = g726_slin_ex, }; + f.data = g726_slin_ex; return &f; } @@ -808,8 +808,8 @@ .datalen = sizeof(slin_g726_ex), .samples = sizeof(slin_g726_ex) / 2, /* 1 sample per 2 bytes */ .src = __PRETTY_FUNCTION__, - .data = slin_g726_ex, }; + f.data = slin_g726_ex; return &f; }