diff options
author | Mark Spencer <markster@digium.com> | 2003-04-03 07:37:30 +0000 |
---|---|---|
committer | Mark Spencer <markster@digium.com> | 2003-04-03 07:37:30 +0000 |
commit | 2d5b51e3b0b0510ae3fb966e1fceaf350c5ac006 (patch) | |
tree | f246c3821894bf87dc93ab78f75145591ef40cf2 /file.c | |
parent | 9b675251440b5b7a7a2ec742098c10185fbb62d0 (diff) |
Add fast-forward and rewind to voicemail
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@741 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'file.c')
-rwxr-xr-x | file.c | 59 |
1 files changed, 59 insertions, 0 deletions
@@ -659,6 +659,65 @@ char ast_waitstream(struct ast_channel *c, char *breakon) return (c->_softhangup ? -1 : 0); } +char ast_waitstream_fr(struct ast_channel *c, char *breakon, char *forward, char *rewind) +{ + int res; + struct ast_frame *fr; + while(c->stream) { + res = ast_sched_wait(c->sched); + if (res < 0) { + ast_closestream(c->stream); + break; + } + res = ast_waitfor(c, res); + if (res < 0) { + ast_log(LOG_WARNING, "Select failed (%s)\n", strerror(errno)); + return res; + } else + if (res > 0) { + fr = ast_read(c); + if (!fr) { +#if 0 + ast_log(LOG_DEBUG, "Got hung up\n"); +#endif + return -1; + } + + switch(fr->frametype) { + case AST_FRAME_DTMF: + res = fr->subclass; + if (strchr(forward,res)) { + ast_stream_fastforward(c->stream, 3000); + } else if (strchr(rewind,res)) { + ast_stream_rewind(c->stream, 3000); + } else if (strchr(breakon, res)) { + ast_frfree(fr); + return res; + } + break; + case AST_FRAME_CONTROL: + switch(fr->subclass) { + case AST_CONTROL_HANGUP: + ast_frfree(fr); + return -1; + case AST_CONTROL_RINGING: + case AST_CONTROL_ANSWER: + /* Unimportant */ + break; + default: + ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", fr->subclass); + } + } + /* Ignore */ + ast_frfree(fr); + } else + ast_sched_runq(c->sched); + + + } + return (c->_softhangup ? -1 : 0); +} + char ast_waitstream_full(struct ast_channel *c, char *breakon, int audiofd, int cmdfd) { int res; |