Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

file.h File Reference

#include <asterisk/channel.h>
#include <asterisk/frame.h>
#include <fcntl.h>

Go to the source code of this file.

Defines

#define AST_DIGIT_ANY   "0123456789#*"
 Convenient for waiting.
#define SEEK_FORCECUR   10
#define AST_RESERVED_POINTERS   20

Functions

int ast_format_register (char *name, char *exts, int format, struct ast_filestream *(*open)(int fd), struct ast_filestream *(*rewrite)(int fd, char *comment), int(*write)(struct ast_filestream *, struct ast_frame *), int(*seek)(struct ast_filestream *, long offset, int whence), int(*trunc)(struct ast_filestream *), long(*tell)(struct ast_filestream *), struct ast_frame *(*read)(struct ast_filestream *, int *timetonext), void(*close)(struct ast_filestream *), char *(*getcomment)(struct ast_filestream *))
 Registers a new file format.
int ast_format_unregister (char *name)
 Unregisters a file format.
int ast_streamfile (struct ast_channel *c, char *filename, char *preflang)
 Streams a file.
int ast_stopstream (struct ast_channel *c)
 Stops a stream.
int ast_fileexists (char *filename, char *fmt, char *preflang)
 Checks for the existence of a given file.
int ast_filerename (char *oldname, char *newname, char *fmt)
 Renames a file.
int ast_filedelete (char *filename, char *fmt)
 Deletes a file.
int ast_filecopy (char *oldname, char *newname, char *fmt)
 Copies a file.
char ast_waitstream (struct ast_channel *c, char *breakon)
 Waits for a stream to stop or digit to be pressed.
char ast_waitstream_fr (struct ast_channel *c, char *breakon, char *forward, char *rewind, int ms)
 Same as waitstream but allows stream to be forwarded or rewound.
char ast_waitstream_full (struct ast_channel *c, char *breakon, int audiofd, int monfd)
ast_filestreamast_readfile (char *filename, char *type, char *comment, int flags, int check, mode_t mode)
 Starts reading from a file.
ast_filestreamast_writefile (char *filename, char *type, char *comment, int flags, int check, mode_t mode)
 Starts writing a file.
int ast_writestream (struct ast_filestream *fs, struct ast_frame *f)
 Writes a frame to a stream.
int ast_closestream (struct ast_filestream *f)
 Closes a stream.
ast_filestreamast_openstream (struct ast_channel *chan, char *filename, char *preflang)
 Opens stream for use in seeking, playing.
ast_filestreamast_openvstream (struct ast_channel *chan, char *filename, char *preflang)
 Opens stream for use in seeking, playing.
int ast_applystream (struct ast_channel *chan, struct ast_filestream *s)
 Applys a open stream to a channel.
int ast_playstream (struct ast_filestream *s)
 play a open stream on a channel.
int ast_seekstream (struct ast_filestream *fs, long sample_offset, int whence)
 Seeks into stream.
int ast_truncstream (struct ast_filestream *fs)
 Trunc stream at current location.
int ast_stream_fastforward (struct ast_filestream *fs, long ms)
 Fast forward stream ms.
int ast_stream_rewind (struct ast_filestream *fs, long ms)
 Rewind stream ms.
long ast_tellstream (struct ast_filestream *fs)
 Tell where we are in a stream.
ast_frameast_readframe (struct ast_filestream *s)
 Read a frame from a filestream.
int ast_file_init (void)
 Initialize file stuff.


Define Documentation

#define AST_DIGIT_ANY   "0123456789#*"
 

Convenient for waiting.

Definition at line 28 of file file.h.

Referenced by ast_play_and_wait(), ast_readstring(), and ast_readstring_full().

#define AST_RESERVED_POINTERS   20
 

Definition at line 295 of file file.h.

#define SEEK_FORCECUR   10
 

Definition at line 30 of file file.h.

Referenced by ast_read(), and ast_write().


Function Documentation

int ast_applystream struct ast_channel chan,
struct ast_filestream s
 

Applys a open stream to a channel.

Parameters:
chan channel to work
ast_filestream s to apply Returns 0 for success, -1 on failure
Definition at line 607 of file file.c.

References s.

Referenced by ast_streamfile().

00608 { 00609 s->owner = chan; 00610 return 0; 00611 }

int ast_closestream struct ast_filestream f  ) 
 

Closes a stream.

Parameters:
f filestream to close Close a playback or recording stream Returns 0 on success, -1 on failure
Definition at line 652 of file file.c.

References AST_FORMAT_MAX_AUDIO, ast_safe_system(), ast_sched_del(), ast_settimeout(), ast_translator_free_path(), ast_format::close, ast_filestream::filename, ast_filestream::fmt, ast_format::format, free, ast_filestream::owner, ast_filestream::realfilename, ast_channel::sched, ast_channel::stream, ast_channel::streamid, ast_filestream::trans, ast_channel::vstream, and ast_channel::vstreamid.

Referenced by ast_app_getvoice(), ast_hangup(), ast_play_and_prepend(), ast_play_and_record(), and ast_stopstream().

00653 { 00654 char *cmd = NULL; 00655 size_t size = 0; 00656 /* Stop a running stream if there is one */ 00657 if (f->owner) { 00658 if (f->fmt->format < AST_FORMAT_MAX_AUDIO) { 00659 f->owner->stream = NULL; 00660 if (f->owner->streamid > -1) 00661 ast_sched_del(f->owner->sched, f->owner->streamid); 00662 f->owner->streamid = -1; 00663 #ifdef ZAPTEL_OPTIMIZATIONS 00664 ast_settimeout(f->owner, 0, NULL, NULL); 00665 #endif 00666 } else { 00667 f->owner->vstream = NULL; 00668 if (f->owner->vstreamid > -1) 00669 ast_sched_del(f->owner->sched, f->owner->vstreamid); 00670 f->owner->vstreamid = -1; 00671 } 00672 } 00673 /* destroy the translator on exit */ 00674 if (f->trans) { 00675 ast_translator_free_path(f->trans); 00676 f->trans = NULL; 00677 } 00678 00679 if (f->realfilename && f->filename) { 00680 size = strlen(f->filename) + strlen(f->realfilename) + 15; 00681 cmd = alloca(size); 00682 memset(cmd,0,size); 00683 snprintf(cmd,size,"/bin/mv -f %s %s",f->filename,f->realfilename); 00684 ast_safe_system(cmd); 00685 } 00686 00687 if (f->filename) { 00688 free(f->filename); 00689 f->filename = NULL; 00690 } 00691 if (f->realfilename) { 00692 free(f->realfilename); 00693 f->realfilename = NULL; 00694 } 00695 f->fmt->close(f); 00696 return 0; 00697 }

int ast_file_init void   ) 
 

Initialize file stuff.

Initializes all the various file stuff. Basically just registers the cli stuff Returns 0 all the time Definition at line 1139 of file file.c.

References ast_cli_register(), and show_file.

Referenced by main().

01140 { 01141 ast_cli_register(&show_file); 01142 return 0; 01143 }

int ast_filecopy char *  oldname,
char *  newname,
char *  fmt
 

Copies a file.

Parameters:
oldname name of the file you wish to copy (minus extension)
newname name you wish the file to be copied to (minus extension)
fmt the format of the file Copy a given file in a given format, or if fmt is NULL, then do so for all
Definition at line 750 of file file.c.

References ACTION_COPY.

00751 { 00752 return ast_filehelper(filename, filename2, fmt, ACTION_COPY); 00753 }

int ast_filedelete char *  filename,
char *  fmt
 

Deletes a file.

Parameters:
filename name of the file you wish to delete (minus the extension)
format of the file Delete a given file in a given format, or if fmt is NULL, then do so for all
Definition at line 740 of file file.c.

References ACTION_DELETE.

Referenced by ast_play_and_prepend().

00741 { 00742 return ast_filehelper(filename, NULL, fmt, ACTION_DELETE); 00743 }

int ast_fileexists char *  filename,
char *  fmt,
char *  preflang
 

Checks for the existence of a given file.

Parameters:
filename name of the file you wish to check, minus the extension
fmt the format you wish to check (the extension)
preflang (the preferred language you wisht to find the file in) See if a given file exists in a given format. If fmt is NULL, any format is accepted. Returns -1 if file does not exist, non-zero positive otherwise.
Definition at line 700 of file file.c.

References ACTION_EXISTS, and MAX_LANGUAGE.

Referenced by ast_openstream(), and ast_openvstream().

00701 { 00702 char filename2[256]; 00703 char tmp[256]; 00704 char *postfix; 00705 char *prefix; 00706 char *c; 00707 char lang2[MAX_LANGUAGE]; 00708 int res = -1; 00709 if (preflang && !ast_strlen_zero(preflang)) { 00710 /* Insert the language between the last two parts of the path */ 00711 strncpy(tmp, filename, sizeof(tmp) - 1); 00712 c = strrchr(tmp, '/'); 00713 if (c) { 00714 *c = '\0'; 00715 postfix = c+1; 00716 prefix = tmp; 00717 } else { 00718 postfix = tmp; 00719 prefix=""; 00720 } 00721 snprintf(filename2, sizeof(filename2), "%s/%s/%s", prefix, preflang, postfix); 00722 res = ast_filehelper(filename2, NULL, fmt, ACTION_EXISTS); 00723 if (res < 1) { 00724 char *stringp=NULL; 00725 strncpy(lang2, preflang, sizeof(lang2)-1); 00726 stringp=lang2; 00727 strsep(&stringp, "_"); 00728 if (strcmp(lang2, preflang)) { 00729 snprintf(filename2, sizeof(filename2), "%s/%s/%s", prefix, lang2, postfix); 00730 res = ast_filehelper(filename2, NULL, fmt, ACTION_EXISTS); 00731 } 00732 } 00733 } 00734 if (res < 1) { 00735 res = ast_filehelper(filename, NULL, fmt, ACTION_EXISTS); 00736 } 00737 return res; 00738 }

int ast_filerename char *  oldname,
char *  newname,
char *  fmt
 

Renames a file.

Parameters:
oldname the name of the file you wish to act upon (minus the extension)
newname the name you wish to rename the file to (minus the extension)
fmt the format of the file Rename a given file in a given format, or if fmt is NULL, then do so for all Returns -1 on failure
Definition at line 745 of file file.c.

References ACTION_RENAME.

Referenced by ast_play_and_prepend().

00746 { 00747 return ast_filehelper(filename, filename2, fmt, ACTION_RENAME); 00748 }

int ast_format_register char *  name,
char *  exts,
int  format,
struct ast_filestream *(*  open)(int fd),
struct ast_filestream *(*  rewrite)(int fd, char *comment),
int(*  write)(struct ast_filestream *, struct ast_frame *),
int(*  seek)(struct ast_filestream *, long offset, int whence),
int(*  trunc)(struct ast_filestream *),
long(*  tell)(struct ast_filestream *),
struct ast_frame *(*  read)(struct ast_filestream *, int *timetonext),
void(*  close)(struct ast_filestream *),
char *(*  getcomment)(struct ast_filestream *)
 

Registers a new file format.

Register a new file format capability Adds a format to asterisk's format abilities. Fill in the fields, and it will work. For examples, look at some of the various format code. returns 0 on success, -1 on failure

int ast_format_unregister char *  name  ) 
 

Unregisters a file format.

Parameters:
name the name of the format you wish to unregister Unregisters a format based on the name of the format. Returns 0 on success, -1 on failure to unregister
Definition at line 141 of file file.c.

References ast_log(), ast_mutex_lock, ast_mutex_unlock, ast_verbose(), free, LOG_WARNING, ast_format::next, option_verbose, and VERBOSE_PREFIX_2.

00142 { 00143 struct ast_format *tmp, *tmpl = NULL; 00144 if (ast_mutex_lock(&formatlock)) { 00145 ast_log(LOG_WARNING, "Unable to lock format list\n"); 00146 return -1; 00147 } 00148 tmp = formats; 00149 while(tmp) { 00150 if (!strcasecmp(name, tmp->name)) { 00151 if (tmpl) 00152 tmpl->next = tmp->next; 00153 else 00154 formats = tmp->next; 00155 free(tmp); 00156 ast_mutex_unlock(&formatlock); 00157 if (option_verbose > 1) 00158 ast_verbose( VERBOSE_PREFIX_2 "Unregistered format %s\n", name); 00159 return 0; 00160 } 00161 tmpl = tmp; 00162 tmp = tmp->next; 00163 } 00164 ast_log(LOG_WARNING, "Tried to unregister format %s, already unregistered\n", name); 00165 return -1; 00166 }

struct ast_filestream* ast_openstream struct ast_channel chan,
char *  filename,
char *  preflang
 

Opens stream for use in seeking, playing.

Parameters:
chan channel to work with
filename to use
preflang prefered language to use Returns a ast_filestream pointer if it opens the file, NULL on error
Definition at line 435 of file file.c.

References ACTION_OPEN, ast_deactivate_generator(), ast_fileexists(), ast_log(), ast_set_write_format(), ast_stopstream(), ast_channel::generator, LOG_WARNING, ast_channel::oldwriteformat, and ast_channel::writeformat.

Referenced by ast_streamfile().

00436 { 00437 /* This is a fairly complex routine. Essentially we should do 00438 the following: 00439 00440 1) Find which file handlers produce our type of format. 00441 2) Look for a filename which it can handle. 00442 3) If we find one, then great. 00443 4) If not, see what files are there 00444 5) See what we can actually support 00445 6) Choose the one with the least costly translator path and 00446 set it up. 00447 00448 */ 00449 int fd = -1; 00450 int fmts = -1; 00451 char filename2[256]=""; 00452 char filename3[256]=""; 00453 char *endpart; 00454 int res; 00455 ast_stopstream(chan); 00456 /* do this first, otherwise we detect the wrong writeformat */ 00457 if (chan->generator) 00458 ast_deactivate_generator(chan); 00459 if (preflang && !ast_strlen_zero(preflang)) { 00460 strncpy(filename3, filename, sizeof(filename3) - 1); 00461 endpart = strrchr(filename3, '/'); 00462 if (endpart) { 00463 *endpart = '\0'; 00464 endpart++; 00465 snprintf(filename2, sizeof(filename2), "%s/%s/%s", filename3, preflang, endpart); 00466 } else 00467 snprintf(filename2, sizeof(filename2), "%s/%s", preflang, filename); 00468 fmts = ast_fileexists(filename2, NULL, NULL); 00469 } 00470 if (fmts < 1) { 00471 strncpy(filename2, filename, sizeof(filename2)-1); 00472 fmts = ast_fileexists(filename2, NULL, NULL); 00473 } 00474 if (fmts < 1) { 00475 ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename); 00476 return NULL; 00477 } 00478 chan->oldwriteformat = chan->writeformat; 00479 /* Set the channel to a format we can work with */ 00480 res = ast_set_write_format(chan, fmts); 00481 00482 fd = ast_filehelper(filename2, (char *)chan, NULL, ACTION_OPEN); 00483 if (fd >= 0) 00484 return chan->stream; 00485 return NULL; 00486 }

struct ast_filestream* ast_openvstream struct ast_channel chan,
char *  filename,
char *  preflang
 

Opens stream for use in seeking, playing.

Parameters:
chan channel to work with
filename to use
preflang prefered language to use Returns a ast_filestream pointer if it opens the file, NULL on error
Definition at line 488 of file file.c.

References ACTION_OPEN, ast_fileexists(), ast_log(), LOG_WARNING, and MAX_LANGUAGE.

Referenced by ast_streamfile().

00489 { 00490 /* This is a fairly complex routine. Essentially we should do 00491 the following: 00492 00493 1) Find which file handlers produce our type of format. 00494 2) Look for a filename which it can handle. 00495 3) If we find one, then great. 00496 4) If not, see what files are there 00497 5) See what we can actually support 00498 6) Choose the one with the least costly translator path and 00499 set it up. 00500 00501 */ 00502 int fd = -1; 00503 int fmts = -1; 00504 char filename2[256]; 00505 char lang2[MAX_LANGUAGE]; 00506 /* XXX H.263 only XXX */ 00507 char *fmt = "h263"; 00508 if (preflang && !ast_strlen_zero(preflang)) { 00509 snprintf(filename2, sizeof(filename2), "%s/%s", preflang, filename); 00510 fmts = ast_fileexists(filename2, fmt, NULL); 00511 if (fmts < 1) { 00512 strncpy(lang2, preflang, sizeof(lang2)-1); 00513 snprintf(filename2, sizeof(filename2), "%s/%s", lang2, filename); 00514 fmts = ast_fileexists(filename2, fmt, NULL); 00515 } 00516 } 00517 if (fmts < 1) { 00518 strncpy(filename2, filename, sizeof(filename2)-1); 00519 fmts = ast_fileexists(filename2, fmt, NULL); 00520 } 00521 if (fmts < 1) { 00522 return NULL; 00523 } 00524 fd = ast_filehelper(filename2, (char *)chan, fmt, ACTION_OPEN); 00525 if (fd >= 0) 00526 return chan->vstream; 00527 ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename); 00528 return NULL; 00529 }

int ast_playstream struct ast_filestream s  ) 
 

play a open stream on a channel.

Parameters:
ast_filestream s to play Returns 0 for success, -1 on failure
Definition at line 613 of file file.c.

References AST_FORMAT_MAX_AUDIO, and s.

Referenced by ast_streamfile().

00614 { 00615 if (s->fmt->format < AST_FORMAT_MAX_AUDIO) 00616 ast_readaudio_callback(s); 00617 else 00618 ast_readvideo_callback(s); 00619 return 0; 00620 }

struct ast_filestream* ast_readfile char *  filename,
char *  type,
char *  comment,
int  flags,
int  check,
mode_t  mode
 

Starts reading from a file.

Parameters:
filename the name of the file to read from
type format of file you wish to read from
comment comment to go with
flags file flags
check (unimplemented, hence negligible)
mode Open mode Open an incoming file stream. flags are flags for the open() command, and if check is non-zero, then it will not read a file if there are any files that start with that name and have an extension Please note, this is a blocking function. Program execution will not return until ast_waitstream completes it's execution. Returns a struct ast_filestream on success, NULL on failure
Definition at line 783 of file file.c.

References ast_log(), ast_mutex_lock, ast_mutex_unlock, free, LOG_WARNING, strdup, and type.

Referenced by ast_play_and_prepend().

00784 { 00785 int fd,myflags = 0; 00786 struct ast_format *f; 00787 struct ast_filestream *fs=NULL; 00788 char *fn; 00789 char *ext; 00790 if (ast_mutex_lock(&formatlock)) { 00791 ast_log(LOG_WARNING, "Unable to lock format list\n"); 00792 return NULL; 00793 } 00794 f = formats; 00795 while(f) { 00796 if (exts_compare(f->exts, type)) { 00797 char *stringp=NULL; 00798 /* XXX Implement check XXX */ 00799 ext = strdup(f->exts); 00800 stringp=ext; 00801 ext = strsep(&stringp, "|"); 00802 fn = build_filename(filename, ext); 00803 fd = open(fn, flags | myflags); 00804 if (fd >= 0) { 00805 errno = 0; 00806 if ((fs = f->open(fd))) { 00807 fs->trans = NULL; 00808 fs->fmt = f; 00809 fs->flags = flags; 00810 fs->mode = mode; 00811 fs->filename = strdup(filename); 00812 fs->vfs = NULL; 00813 } else { 00814 ast_log(LOG_WARNING, "Unable to open %s\n", fn); 00815 close(fd); 00816 unlink(fn); 00817 } 00818 } else if (errno != EEXIST) 00819 ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno)); 00820 free(fn); 00821 free(ext); 00822 break; 00823 } 00824 f = f->next; 00825 } 00826 ast_mutex_unlock(&formatlock); 00827 if (!f) 00828 ast_log(LOG_WARNING, "No such format '%s'\n", type); 00829 return fs; 00830 }

struct ast_frame* ast_readframe struct ast_filestream s  ) 
 

Read a frame from a filestream.

Parameters:
ast_filestream fs to act on Returns a frame or NULL if read failed
Definition at line 531 of file file.c.

References s.

Referenced by ast_play_and_prepend().

00532 { 00533 struct ast_frame *f = NULL; 00534 int whennext = 0; 00535 if (s && s->fmt) 00536 f = s->fmt->read(s, &whennext); 00537 return f; 00538 }

int ast_seekstream struct ast_filestream fs,
long  sample_offset,
int  whence
 

Seeks into stream.

Parameters:
ast_filestream to perform seek on
sample_offset numbers of samples to seek
whence SEEK_SET, SEEK_CUR, SEEK_END Returns 0 for success, or -1 for error
Definition at line 622 of file file.c.

References ast_filestream::fmt, and ast_format::seek.

Referenced by ast_read(), ast_stream_fastforward(), ast_stream_rewind(), and ast_write().

00623 { 00624 return fs->fmt->seek(fs, sample_offset, whence); 00625 }

int ast_stopstream struct ast_channel c  ) 
 

Stops a stream.

Parameters:
c The channel you wish to stop playback on Stop playback of a stream Returns 0 regardless
Definition at line 168 of file file.c.

References ast_closestream(), ast_log(), ast_set_write_format(), LOG_WARNING, ast_channel::oldwriteformat, ast_channel::stream, and ast_channel::vstream.

Referenced by ast_control_streamfile(), ast_openstream(), ast_play_and_wait(), ast_readstring(), ast_readstring_full(), ast_say_character_str(), ast_say_character_str_full(), ast_say_digit_str(), ast_say_digit_str_full(), ast_say_phonetic_str(), ast_say_phonetic_str_full(), ast_waitstream(), ast_waitstream_fr(), and ast_waitstream_full().

00169 { 00170 /* Stop a running stream if there is one */ 00171 if (tmp->vstream) 00172 ast_closestream(tmp->vstream); 00173 if (tmp->stream) { 00174 ast_closestream(tmp->stream); 00175 if (tmp->oldwriteformat && ast_set_write_format(tmp, tmp->oldwriteformat)) 00176 ast_log(LOG_WARNING, "Unable to restore format back to %d\n", tmp->oldwriteformat); 00177 } 00178 return 0; 00179 }

int ast_stream_fastforward struct ast_filestream fs,
long  ms
 

Fast forward stream ms.

Parameters:
ast_filestream fs filestream to act on
ms milliseconds to move Returns 0 for success, or -1 for error
Definition at line 637 of file file.c.

References ast_seekstream().

Referenced by ast_control_streamfile(), and ast_waitstream_fr().

00638 { 00639 /* I think this is right, 8000 samples per second, 1000 ms a second so 8 00640 * samples per ms */ 00641 long samples = ms * 8; 00642 return ast_seekstream(fs, samples, SEEK_CUR); 00643 }

int ast_stream_rewind struct ast_filestream fs,
long  ms
 

Rewind stream ms.

Parameters:
ast_filestream fs filestream to act on
ms milliseconds to move Returns 0 for success, or -1 for error
Definition at line 645 of file file.c.

References ast_seekstream().

Referenced by ast_play_and_prepend(), ast_play_and_record(), and ast_waitstream_fr().

00646 { 00647 long samples = ms * 8; 00648 samples = samples * -1; 00649 return ast_seekstream(fs, samples, SEEK_CUR); 00650 }

int ast_streamfile struct ast_channel c,
char *  filename,
char *  preflang
 

Streams a file.

Parameters:
c channel to stream the file to
filename the name of the file you wish to stream, minus the extension
preflang the preferred language you wish to have the file streamed to you in Prepares a channel for the streaming of a file. To start the stream, afterward do a ast_waitstream() on the channel Also, it will stop any existing streams on the channel. Returns 0 on success, or -1 on failure.
Definition at line 755 of file file.c.

References ast_applystream(), ast_getformatname(), ast_log(), ast_openstream(), ast_openvstream(), ast_playstream(), ast_verbose(), LOG_DEBUG, LOG_WARNING, ast_channel::nativeformats, option_verbose, and VERBOSE_PREFIX_3.

Referenced by ast_app_getdata(), ast_app_getdata_full(), ast_app_getvoice(), ast_control_streamfile(), ast_play_and_prepend(), ast_play_and_record(), ast_play_and_wait(), ast_say_character_str(), ast_say_character_str_full(), ast_say_digit_str(), ast_say_digit_str_full(), ast_say_phonetic_str(), and ast_say_phonetic_str_full().

00756 { 00757 struct ast_filestream *fs; 00758 struct ast_filestream *vfs; 00759 00760 fs = ast_openstream(chan, filename, preflang); 00761 vfs = ast_openvstream(chan, filename, preflang); 00762 if (vfs) 00763 ast_log(LOG_DEBUG, "Ooh, found a video stream, too\n"); 00764 if (fs){ 00765 if (ast_applystream(chan, fs)) 00766 return -1; 00767 if (vfs && ast_applystream(chan, vfs)) 00768 return -1; 00769 if (ast_playstream(fs)) 00770 return -1; 00771 if (vfs && ast_playstream(vfs)) 00772 return -1; 00773 #if 1 00774 if (option_verbose > 2) 00775 ast_verbose(VERBOSE_PREFIX_3 "Playing '%s' (language '%s')\n", filename, preflang ? preflang : "default"); 00776 #endif 00777 return 0; 00778 } 00779 ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname(chan->nativeformats), strerror(errno)); 00780 return -1; 00781 }

long ast_tellstream struct ast_filestream fs  ) 
 

Tell where we are in a stream.

Parameters:
ast_filestream fs to act on Returns a long as a sample offset into stream
Definition at line 632 of file file.c.

References ast_filestream::fmt, and ast_format::tell.

00633 { 00634 return fs->fmt->tell(fs); 00635 }

int ast_truncstream struct ast_filestream fs  ) 
 

Trunc stream at current location.

Parameters:
ast_filestream fs Returns 0 for success, or -1 for error
Definition at line 627 of file file.c.

References ast_filestream::fmt, and ast_format::trunc.

Referenced by ast_play_and_prepend(), and ast_play_and_record().

00628 { 00629 return fs->fmt->trunc(fs); 00630 }

char ast_waitstream struct ast_channel c,
char *  breakon
 

Waits for a stream to stop or digit to be pressed.

Parameters:
c channel to waitstram on
breakon string of DTMF digits to break upon Begins playback of a stream... Wait for a stream to stop or for any one of a given digit to arrive, Returns 0 if the stream finishes, the character if it was interrupted, and -1 on error
Definition at line 923 of file file.c.

References ast_channel::_softhangup, AST_CONTROL_ANSWER, AST_CONTROL_HANGUP, AST_CONTROL_RINGING, AST_FRAME_CONTROL, AST_FRAME_DTMF, ast_frfree(), ast_log(), ast_read(), ast_sched_runq(), ast_sched_wait(), ast_stopstream(), ast_waitfor(), LOG_DEBUG, LOG_WARNING, ast_channel::sched, ast_channel::stream, and ast_channel::timingfunc.

Referenced by ast_app_getvoice(), ast_play_and_prepend(), ast_play_and_record(), ast_play_and_wait(), ast_readstring(), ast_say_character_str(), ast_say_digit_str(), and ast_say_phonetic_str().

00924 { 00925 /* XXX Maybe I should just front-end ast_waitstream_full ? XXX */ 00926 int res; 00927 struct ast_frame *fr; 00928 if (!breakon) breakon = ""; 00929 while(c->stream) { 00930 res = ast_sched_wait(c->sched); 00931 if ((res < 0) && !c->timingfunc) { 00932 ast_stopstream(c); 00933 break; 00934 } 00935 if (res < 0) 00936 res = 1000; 00937 res = ast_waitfor(c, res); 00938 if (res < 0) { 00939 ast_log(LOG_WARNING, "Select failed (%s)\n", strerror(errno)); 00940 return res; 00941 } else if (res > 0) { 00942 fr = ast_read(c); 00943 if (!fr) { 00944 #if 0 00945 ast_log(LOG_DEBUG, "Got hung up\n"); 00946 #endif 00947 return -1; 00948 } 00949 00950 switch(fr->frametype) { 00951 case AST_FRAME_DTMF: 00952 res = fr->subclass; 00953 if (strchr(breakon, res)) { 00954 ast_frfree(fr); 00955 return res; 00956 } 00957 break; 00958 case AST_FRAME_CONTROL: 00959 switch(fr->subclass) { 00960 case AST_CONTROL_HANGUP: 00961 ast_frfree(fr); 00962 return -1; 00963 case AST_CONTROL_RINGING: 00964 case AST_CONTROL_ANSWER: 00965 /* Unimportant */ 00966 break; 00967 default: 00968 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", fr->subclass); 00969 } 00970 } 00971 /* Ignore */ 00972 ast_frfree(fr); 00973 } 00974 ast_sched_runq(c->sched); 00975 } 00976 return (c->_softhangup ? -1 : 0); 00977 }

char ast_waitstream_fr struct ast_channel c,
char *  breakon,
char *  forward,
char *  rewind,
int  ms
 

Same as waitstream but allows stream to be forwarded or rewound.

Parameters:
c channel to waitstram on
breakon string of DTMF digits to break upon
forward DTMF digit to fast forward upon
rewind DTMF digit to rewind upon
ms How many miliseconds to skip forward/back Begins playback of a stream... Wait for a stream to stop or for any one of a given digit to arrive, Returns 0 if the stream finishes, the character if it was interrupted, and -1 on error
Definition at line 979 of file file.c.

References ast_channel::_softhangup, AST_CONTROL_ANSWER, AST_CONTROL_HANGUP, AST_CONTROL_RINGING, AST_FRAME_CONTROL, AST_FRAME_DTMF, ast_frfree(), ast_log(), ast_read(), ast_sched_runq(), ast_sched_wait(), ast_stopstream(), ast_stream_fastforward(), ast_stream_rewind(), ast_waitfor(), LOG_DEBUG, LOG_WARNING, ast_channel::sched, ast_channel::stream, and ast_channel::timingfunc.

Referenced by ast_control_streamfile().

00980 { 00981 int res; 00982 struct ast_frame *fr; 00983 while(c->stream) { 00984 res = ast_sched_wait(c->sched); 00985 if ((res < 0) && !c->timingfunc) { 00986 ast_stopstream(c); 00987 break; 00988 } 00989 if (res < 0) 00990 res = 1000; 00991 res = ast_waitfor(c, res); 00992 if (res < 0) { 00993 ast_log(LOG_WARNING, "Select failed (%s)\n", strerror(errno)); 00994 return res; 00995 } else 00996 if (res > 0) { 00997 fr = ast_read(c); 00998 if (!fr) { 00999 #if 0 01000 ast_log(LOG_DEBUG, "Got hung up\n"); 01001 #endif 01002 return -1; 01003 } 01004 01005 switch(fr->frametype) { 01006 case AST_FRAME_DTMF: 01007 res = fr->subclass; 01008 if (strchr(forward,res)) { 01009 ast_stream_fastforward(c->stream, ms); 01010 } else if (strchr(rewind,res)) { 01011 ast_stream_rewind(c->stream, ms); 01012 } else if (strchr(breakon, res)) { 01013 ast_frfree(fr); 01014 return res; 01015 } 01016 break; 01017 case AST_FRAME_CONTROL: 01018 switch(fr->subclass) { 01019 case AST_CONTROL_HANGUP: 01020 ast_frfree(fr); 01021 return -1; 01022 case AST_CONTROL_RINGING: 01023 case AST_CONTROL_ANSWER: 01024 /* Unimportant */ 01025 break; 01026 default: 01027 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", fr->subclass); 01028 } 01029 } 01030 /* Ignore */ 01031 ast_frfree(fr); 01032 } else 01033 ast_sched_runq(c->sched); 01034 01035 01036 } 01037 return (c->_softhangup ? -1 : 0); 01038 }

char ast_waitstream_full struct ast_channel c,
char *  breakon,
int  audiofd,
int  monfd
 

Definition at line 1040 of file file.c.

References ast_channel::_softhangup, AST_CONTROL_ANSWER, AST_CONTROL_HANGUP, AST_CONTROL_RINGING, AST_FRAME_CONTROL, AST_FRAME_DTMF, AST_FRAME_VOICE, ast_frfree(), ast_log(), ast_read(), ast_sched_runq(), ast_sched_wait(), ast_stopstream(), ast_waitfor_nandfds(), LOG_DEBUG, LOG_WARNING, ast_channel::sched, ast_channel::stream, and ast_channel::timingfunc.

Referenced by ast_readstring_full(), ast_say_character_str_full(), ast_say_digit_str_full(), and ast_say_phonetic_str_full().

01041 { 01042 int res; 01043 int ms; 01044 int outfd; 01045 struct ast_frame *fr; 01046 struct ast_channel *rchan; 01047 01048 while(c->stream) { 01049 ms = ast_sched_wait(c->sched); 01050 if ((ms < 0) && !c->timingfunc) { 01051 ast_stopstream(c); 01052 break; 01053 } 01054 if (ms < 0) 01055 ms = 1000; 01056 rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms); 01057 if (!rchan && (outfd < 0) && (ms)) { 01058 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno)); 01059 return -1; 01060 } else if (outfd > -1) { 01061 /* The FD we were watching has something waiting */ 01062 return 1; 01063 } else if (rchan) { 01064 fr = ast_read(c); 01065 if (!fr) { 01066 #if 0 01067 ast_log(LOG_DEBUG, "Got hung up\n"); 01068 #endif 01069 return -1; 01070 } 01071 01072 switch(fr->frametype) { 01073 case AST_FRAME_DTMF: 01074 res = fr->subclass; 01075 if (strchr(breakon, res)) { 01076 ast_frfree(fr); 01077 return res; 01078 } 01079 break; 01080 case AST_FRAME_CONTROL: 01081 switch(fr->subclass) { 01082 case AST_CONTROL_HANGUP: 01083 ast_frfree(fr); 01084 return -1; 01085 case AST_CONTROL_RINGING: 01086 case AST_CONTROL_ANSWER: 01087 /* Unimportant */ 01088 break; 01089 default: 01090 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", fr->subclass); 01091 } 01092 case AST_FRAME_VOICE: 01093 /* Write audio if appropriate */ 01094 if (audiofd > -1) 01095 write(audiofd, fr->data, fr->datalen); 01096 } 01097 /* Ignore */ 01098 ast_frfree(fr); 01099 } 01100 ast_sched_runq(c->sched); 01101 01102 01103 } 01104 return (c->_softhangup ? -1 : 0); 01105 }

struct ast_filestream* ast_writefile char *  filename,
char *  type,
char *  comment,
int  flags,
int  check,
mode_t  mode
 

Starts writing a file.

Parameters:
filename the name of the file to write to
type format of file you wish to write out to
comment comment to go with
oflags output file flags
check (unimplemented, hence negligible)
mode Open mode Create an outgoing file stream. oflags are flags for the open() command, and if check is non-zero, then it will not write a file if there are any files that start with that name and have an extension Please note, this is a blocking function. Program execution will not return until ast_waitstream completes it's execution. Returns a struct ast_filestream on success, NULL on failure
Definition at line 832 of file file.c.

References ast_log(), ast_mutex_lock, ast_mutex_unlock, free, LOG_WARNING, option_cache_record_files, record_cache_dir, strdup, and type.

Referenced by ast_app_getvoice(), ast_play_and_prepend(), ast_play_and_record(), and ast_writestream().

00833 { 00834 int fd,myflags = 0; 00835 struct ast_format *f; 00836 struct ast_filestream *fs=NULL; 00837 char *fn,*orig_fn=NULL; 00838 char *ext; 00839 char *buf=NULL; 00840 size_t size = 0; 00841 00842 if (ast_mutex_lock(&formatlock)) { 00843 ast_log(LOG_WARNING, "Unable to lock format list\n"); 00844 return NULL; 00845 } 00846 /* set the O_TRUNC flag if and only if there is no O_APPEND specified */ 00847 if (!(flags & O_APPEND)) 00848 myflags = O_TRUNC; 00849 00850 myflags |= O_WRONLY | O_CREAT; 00851 00852 f = formats; 00853 while(f) { 00854 if (exts_compare(f->exts, type)) { 00855 char *stringp=NULL; 00856 /* XXX Implement check XXX */ 00857 ext = ast_strdupa(f->exts); 00858 stringp=ext; 00859 ext = strsep(&stringp, "|"); 00860 fn = build_filename(filename, ext); 00861 fd = open(fn, flags | myflags, mode); 00862 00863 if (option_cache_record_files && fd >= 0) { 00864 close(fd); 00865 /* 00866 We touch orig_fn just as a place-holder so other things (like vmail) see the file is there. 00867 What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place. 00868 */ 00869 orig_fn = ast_strdupa(fn); 00870 for (size=0;size<strlen(fn);size++) { 00871 if (fn[size] == '/') 00872 fn[size] = '_'; 00873 } 00874 00875 size += (strlen(record_cache_dir) + 10); 00876 buf = alloca(size); 00877 memset(buf, 0, size); 00878 snprintf(buf, size, "%s/%s", record_cache_dir, fn); 00879 free(fn); 00880 fn=buf; 00881 fd = open(fn, flags | myflags, mode); 00882 } 00883 if (fd >= 0) { 00884 errno = 0; 00885 if ((fs = f->rewrite(fd, comment))) { 00886 fs->trans = NULL; 00887 fs->fmt = f; 00888 fs->flags = flags; 00889 fs->mode = mode; 00890 if (option_cache_record_files) { 00891 fs->realfilename = build_filename(filename, ext); 00892 fs->filename = strdup(fn); 00893 } else { 00894 fs->realfilename = NULL; 00895 fs->filename = strdup(filename); 00896 } 00897 fs->vfs = NULL; 00898 } else { 00899 ast_log(LOG_WARNING, "Unable to rewrite %s\n", fn); 00900 close(fd); 00901 unlink(fn); 00902 if (orig_fn) 00903 unlink(orig_fn); 00904 } 00905 } else if (errno != EEXIST) { 00906 ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno)); 00907 if (orig_fn) 00908 unlink(orig_fn); 00909 } 00910 if (!buf) /* if buf != NULL then fn is already free and pointing to it */ 00911 free(fn); 00912 00913 break; 00914 } 00915 f = f->next; 00916 } 00917 ast_mutex_unlock(&formatlock); 00918 if (!f) 00919 ast_log(LOG_WARNING, "No such format '%s'\n", type); 00920 return fs; 00921 }

int ast_writestream struct ast_filestream fs,
struct ast_frame f
 

Writes a frame to a stream.

Parameters:
fs filestream to write to
f frame to write to the filestream Send a frame to a filestream -- note: does NOT free the frame, call ast_frfree manually Returns 0 on success, -1 on failure.
Definition at line 181 of file file.c.

References AST_FORMAT_MAX_AUDIO, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_getformatname(), ast_log(), ast_translate(), ast_translator_build_path(), ast_translator_free_path(), ast_writefile(), ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, ast_format::format, ast_frame::frametype, ast_filestream::lastwriteformat, LOG_DEBUG, LOG_WARNING, ast_filestream::mode, ast_format::name, ast_frame::subclass, ast_filestream::trans, type, ast_filestream::vfs, and ast_format::write.

Referenced by ast_play_and_prepend(), ast_play_and_record(), ast_read(), and ast_write().

00182 { 00183 struct ast_frame *trf; 00184 int res = -1; 00185 int alt=0; 00186 if (f->frametype == AST_FRAME_VIDEO) { 00187 if (fs->fmt->format < AST_FORMAT_MAX_AUDIO) { 00188 /* This is the audio portion. Call the video one... */ 00189 if (!fs->vfs && fs->filename) { 00190 /* XXX Support other video formats XXX */ 00191 char *type = "h263"; 00192 fs->vfs = ast_writefile(fs->filename, type, NULL, fs->flags, 0, fs->mode); 00193 ast_log(LOG_DEBUG, "Opened video output file\n"); 00194 } 00195 if (fs->vfs) 00196 return ast_writestream(fs->vfs, f); 00197 /* Ignore */ 00198 return 0; 00199 } else { 00200 /* Might / might not have mark set */ 00201 alt = 1; 00202 } 00203 } else if (f->frametype != AST_FRAME_VOICE) { 00204 ast_log(LOG_WARNING, "Tried to write non-voice frame\n"); 00205 return -1; 00206 } 00207 if (((fs->fmt->format | alt) & f->subclass) == f->subclass) { 00208 res = fs->fmt->write(fs, f); 00209 if (res < 0) 00210 ast_log(LOG_WARNING, "Natural write failed\n"); 00211 if (res > 0) 00212 ast_log(LOG_WARNING, "Huh??\n"); 00213 return res; 00214 } else { 00215 /* XXX If they try to send us a type of frame that isn't the normal frame, and isn't 00216 the one we've setup a translator for, we do the "wrong thing" XXX */ 00217 if (fs->trans && (f->subclass != fs->lastwriteformat)) { 00218 ast_translator_free_path(fs->trans); 00219 fs->trans = NULL; 00220 } 00221 if (!fs->trans) 00222 fs->trans = ast_translator_build_path(fs->fmt->format, f->subclass); 00223 if (!fs->trans) 00224 ast_log(LOG_WARNING, "Unable to translate to format %s, source format %s\n", fs->fmt->name, ast_getformatname(f->subclass)); 00225 else { 00226 fs->lastwriteformat = f->subclass; 00227 res = 0; 00228 /* Get the translated frame but don't consume the original in case they're using it on another stream */ 00229 trf = ast_translate(fs->trans, f, 0); 00230 if (trf) { 00231 res = fs->fmt->write(fs, trf); 00232 if (res) 00233 ast_log(LOG_WARNING, "Translated frame write failed\n"); 00234 } else 00235 res = 0; 00236 } 00237 return res; 00238 } 00239 }


Generated on Fri Sep 24 21:03:52 2004 for Asterisk by doxygen 1.3.8