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) {
}
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;