|
|
@ -79,9 +79,10 @@ static int careful_write(int fd, unsigned char *data, int len)
|
|
|
|
if (errno != EAGAIN) {
|
|
|
|
if (errno != EAGAIN) {
|
|
|
|
ast_log(LOG_WARNING, "Failed to write audio data to conference: %s\n", strerror(errno));
|
|
|
|
ast_log(LOG_WARNING, "Failed to write audio data to conference: %s\n", strerror(errno));
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
} else
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
len -= res;
|
|
|
|
len -= res;
|
|
|
|
data += res;
|
|
|
|
data += res;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -204,19 +205,17 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
|
|
|
goto zapretry;
|
|
|
|
goto zapretry;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f = ast_read(c);
|
|
|
|
f = ast_read(c);
|
|
|
|
if (!f)
|
|
|
|
if (!f) {
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
if (f->frametype == AST_FRAME_DTMF) {
|
|
|
|
if (f->frametype == AST_FRAME_DTMF) {
|
|
|
|
if (f->subclass == '#') {
|
|
|
|
if (f->subclass == '#') {
|
|
|
|
ret = 0;
|
|
|
|
ret = 0;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} else if (f->subclass == '*') {
|
|
|
|
else if (f->subclass == '*') {
|
|
|
|
|
|
|
|
ret = -1;
|
|
|
|
ret = -1;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
input[ic++] = f->subclass;
|
|
|
|
input[ic++] = f->subclass;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ic == 3) {
|
|
|
|
if (ic == 3) {
|
|
|
@ -233,10 +232,11 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
|
|
|
if (f->subclass == AST_FORMAT_ULAW) {
|
|
|
|
if (f->subclass == AST_FORMAT_ULAW) {
|
|
|
|
/* Carefully write */
|
|
|
|
/* Carefully write */
|
|
|
|
careful_write(fd, f->data, f->datalen);
|
|
|
|
careful_write(fd, f->data, f->datalen);
|
|
|
|
} else
|
|
|
|
} else {
|
|
|
|
ast_log(LOG_WARNING, "Huh? Got a non-ulaw (%d) frame in the conference\n", f->subclass);
|
|
|
|
ast_log(LOG_WARNING, "Huh? Got a non-ulaw (%d) frame in the conference\n", f->subclass);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
ast_frfree(f);
|
|
|
|
ast_frfree(f);
|
|
|
|
} else if (outfd > -1) {
|
|
|
|
} else if (outfd > -1) {
|
|
|
|
res = read(outfd, buf, CONF_SIZE);
|
|
|
|
res = read(outfd, buf, CONF_SIZE);
|
|
|
@ -252,15 +252,17 @@ static int conf_run(struct ast_channel *chan, int confno, int confflags)
|
|
|
|
ast_log(LOG_WARNING, "Unable to write frame to channel: %s\n", strerror(errno));
|
|
|
|
ast_log(LOG_WARNING, "Unable to write frame to channel: %s\n", strerror(errno));
|
|
|
|
/* break; */
|
|
|
|
/* break; */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
} else {
|
|
|
|
ast_log(LOG_WARNING, "Failed to read frame: %s\n", strerror(errno));
|
|
|
|
ast_log(LOG_WARNING, "Failed to read frame: %s\n", strerror(errno));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (f)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (f) {
|
|
|
|
ast_frfree(f);
|
|
|
|
ast_frfree(f);
|
|
|
|
if (fd != chan->fds[0])
|
|
|
|
}
|
|
|
|
|
|
|
|
if (fd != chan->fds[0]) {
|
|
|
|
close(fd);
|
|
|
|
close(fd);
|
|
|
|
else {
|
|
|
|
} else {
|
|
|
|
/* Take out of conference */
|
|
|
|
/* Take out of conference */
|
|
|
|
/* Add us to the conference */
|
|
|
|
/* Add us to the conference */
|
|
|
|
ztc.chan = 0;
|
|
|
|
ztc.chan = 0;
|
|
|
@ -316,8 +318,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
|
|
|
|
|
|
|
tempchan = ichan ? ichan : ast_channel_walk_locked(tempchan);
|
|
|
|
tempchan = ichan ? ichan : ast_channel_walk_locked(tempchan);
|
|
|
|
|
|
|
|
|
|
|
|
if ( !tempchan && !lastchan )
|
|
|
|
if (!tempchan && !lastchan) {
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (tempchan && search_group) {
|
|
|
|
if (tempchan && search_group) {
|
|
|
|
const char *mygroup;
|
|
|
|
const char *mygroup;
|
|
|
@ -340,10 +343,13 @@ static int conf_exec(struct ast_channel *chan, void *data)
|
|
|
|
ast_stopstream(chan);
|
|
|
|
ast_stopstream(chan);
|
|
|
|
ast_say_number(chan, confno, AST_DIGIT_ANY, chan->language, (char *) NULL);
|
|
|
|
ast_say_number(chan, confno, AST_DIGIT_ANY, chan->language, (char *) NULL);
|
|
|
|
res = conf_run(chan, confno, confflags);
|
|
|
|
res = conf_run(chan, confno, confflags);
|
|
|
|
if (res<0) break;
|
|
|
|
if (res < 0) {
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
input = res;
|
|
|
|
input = res;
|
|
|
|
} else if (tempchan)
|
|
|
|
} else if (tempchan) {
|
|
|
|
ast_channel_unlock(tempchan);
|
|
|
|
ast_channel_unlock(tempchan);
|
|
|
|
|
|
|
|
}
|
|
|
|
lastchan = tempchan;
|
|
|
|
lastchan = tempchan;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
return res;
|
|
|
|