diff options
author | Kevin P. Fleming <kpfleming@digium.com> | 2009-06-16 18:54:30 +0000 |
---|---|---|
committer | Kevin P. Fleming <kpfleming@digium.com> | 2009-06-16 18:54:30 +0000 |
commit | 4c0265664ef7cf65a193486bd29b09ee80532f25 (patch) | |
tree | 1dd57b8b026f8601093e89d231d739594d6b7288 /apps | |
parent | 10ea4910e708eb912395b9fa137dbac2e7868950 (diff) |
Merged revisions 200991 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r200991 | kpfleming | 2009-06-16 12:05:38 -0500 (Tue, 16 Jun 2009) | 11 lines
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: https://origsvn.digium.com/svn/asterisk/trunk@201056 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_chanspy.c | 18 | ||||
-rw-r--r-- | apps/app_meetme.c | 15 | ||||
-rw-r--r-- | apps/app_mixmonitor.c | 13 |
3 files changed, 31 insertions, 15 deletions
diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c index 2961cc57e..98516cd89 100644 --- a/apps/app_chanspy.c +++ b/apps/app_chanspy.c @@ -410,7 +410,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 = NULL; + struct ast_frame *f, *cur; ast_audiohook_lock(&csth->spy_audiohook); if (csth->spy_audiohook.status != AST_AUDIOHOOK_STATUS_RUNNING) { @@ -426,14 +426,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.ptr, f->datalen) < 0) { - ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno)); + if (csth->fd) { + if (write(csth->fd, cur->data.ptr, 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 201d30830..bfb61a399 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -3269,9 +3269,18 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c } } if (conf->transframe[idx]) { - if (conf->transframe[idx]->frametype != AST_FRAME_NULL) { - if (can_write(chan, confflags) && ast_write(chan, conf->transframe[idx])) { - ast_log(LOG_WARNING, "Unable to write frame to channel %s\n", chan->name); + if ((conf->transframe[idx]->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[idx]; 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 { diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c index d4b8519cb..add8e5109 100644 --- a/apps/app_mixmonitor.c +++ b/apps/app_mixmonitor.c @@ -223,10 +223,15 @@ static void *mixmonitor_thread(void *obj) errflag = 1; } } - - /* Write out 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); + } + } } /* All done! free it. */ ast_frame_free(fr, 0); |