aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-16 17:05:38 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-16 17:05:38 +0000
commite972c8d38d5d5f636f4c8994145af8a1b74d50f6 (patch)
tree26e1cf51ee702a39d86ee2046568509a0ee13972 /apps
parent5661b92c46bfd27d49226c3371761999c58643d2 (diff)
Improve support for media paths that can generate multiple frames at once.
There are various media paths in Asterisk (codec translators and UDPTL, primarily) that can generate more than one frame to be generated when the application calling them expects only a single frame. This patch addresses a number of those cases, at least the primary ones to solve the known problems. In addition it removes the broken TRACE_FRAMES support, fixes a number of bugs in various frame-related API functions, and cleans up various code paths affected by these changes. https://reviewboard.asterisk.org/r/175/ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@200991 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_chanspy.c18
-rw-r--r--apps/app_meetme.c16
-rw-r--r--apps/app_mixmonitor.c11
3 files changed, 31 insertions, 14 deletions
diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c
index d95991f8a..8ccfd1a0e 100644
--- a/apps/app_chanspy.c
+++ b/apps/app_chanspy.c
@@ -171,7 +171,7 @@ static void spy_release(struct ast_channel *chan, void *data)
static int spy_generate(struct ast_channel *chan, void *data, int len, int samples)
{
struct chanspy_translation_helper *csth = data;
- struct ast_frame *f;
+ struct ast_frame *f, *cur;
ast_audiohook_lock(&csth->spy_audiohook);
if (csth->spy_audiohook.status != AST_AUDIOHOOK_STATUS_RUNNING) {
@@ -186,14 +186,16 @@ static int spy_generate(struct ast_channel *chan, void *data, int len, int sampl
if (!f)
return 0;
- if (ast_write(chan, f)) {
- ast_frfree(f);
- return -1;
- }
+ for (cur = f; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
+ if (ast_write(chan, cur)) {
+ ast_frfree(f);
+ return -1;
+ }
- if (csth->fd) {
- if (write(csth->fd, f->data, f->datalen) < 0) {
- ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
+ if (csth->fd) {
+ if (write(csth->fd, cur->data, cur->datalen) < 0) {
+ ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno));
+ }
}
}
diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index 6e35ddda5..9e6af1865 100644
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -2338,9 +2338,19 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
}
}
if (conf->transframe[index]) {
- if (conf->transframe[index]->frametype != AST_FRAME_NULL) {
- if (can_write(chan, confflags) && ast_write(chan, conf->transframe[index]))
- ast_log(LOG_WARNING, "Unable to write frame to channel %s\n", chan->name);
+ if ((conf->transframe[index]->frametype != AST_FRAME_NULL) &&
+ can_write(chan, confflags)) {
+ struct ast_frame *cur;
+
+ /* the translator may have returned a list of frames, so
+ write each one onto the channel
+ */
+ for (cur = conf->transframe[index]; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
+ if (ast_write(chan, cur)) {
+ ast_log(LOG_WARNING, "Unable to write frame to channel %s\n", chan->name);
+ break;
+ }
+ }
}
} else {
ast_mutex_unlock(&conf->listenlock);
diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c
index fc7db41d0..bf1d56a99 100644
--- a/apps/app_mixmonitor.c
+++ b/apps/app_mixmonitor.c
@@ -233,9 +233,14 @@ static void *mixmonitor_thread(void *obj)
}
}
- /* Write out the frame */
- if (fs)
- ast_writestream(fs, fr);
+ /* Write out the frame(s) */
+ if (fs) {
+ struct ast_frame *cur;
+
+ for (cur = fr; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
+ ast_writestream(fs, cur);
+ }
+ }
} else {
ast_mutex_unlock(&mixmonitor->mixmonitor_ds->lock);
}