aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2001-03-10 19:12:11 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2001-03-10 19:12:11 +0000
commitdc884645e6463fb181af816fdea3599713b0bd87 (patch)
treec16bdd5583e05977a7893075e3b541e1a3afa073 /apps
parentea452d3fd8f99256d987297e5afa8d1c226b465e (diff)
Version 0.1.7 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@236 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rwxr-xr-xapps/app_intercom.c73
-rwxr-xr-xapps/app_mp3.c149
-rwxr-xr-xapps/app_voicemail.c7
3 files changed, 124 insertions, 105 deletions
diff --git a/apps/app_intercom.c b/apps/app_intercom.c
index 97b427ba1..a50b533a2 100755
--- a/apps/app_intercom.c
+++ b/apps/app_intercom.c
@@ -116,48 +116,48 @@ static int intercom_exec(struct ast_channel *chan, void *data)
int res = 0;
struct localuser *u;
struct ast_frame *f;
- struct ast_channel *trans;
+ int oreadformat;
if (!data) {
ast_log(LOG_WARNING, "Playback requires an argument (filename)\n");
return -1;
}
LOCAL_USER_ADD(u);
- /* See if we need a translator */
- if (!(chan->format & AST_FORMAT_SLINEAR))
- trans = ast_translator_create(chan, AST_FORMAT_SLINEAR, AST_DIRECTION_IN);
- else
- trans = chan;
- if (trans) {
- /* Read packets from the channel */
- while(!res) {
- res = ast_waitfor(trans, -1);
- if (res > 0) {
- res = 0;
- f = ast_read(trans);
- if (f) {
- if (f->frametype == AST_FRAME_DTMF) {
- ast_frfree(f);
- break;
- } else {
- if (f->frametype == AST_FRAME_VOICE) {
- if (f->subclass == AST_FORMAT_SLINEAR) {
- res = write_audio(f->data, f->datalen);
- if (res > 0)
- res = 0;
- } else
- ast_log(LOG_DEBUG, "Unable to handle non-signed linear frame (%d)\n", f->subclass);
- }
- }
+ /* Remember original read format */
+ oreadformat = chan->readformat;
+ /* Set mode to signed linear */
+ res = ast_set_read_format(chan, AST_FORMAT_SLINEAR);
+ if (res < 0) {
+ ast_log(LOG_WARNING, "Unable to set format to signed linear on channel %s\n", chan->name);
+ return -1;
+ }
+ /* Read packets from the channel */
+ while(!res) {
+ res = ast_waitfor(chan, -1);
+ if (res > 0) {
+ res = 0;
+ f = ast_read(chan);
+ if (f) {
+ if (f->frametype == AST_FRAME_DTMF) {
ast_frfree(f);
- } else
- res = -1;
- }
+ break;
+ } else {
+ if (f->frametype == AST_FRAME_VOICE) {
+ if (f->subclass == AST_FORMAT_SLINEAR) {
+ res = write_audio(f->data, f->datalen);
+ if (res > 0)
+ res = 0;
+ } else
+ ast_log(LOG_DEBUG, "Unable to handle non-signed linear frame (%d)\n", f->subclass);
+ }
+ }
+ ast_frfree(f);
+ } else
+ res = -1;
}
- if (trans != chan)
- ast_translator_destroy(trans);
- } else
- ast_log(LOG_WARNING, "Unable to build translator to signed linear format on '%s'\n", chan->name);
+ }
LOCAL_USER_REMOVE(u);
+ if (!res)
+ ast_set_read_format(chan, oreadformat);
return res;
}
@@ -187,3 +187,8 @@ int usecount(void)
STANDARD_USECOUNT(res);
return res;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/apps/app_mp3.c b/apps/app_mp3.c
index a7e53cff2..7b49dc172 100755
--- a/apps/app_mp3.c
+++ b/apps/app_mp3.c
@@ -59,12 +59,13 @@ static int mp3_exec(struct ast_channel *chan, void *data)
{
int res=0;
struct localuser *u;
- struct ast_channel *trans;
int fds[2];
int rfds[2];
int ms = -1;
int pid;
int us;
+ int exception;
+ int owriteformat;
struct timeval tv;
struct timeval last;
struct ast_frame *f;
@@ -85,87 +86,90 @@ static int mp3_exec(struct ast_channel *chan, void *data)
}
LOCAL_USER_ADD(u);
ast_stopstream(chan);
- if (chan->format & AST_FORMAT_SLINEAR)
- trans = chan;
- else
- trans = ast_translator_create(chan, AST_FORMAT_SLINEAR, AST_DIRECTION_OUT);
- if (trans) {
- res = mp3play((char *)data, fds[1]);
- if (res >= 0) {
- pid = res;
- /* Order is important -- there's almost always going to be mp3... we want to prioritize the
- user */
- rfds[0] = trans->fd;
- rfds[1] = fds[0];
- for (;;) {
- CHECK_BLOCKING(trans);
- res = ast_waitfor_n_fd(rfds, 2, &ms);
- trans->blocking = 0;
- if (res < 1) {
- ast_log(LOG_DEBUG, "Hangup detected\n");
+
+ owriteformat = chan->writeformat;
+ res = ast_set_write_format(chan, AST_FORMAT_SLINEAR);
+ if (res < 0) {
+ ast_log(LOG_WARNING, "Unable to set write format to signed linear\n");
+ return -1;
+ }
+
+ res = mp3play((char *)data, fds[1]);
+ if (res >= 0) {
+ pid = res;
+ /* Order is important -- there's almost always going to be mp3... we want to prioritize the
+ user */
+ rfds[0] = chan->fd;
+ rfds[1] = fds[0];
+ for (;;) {
+ CHECK_BLOCKING(chan);
+ res = ast_waitfor_n_fd(rfds, 2, &ms, &exception);
+ chan->blocking = 0;
+ if (res < 1) {
+ ast_log(LOG_DEBUG, "Hangup detected\n");
+ res = -1;
+ break;
+ } else if (res == chan->fd) {
+ if (exception)
+ chan->exception = 1;
+ f = ast_read(chan);
+ if (!f) {
+ ast_log(LOG_DEBUG, "Null frame == hangup() detected\n");
res = -1;
break;
- } else if (res == trans->fd) {
- f = ast_read(trans);
- if (!f) {
- ast_log(LOG_DEBUG, "Null frame == hangup() detected\n");
+ }
+ if (f->frametype == AST_FRAME_DTMF) {
+ ast_log(LOG_DEBUG, "User pressed a key\n");
+ ast_frfree(f);
+ res = 0;
+ break;
+ }
+ ast_frfree(f);
+ } else if (res == fds[0]) {
+ gettimeofday(&tv, NULL);
+ if (last.tv_sec || last.tv_usec) {
+ /* We should wait at least a frame length */
+ us = sizeof(myf.frdata) / 16 * 1000;
+ /* Subtract 1,000,000 us for each second late we've passed */
+ us -= (tv.tv_sec - last.tv_sec) * 1000000;
+ /* And one for each us late we've passed */
+ us -= (tv.tv_usec - last.tv_usec);
+ /* Sleep that long if needed */
+ if (us > 0)
+ usleep(us);
+ }
+ last = tv;
+ res = read(fds[0], myf.frdata, sizeof(myf.frdata));
+ if (res > 0) {
+ myf.f.frametype = AST_FRAME_VOICE;
+ myf.f.subclass = AST_FORMAT_SLINEAR;
+ myf.f.datalen = res;
+ myf.f.timelen = res / 16;
+ myf.f.mallocd = 0;
+ myf.f.offset = AST_FRIENDLY_OFFSET;
+ myf.f.src = __PRETTY_FUNCTION__;
+ myf.f.data = myf.frdata;
+ if (ast_write(chan, &myf.f) < 0) {
res = -1;
break;
}
- if (f->frametype == AST_FRAME_DTMF) {
- ast_log(LOG_DEBUG, "User pressed a key\n");
- ast_frfree(f);
- res = 0;
- break;
- }
- ast_frfree(f);
- } else if (res == fds[0]) {
- gettimeofday(&tv, NULL);
- if (last.tv_sec || last.tv_usec) {
- /* We should wait at least a frame length */
- us = sizeof(myf.frdata) / 16 * 1000;
- /* Subtract 1,000,000 us for each second late we've passed */
- us -= (tv.tv_sec - last.tv_sec) * 1000000;
- /* And one for each us late we've passed */
- us -= (tv.tv_usec - last.tv_usec);
- /* Sleep that long if needed */
- if (us > 0)
- usleep(us);
- }
- last = tv;
- res = read(fds[0], myf.frdata, sizeof(myf.frdata));
- if (res > 0) {
- myf.f.frametype = AST_FRAME_VOICE;
- myf.f.subclass = AST_FORMAT_SLINEAR;
- myf.f.datalen = res;
- myf.f.timelen = res / 16;
- myf.f.mallocd = 0;
- myf.f.offset = AST_FRIENDLY_OFFSET;
- myf.f.src = __PRETTY_FUNCTION__;
- myf.f.data = myf.frdata;
- if (ast_write(trans, &myf.f) < 0) {
- res = -1;
- break;
- }
- } else {
- ast_log(LOG_DEBUG, "No more mp3\n");
- res = 0;
- }
} else {
- ast_log(LOG_DEBUG, "HuhHHH?\n");
- res = -1;
- break;
+ ast_log(LOG_DEBUG, "No more mp3\n");
+ res = 0;
}
+ } else {
+ ast_log(LOG_DEBUG, "HuhHHH?\n");
+ res = -1;
+ break;
}
- kill(pid, SIGTERM);
}
- if (trans != chan)
- ast_translator_destroy(trans);
- } else
- ast_log(LOG_WARNING, "No translator channel available\n");
+ kill(pid, SIGTERM);
+ }
close(fds[0]);
close(fds[1]);
LOCAL_USER_REMOVE(u);
+ if (!res)
+ ast_set_write_format(chan, owriteformat);
return res;
}
@@ -191,3 +195,8 @@ int usecount(void)
STANDARD_USECOUNT(res);
return res;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 0106d6168..45a6229f1 100755
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -418,7 +418,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
ast_verbose( VERBOSE_PREFIX_3 "User '%s' logged in on channel %s with %d messages\n", username, chan->name, maxmsg);
if (!ast_streamfile(chan, "vm-instructions", chan->language)) {
for(;;) {
- if (chan->stream || (chan->trans && chan->trans->stream)) {
+ if (chan->stream) {
d = ast_waitstream(chan, AST_DIGIT_ANY);
ast_stopstream(chan);
if (!d && (state == STATE_MESSAGE_PLAYING)) {
@@ -616,3 +616,8 @@ int usecount(void)
STANDARD_USECOUNT(res);
return res;
}
+
+char *key()
+{
+ return ASTERISK_GPL_KEY;
+}