aboutsummaryrefslogtreecommitdiffstats
path: root/res/res_agi.c
diff options
context:
space:
mode:
authorfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-26 17:43:11 +0000
committerfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-26 17:43:11 +0000
commitcb0181db21df7226ddf8e83c092f188aee7a2dc0 (patch)
tree1c0289c4fd504cabf1b47c8e75f87c7ae7f52dd1 /res/res_agi.c
parent328608aece21eaa39bf5800e4f0ae6ceab9d2b62 (diff)
Add the video stream for AGI function STREAM FILE (issue #5392 reported by areski -- minor mods by me)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@30547 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_agi.c')
-rw-r--r--res/res_agi.c90
1 files changed, 56 insertions, 34 deletions
diff --git a/res/res_agi.c b/res/res_agi.c
index d4588fa05..5fd7da33d 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -537,7 +537,9 @@ static int handle_controlstreamfile(struct ast_channel *chan, AGI *agi, int argc
static int handle_streamfile(struct ast_channel *chan, AGI *agi, int argc, char *argv[])
{
int res;
+ int vres;
struct ast_filestream *fs;
+ struct ast_filestream *vfs;
long sample_offset = 0;
long max_length;
@@ -546,16 +548,26 @@ static int handle_streamfile(struct ast_channel *chan, AGI *agi, int argc, char
if ((argc > 4) && (sscanf(argv[4], "%ld", &sample_offset) != 1))
return RESULT_SHOWUSAGE;
- fs = ast_openstream(chan, argv[2], chan->language);
- if (!fs){
+ fs = ast_openstream(chan, argv[2], chan->language);
+
+ if (!fs) {
fdprintf(agi->fd, "200 result=%d endpos=%ld\n", 0, sample_offset);
return RESULT_SUCCESS;
- }
+ }
+ vfs = ast_openvstream(chan, argv[2], chan->language);
+ if (vfs)
+ ast_log(LOG_DEBUG, "Ooh, found a video stream, too\n");
+
ast_seekstream(fs, 0, SEEK_END);
max_length = ast_tellstream(fs);
ast_seekstream(fs, sample_offset, SEEK_SET);
res = ast_applystream(chan, fs);
+ if (vfs)
+ vres = ast_applystream(chan, vfs);
res = ast_playstream(fs);
+ if (vfs)
+ vres = ast_playstream(vfs);
+
if (res) {
fdprintf(agi->fd, "200 result=%d endpos=%ld\n", res, sample_offset);
return (res >= 0) ? RESULT_SHOWUSAGE : RESULT_FAILURE;
@@ -576,10 +588,12 @@ static int handle_streamfile(struct ast_channel *chan, AGI *agi, int argc, char
/* get option - really similar to the handle_streamfile, but with a timeout */
static int handle_getoption(struct ast_channel *chan, AGI *agi, int argc, char *argv[])
{
- int res;
- struct ast_filestream *fs;
- long sample_offset = 0;
- long max_length;
+ int res;
+ int vres;
+ struct ast_filestream *fs;
+ struct ast_filestream *vfs;
+ long sample_offset = 0;
+ long max_length;
int timeout = 0;
char *edigits = NULL;
@@ -596,43 +610,51 @@ static int handle_getoption(struct ast_channel *chan, AGI *agi, int argc, char *
timeout = chan->pbx->dtimeout * 1000; /* in msec */
}
- fs = ast_openstream(chan, argv[2], chan->language);
- if (!fs){
- fdprintf(agi->fd, "200 result=%d endpos=%ld\n", 0, sample_offset);
- ast_log(LOG_WARNING, "Unable to open %s\n", argv[2]);
+ fs = ast_openstream(chan, argv[2], chan->language);
+ if (!fs) {
+ fdprintf(agi->fd, "200 result=%d endpos=%ld\n", 0, sample_offset);
+ ast_log(LOG_WARNING, "Unable to open %s\n", argv[2]);
return RESULT_SUCCESS;
- }
+ }
+ vfs = ast_openvstream(chan, argv[2], chan->language);
+ if (vfs)
+ ast_log(LOG_DEBUG, "Ooh, found a video stream, too\n");
+
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Playing '%s' (escape_digits=%s) (timeout %d)\n", argv[2], edigits, timeout);
- ast_seekstream(fs, 0, SEEK_END);
- max_length = ast_tellstream(fs);
- ast_seekstream(fs, sample_offset, SEEK_SET);
- res = ast_applystream(chan, fs);
- res = ast_playstream(fs);
- if (res) {
- fdprintf(agi->fd, "200 result=%d endpos=%ld\n", res, sample_offset);
- if (res >= 0)
- return RESULT_SHOWUSAGE;
- else
- return RESULT_FAILURE;
- }
- res = ast_waitstream_full(chan, argv[3], agi->audio, agi->ctrl);
- /* this is to check for if ast_waitstream closed the stream, we probably are at
- * the end of the stream, return that amount, else check for the amount */
- sample_offset = (chan->stream)?ast_tellstream(fs):max_length;
- ast_stopstream(chan);
- if (res == 1) {
- /* Stop this command, don't print a result line, as there is a new command */
- return RESULT_SUCCESS;
- }
+ ast_seekstream(fs, 0, SEEK_END);
+ max_length = ast_tellstream(fs);
+ ast_seekstream(fs, sample_offset, SEEK_SET);
+ res = ast_applystream(chan, fs);
+ if (vfs)
+ vres = ast_applystream(chan, vfs);
+ res = ast_playstream(fs);
+ if (vfs)
+ vres = ast_playstream(vfs);
+ if (res) {
+ fdprintf(agi->fd, "200 result=%d endpos=%ld\n", res, sample_offset);
+ if (res >= 0)
+ return RESULT_SHOWUSAGE;
+ else
+ return RESULT_FAILURE;
+ }
+ res = ast_waitstream_full(chan, argv[3], agi->audio, agi->ctrl);
+ /* this is to check for if ast_waitstream closed the stream, we probably are at
+ * the end of the stream, return that amount, else check for the amount */
+ sample_offset = (chan->stream)?ast_tellstream(fs):max_length;
+ ast_stopstream(chan);
+ if (res == 1) {
+ /* Stop this command, don't print a result line, as there is a new command */
+ return RESULT_SUCCESS;
+ }
/* If the user didnt press a key, wait for digitTimeout*/
if (res == 0 ) {
res = ast_waitfordigit_full(chan, timeout, agi->audio, agi->ctrl);
/* Make sure the new result is in the escape digits of the GET OPTION */
if ( !strchr(edigits,res) )
- res=0;
+ res=0;
}
fdprintf(agi->fd, "200 result=%d endpos=%ld\n", res, sample_offset);