aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_misdn.c
diff options
context:
space:
mode:
Diffstat (limited to 'channels/chan_misdn.c')
-rw-r--r--channels/chan_misdn.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index aa1207ceb..4631fa5e6 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -2352,7 +2352,6 @@ static int tone_indicate( struct chan_list *cl, enum tone_e tone)
break;
case TONE_FILE:
break;
-
case TONE_NONE:
chan_misdn_log(3,cl->bc->port," --> None\n");
misdn_lib_tone_generator_stop(cl->bc);
@@ -3285,7 +3284,6 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
ast_queue_frame(ch->ast, &fr);
}
-
}
}
break;
@@ -3694,7 +3692,7 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples);
chan_misdn_log(9,bc->port,"TONE_GEN: len:%d\n");
-
+
if (!ast->generator) break;
tmp = ast->generatordata;
@@ -3702,13 +3700,13 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
generate = ast->generator->generate;
res = generate(ast, tmp, tone_len, tone_len);
ast->generatordata = tmp;
+
if (res) {
ast_log(LOG_WARNING, "Auto-deactivating generator\n");
ast_deactivate_generator(ast);
} else {
bc->tone_cnt=0;
}
-
}
break;
@@ -3728,10 +3726,35 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
ast_queue_frame(ch->ast,&frame);
} else {
- int ret=write(ch->pipe[1], bc->bframe, bc->bframe_len);
+ fd_set wrfs;
+ struct timeval tv;
+ tv.tv_sec=0;
+ tv.tv_usec=0;
+
+
+ FD_ZERO(&wrfs);
+ FD_SET(ch->pipe[1],&wrfs);
+
+ int t=select(FD_SETSIZE,NULL,&wrfs,NULL,&tv);
- if (ret<=0) {
- chan_misdn_log(1, bc->port, "Write returned <=0 (err=%s)\n",strerror(errno));
+ if (!t) {
+ chan_misdn_log(9, bc->port, "Select Timed out\n");
+ break;
+ }
+
+ if (t<0) {
+ chan_misdn_log(-1, bc->port, "Select Error (err=%s)\n",strerror(errno));
+ break;
+ }
+
+ if (FD_ISSET(ch->pipe[1],&wrfs)) {
+ int ret=write(ch->pipe[1], bc->bframe, bc->bframe_len);
+
+ if (ret<=0) {
+ chan_misdn_log(-1, bc->port, "Write returned <=0 (err=%s)\n",strerror(errno));
+ }
+ } else {
+ chan_misdn_log(1, bc->port, "Wripe Pipe full!\n");
}
}
}