diff --git a/channel.c b/channel.c index 921849f34b44cfe9e2e8456b599a30a40117fe8d..8b5088dc8cc5a7a7fcab7dcf0b0f3eba8fc8e723 100644 --- a/channel.c +++ b/channel.c @@ -1933,12 +1933,10 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio) } /* Clear the exception flag */ ast_clear_flag(chan, AST_FLAG_EXCEPTION); - } else { - if (chan->tech->read) - f = chan->tech->read(chan); - else - ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name); - } + } else if (chan->tech->read) + f = chan->tech->read(chan); + else + ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name); } if (f) { @@ -2017,10 +2015,8 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio) } } - if (chan->readtrans) { - if (!(f = ast_translate(chan->readtrans, f, 1))) - f = &ast_null_frame; - } + if (chan->readtrans && (f = ast_translate(chan->readtrans, f, 1)) == NULL) + f = &ast_null_frame; /* Run generator sitting on the line if timing device not available * and synchronous generation of outgoing frames is necessary */ @@ -2113,7 +2109,9 @@ int ast_indicate(struct ast_channel *chan, int condition) * Device does not support (that) indication, lets fake * it by doing our own tone generation. (PM2002) */ - if (condition >= 0) { + if (condition < 0) + ast_playtones_stop(chan); + else { const struct tone_zone_sound *ts = NULL; switch (condition) { case AST_CONTROL_RINGING: @@ -2146,7 +2144,6 @@ int ast_indicate(struct ast_channel *chan, int condition) res = -1; } } - else ast_playtones_stop(chan); } return res; } @@ -2284,6 +2281,7 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr) { int res = -1; struct ast_frame *f = NULL; + /* Stop if we're a zombie or need a soft hangup */ ast_channel_lock(chan); if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) { @@ -2291,12 +2289,10 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr) return -1; } /* Handle any pending masquerades */ - if (chan->masq) { - if (ast_do_masquerade(chan)) { - ast_log(LOG_WARNING, "Failed to perform masquerade\n"); - ast_channel_unlock(chan); - return -1; - } + if (chan->masq && ast_do_masquerade(chan)) { + ast_log(LOG_WARNING, "Failed to perform masquerade\n"); + ast_channel_unlock(chan); + return -1; } if (chan->masqr) { ast_channel_unlock(chan); @@ -2320,16 +2316,12 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr) ast_log(LOG_WARNING, "Don't know how to handle control frames yet\n"); break; case AST_FRAME_DTMF_BEGIN: - if (chan->tech->send_digit_begin) - res = chan->tech->send_digit_begin(chan, fr->subclass); - else - res = 0; + res = (chan->tech->send_digit_begin == NULL) ? 0 : + chan->tech->send_digit_begin(chan, fr->subclass); break; case AST_FRAME_DTMF_END: - if (chan->tech->send_digit_end) - res = chan->tech->send_digit_end(chan); - else - res = 0; + res = (chan->tech->send_digit_end == NULL) ? 0 : + chan->tech->send_digit_end(chan); break; case AST_FRAME_DTMF: ast_clear_flag(chan, AST_FLAG_BLOCKING); @@ -2339,33 +2331,32 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr) CHECK_BLOCKING(chan); break; case AST_FRAME_TEXT: - if (chan->tech->send_text) - res = chan->tech->send_text(chan, (char *) fr->data); - else - res = 0; + res = (chan->tech->send_text == NULL) ? 0 : + chan->tech->send_text(chan, (char *) fr->data); break; case AST_FRAME_HTML: - if (chan->tech->send_html) - res = chan->tech->send_html(chan, fr->subclass, (char *) fr->data, fr->datalen); - else - res = 0; + res = (chan->tech->send_html == NULL) ? 0 : + chan->tech->send_html(chan, fr->subclass, (char *) fr->data, fr->datalen); break; case AST_FRAME_VIDEO: /* XXX Handle translation of video codecs one day XXX */ - if (chan->tech->write_video) - res = chan->tech->write_video(chan, fr); - else - res = 0; + res = (chan->tech->write_video == NULL) ? 0 : + chan->tech->write_video(chan, fr); break; case AST_FRAME_VOICE: - if (chan->tech->write) { + if (chan->tech->write == NULL) + break; + + /* XXX need to reindent this block */ /* Bypass translator if we're writing format in the raw write format. This allows mixing of native / non-native formats */ if (fr->subclass == chan->rawwriteformat) f = fr; else f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr; - if (f) { + if (f == NULL) { + res = 0; + } else { if (chan->spies) queue_frame_to_spies(chan, f, SPY_WRITE); @@ -2394,12 +2385,11 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr) } res = chan->tech->write(chan, f); - } else - res = 0; - } + } + break; } - if (f && (f != fr)) + if (f && f != fr) ast_frfree(f); ast_clear_flag(chan, AST_FLAG_BLOCKING); /* Consider a write failure to force a soft hangup */