diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 23494e0162..2a92c8eb8c 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -9590,45 +9590,59 @@ static int my_dahdi_write(struct dahdi_pvt *p, unsigned char *buf, int len, int static int dahdi_write(struct ast_channel *ast, struct ast_frame *frame) { - struct dahdi_pvt *p = ast_channel_tech_pvt(ast); + struct dahdi_pvt *p; int res; int idx; - idx = dahdi_get_index(ast, p, 0); - if (idx < 0) { - ast_log(LOG_WARNING, "%s doesn't really exist?\n", ast_channel_name(ast)); - return -1; - } /* Write a frame of (presumably voice) data */ if (frame->frametype != AST_FRAME_VOICE) { - if (frame->frametype != AST_FRAME_IMAGE) - ast_log(LOG_WARNING, "Don't know what to do with frame type '%u'\n", frame->frametype); + if (frame->frametype != AST_FRAME_IMAGE) { + ast_log(LOG_WARNING, "Don't know what to do with frame type '%u'\n", + frame->frametype); + } return 0; } if ((frame->subclass.format.id != AST_FORMAT_SLINEAR) && (frame->subclass.format.id != AST_FORMAT_ULAW) && (frame->subclass.format.id != AST_FORMAT_ALAW)) { - ast_log(LOG_WARNING, "Cannot handle frames in %s format\n", ast_getformatname(&frame->subclass.format)); + ast_log(LOG_WARNING, "Cannot handle frames in %s format\n", + ast_getformatname(&frame->subclass.format)); return -1; } + + /* Return if it's not valid data */ + if (!frame->data.ptr || !frame->datalen) { + return 0; + } + + p = ast_channel_tech_pvt(ast); + ast_mutex_lock(&p->lock); + + idx = dahdi_get_index(ast, p, 0); + if (idx < 0) { + ast_mutex_unlock(&p->lock); + ast_log(LOG_WARNING, "%s doesn't really exist?\n", ast_channel_name(ast)); + return -1; + } + if (p->dialing) { + ast_mutex_unlock(&p->lock); ast_debug(5, "Dropping frame since I'm still dialing on %s...\n", ast_channel_name(ast)); return 0; } if (!p->owner) { + ast_mutex_unlock(&p->lock); ast_debug(5, "Dropping frame since there is no active owner on %s...\n", ast_channel_name(ast)); return 0; } if (p->cidspill) { + ast_mutex_unlock(&p->lock); ast_debug(5, "Dropping frame since I've still got a callerid spill on %s...\n", ast_channel_name(ast)); return 0; } - /* Return if it's not valid data */ - if (!frame->data.ptr || !frame->datalen) - return 0; if (frame->subclass.format.id == AST_FORMAT_SLINEAR) { if (!p->subs[idx].linear) { @@ -9648,6 +9662,7 @@ static int dahdi_write(struct ast_channel *ast, struct ast_frame *frame) } res = my_dahdi_write(p, (unsigned char *)frame->data.ptr, frame->datalen, idx, 0); } + ast_mutex_unlock(&p->lock); if (res < 0) { ast_log(LOG_WARNING, "write failed: %s\n", strerror(errno)); return -1;