#include "asterisk.h"
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include "asterisk/frame.h"
#include "asterisk/file.h"
#include "asterisk/cli.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/sched.h"
#include "asterisk/options.h"
#include "asterisk/translate.h"
#include "asterisk/utils.h"
#include "asterisk/lock.h"
#include "asterisk/app.h"
#include "asterisk/pbx.h"
#include "asterisk/linkedlists.h"
#include "asterisk/module.h"
#include "asterisk/astobj2.h"
Go to the source code of this file.
Data Structures | |
struct | formats |
Defines | |
#define | FORMAT "%-10s %-10s %-20s\n" |
#define | FORMAT "%-10s %-10s %-20s\n" |
#define | FORMAT2 "%-10s %-10s %-20s\n" |
#define | FORMAT2 "%-10s %-10s %-20s\n" |
Enumerations | |
enum | file_action { ACTION_EXISTS = 1, ACTION_DELETE, ACTION_RENAME, ACTION_OPEN, ACTION_COPY } |
enum | fsread_res { FSREAD_FAILURE, FSREAD_SUCCESS_SCHED, FSREAD_SUCCESS_NOSCHED } |
enum | wrap_fn { WRAP_OPEN, WRAP_REWRITE } |
Functions | |
int | __ast_format_register (const struct ast_format *f, struct ast_module *mod) |
int | ast_applystream (struct ast_channel *chan, struct ast_filestream *s) |
int | ast_closestream (struct ast_filestream *f) |
int | ast_file_init (void) |
int | ast_filecopy (const char *filename, const char *filename2, const char *fmt) |
int | ast_filedelete (const char *filename, const char *fmt) |
int | ast_fileexists (const char *filename, const char *fmt, const char *preflang) |
static int | ast_filehelper (const char *filename, const void *arg2, const char *fmt, const enum file_action action) |
perform various actions on a file. Second argument arg2 depends on the command: unused for EXISTS and DELETE destination file name (const char *) for COPY and RENAME struct ast_channel * for OPEN if fmt is NULL, OPEN will return the first matching entry, whereas other functions will run on all matching entries. | |
int | ast_filerename (const char *filename, const char *filename2, const char *fmt) |
void | ast_filestream_frame_freed (struct ast_frame *fr) |
destroy a filestream using an ast_frame as input | |
int | ast_format_unregister (const char *name) |
static int | ast_fsread_audio (const void *data) |
static int | ast_fsread_video (const void *data) |
ast_filestream * | ast_openstream (struct ast_channel *chan, const char *filename, const char *preflang) |
ast_filestream * | ast_openstream_full (struct ast_channel *chan, const char *filename, const char *preflang, int asis) |
ast_filestream * | ast_openvstream (struct ast_channel *chan, const char *filename, const char *preflang) |
int | ast_playstream (struct ast_filestream *s) |
static enum fsread_res | ast_readaudio_callback (struct ast_filestream *s) |
ast_filestream * | ast_readfile (const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode) |
ast_frame * | ast_readframe (struct ast_filestream *s) |
static enum fsread_res | ast_readvideo_callback (struct ast_filestream *s) |
int | ast_seekstream (struct ast_filestream *fs, off_t sample_offset, int whence) |
int | ast_stopstream (struct ast_channel *tmp) |
Stops a stream. | |
int | ast_stream_and_wait (struct ast_channel *chan, const char *file, const char *language, const char *digits) |
int | ast_stream_fastforward (struct ast_filestream *fs, off_t ms) |
int | ast_stream_rewind (struct ast_filestream *fs, off_t ms) |
int | ast_streamfile (struct ast_channel *chan, const char *filename, const char *preflang) |
off_t | ast_tellstream (struct ast_filestream *fs) |
int | ast_truncstream (struct ast_filestream *fs) |
int | ast_waitstream (struct ast_channel *c, const char *breakon) |
int | ast_waitstream_exten (struct ast_channel *c, const char *context) |
int | ast_waitstream_fr (struct ast_channel *c, const char *breakon, const char *forward, const char *rewind, int ms) |
int | ast_waitstream_full (struct ast_channel *c, const char *breakon, int audiofd, int cmdfd) |
ast_filestream * | ast_writefile (const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode) |
int | ast_writestream (struct ast_filestream *fs, struct ast_frame *f) |
static char * | build_filename (const char *filename, const char *ext) |
construct a filename. Absolute pathnames are preserved, relative names are prefixed by the sounds/ directory. The wav49 suffix is replaced by 'WAV'. Returns a malloc'ed string to be freed by the caller. | |
static int | copy (const char *infile, const char *outfile) |
static int | exts_compare (const char *exts, const char *type) |
static int | fileexists_core (const char *filename, const char *fmt, const char *preflang, char *buf, int buflen) |
helper routine to locate a file with a given format and language preference. Try preflang, preflang with stripped '_' suffix, or NULL. In the standard asterisk, language goes just before the last component. In an alternative configuration, the language should be a prefix to the actual filename. | |
static int | fileexists_test (const char *filename, const char *fmt, const char *lang, char *buf, int buflen) |
static void | filestream_destructor (void *arg) |
static int | fn_wrapper (struct ast_filestream *s, const char *comment, enum wrap_fn mode) |
static struct ast_filestream * | get_filestream (struct ast_format *fmt, FILE *bfile) |
static int | is_absolute_path (const char *filename) |
static int | open_wrapper (struct ast_filestream *s) |
static int | rewrite_wrapper (struct ast_filestream *s, const char *comment) |
static int | show_file_formats (int fd, int argc, char *argv[]) |
static int | show_file_formats_deprecated (int fd, int argc, char *argv[]) |
static int | waitstream_core (struct ast_channel *c, const char *breakon, const char *forward, const char *rewind, int skip_ms, int audiofd, int cmdfd, const char *context) |
the core of all waitstream() functions | |
Variables | |
int | ast_language_is_prefix |
ast_cli_entry | cli_file [] |
ast_cli_entry | cli_show_file_formats_deprecated |
char | show_file_formats_usage [] |
Definition in file file.c.
#define FORMAT "%-10s %-10s %-20s\n" |
#define FORMAT "%-10s %-10s %-20s\n" |
#define FORMAT2 "%-10s %-10s %-20s\n" |
#define FORMAT2 "%-10s %-10s %-20s\n" |
Referenced by __iax2_show_peers(), __sip_show_channels(), _sip_show_peers(), dahdi_show_channels(), dahdi_show_status(), dundi_show_mappings(), dundi_show_peers(), dundi_show_precache(), dundi_show_requests(), dundi_show_trans(), iax2_show_channels(), iax2_show_firmware(), iax2_show_registry(), iax2_show_users(), show_file_formats(), show_file_formats_deprecated(), show_image_formats(), show_image_formats_deprecated(), sip_show_inuse(), and sip_show_registry().
enum file_action |
Definition at line 397 of file file.c.
00397 { 00398 ACTION_EXISTS = 1, /* return matching format if file exists, 0 otherwise */ 00399 ACTION_DELETE, /* delete file, return 0 on success, -1 on error */ 00400 ACTION_RENAME, /* rename file. return 0 on success, -1 on error */ 00401 ACTION_OPEN, 00402 ACTION_COPY /* copy file. return 0 on success, -1 on error */ 00403 };
enum fsread_res |
Definition at line 713 of file file.c.
00713 { 00714 FSREAD_FAILURE, 00715 FSREAD_SUCCESS_SCHED, 00716 FSREAD_SUCCESS_NOSCHED, 00717 };
enum wrap_fn |
int __ast_format_register | ( | const struct ast_format * | f, | |
struct ast_module * | mod | |||
) |
Register a new file format capability Adds a format to Asterisk's format abilities. returns 0 on success, -1 on failure
Definition at line 69 of file file.c.
References ast_calloc, AST_LIST_INSERT_HEAD, AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log(), ast_verbose(), ast_format::buf_size, ast_format::exts, f, ast_format::list, LOG_WARNING, ast_format::module, ast_format::name, option_verbose, and VERBOSE_PREFIX_2.
00070 { 00071 struct ast_format *tmp; 00072 00073 if (AST_LIST_LOCK(&formats)) { 00074 ast_log(LOG_WARNING, "Unable to lock format list\n"); 00075 return -1; 00076 } 00077 AST_LIST_TRAVERSE(&formats, tmp, list) { 00078 if (!strcasecmp(f->name, tmp->name)) { 00079 AST_LIST_UNLOCK(&formats); 00080 ast_log(LOG_WARNING, "Tried to register '%s' format, already registered\n", f->name); 00081 return -1; 00082 } 00083 } 00084 if (!(tmp = ast_calloc(1, sizeof(*tmp)))) { 00085 AST_LIST_UNLOCK(&formats); 00086 return -1; 00087 } 00088 *tmp = *f; 00089 tmp->module = mod; 00090 if (tmp->buf_size) { 00091 /* 00092 * Align buf_size properly, rounding up to the machine-specific 00093 * alignment for pointers. 00094 */ 00095 struct _test_align { void *a, *b; } p; 00096 int align = (char *)&p.b - (char *)&p.a; 00097 tmp->buf_size = ((f->buf_size + align - 1)/align)*align; 00098 } 00099 00100 memset(&tmp->list, 0, sizeof(tmp->list)); 00101 00102 AST_LIST_INSERT_HEAD(&formats, tmp, list); 00103 AST_LIST_UNLOCK(&formats); 00104 if (option_verbose > 1) 00105 ast_verbose( VERBOSE_PREFIX_2 "Registered file format %s, extension(s) %s\n", f->name, f->exts); 00106 00107 return 0; 00108 }
int ast_applystream | ( | struct ast_channel * | chan, | |
struct ast_filestream * | s | |||
) |
chan | channel to work | |
s | ast_filestream to apply Returns 0 for success, -1 on failure |
Definition at line 821 of file file.c.
References s.
Referenced by ast_streamfile(), handle_getoption(), handle_recordfile(), handle_streamfile(), and speech_streamfile().
00822 { 00823 s->owner = chan; 00824 return 0; 00825 }
int ast_closestream | ( | struct ast_filestream * | f | ) |
f | filestream to close Close a playback or recording stream Returns 0 on success, -1 on failure |
Definition at line 864 of file file.c.
References ao2_ref(), AST_FRFLAG_FROM_FILESTREAM, ast_test_flag, and f.
Referenced by __ast_play_and_record(), ast_filehelper(), ast_hangup(), ast_moh_files_next(), ast_monitor_start(), ast_monitor_stop(), ast_readfile(), ast_stopstream(), ast_writefile(), cli_audio_convert(), cli_audio_convert_deprecated(), dictate_exec(), filestream_destructor(), gen_closestream(), handle_recordfile(), local_ast_moh_stop(), mixmonitor_thread(), moh_files_release(), and rpt().
00865 { 00866 00867 if (ast_test_flag(&f->fr, AST_FRFLAG_FROM_FILESTREAM)) { 00868 /* If this flag is still set, it essentially means that the reference 00869 * count of f is non-zero. We can't destroy this filestream until 00870 * whatever is using the filestream's frame has finished. 00871 * 00872 * Since this was called, however, we need to remove the reference from 00873 * when this filestream was first allocated. That way, when the embedded 00874 * frame is freed, the refcount will reach 0 and we can finish destroying 00875 * this filestream properly. 00876 */ 00877 ao2_ref(f, -1); 00878 return 0; 00879 } 00880 00881 ao2_ref(f, -1); 00882 return 0; 00883 }
int ast_file_init | ( | void | ) |
Initializes all the various file stuff. Basically just registers the cli stuff Returns 0 all the time
Definition at line 1390 of file file.c.
References ast_cli_register_multiple(), and cli_file.
Referenced by main().
01391 { 01392 ast_cli_register_multiple(cli_file, sizeof(cli_file) / sizeof(struct ast_cli_entry)); 01393 return 0; 01394 }
int ast_filecopy | ( | const char * | oldname, | |
const char * | newname, | |||
const char * | fmt | |||
) |
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 913 of file file.c.
References ast_filehelper().
Referenced by copy_plain_file(), and vm_forwardoptions().
00914 { 00915 return ast_filehelper(filename, filename2, fmt, ACTION_COPY); 00916 }
int ast_filedelete | ( | const char * | filename, | |
const char * | fmt | |||
) |
filename | name of the file you wish to delete (minus the extension) | |
fmt | of the file Delete a given file in a given format, or if fmt is NULL, then do so for all |
Definition at line 903 of file file.c.
References ACTION_DELETE, and ast_filehelper().
Referenced by __ast_play_and_record(), announce_thread(), ast_monitor_start(), ast_monitor_stop(), cli_audio_convert(), cli_audio_convert_deprecated(), conf_free(), leave_voicemail(), play_mailbox_owner(), play_record_review(), vm_delete(), and vm_forwardoptions().
00904 { 00905 return ast_filehelper(filename, NULL, fmt, ACTION_DELETE); 00906 }
int ast_fileexists | ( | const char * | filename, | |
const char * | fmt, | |||
const char * | preflang | |||
) |
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 889 of file file.c.
References ast_filestream::buf, and fileexists_core().
Referenced by announce_thread(), app_exec(), ast_moh_files_next(), ast_monitor_start(), ast_monitor_stop(), common_exec(), last_message_index(), leave_voicemail(), play_greeting(), play_mailbox_owner(), play_message_callerid(), record_exec(), retrydial_exec(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), vm_intro(), vm_newuser(), vm_options(), and vm_tempgreeting().
00890 { 00891 char *buf; 00892 int buflen; 00893 00894 if (preflang == NULL) 00895 preflang = ""; 00896 buflen = strlen(preflang) + strlen(filename) + 4; /* room for everything */ 00897 buf = alloca(buflen); 00898 if (buf == NULL) 00899 return 0; 00900 return fileexists_core(filename, fmt, preflang, buf, buflen); 00901 }
static int ast_filehelper | ( | const char * | filename, | |
const void * | arg2, | |||
const char * | fmt, | |||
const enum file_action | action | |||
) | [static] |
perform various actions on a file. Second argument arg2 depends on the command: unused for EXISTS and DELETE destination file name (const char *) for COPY and RENAME struct ast_channel * for OPEN if fmt is NULL, OPEN will return the first matching entry, whereas other functions will run on all matching entries.
Definition at line 414 of file file.c.
References ACTION_DELETE, ACTION_EXISTS, ACTION_OPEN, ACTION_RENAME, ast_closestream(), AST_FORMAT_MAX_AUDIO, AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log(), ast_strdupa, build_filename(), copy(), errno, ext, ast_format::exts, exts_compare(), f, ast_format::format, free, get_filestream(), ast_format::list, LOG_WARNING, open_wrapper(), s, ast_channel::stream, ast_channel::vstream, and ast_channel::writeformat.
Referenced by ast_filecopy(), ast_filedelete(), ast_filerename(), ast_openstream_full(), ast_openvstream(), and fileexists_test().
00415 { 00416 struct ast_format *f; 00417 int res = (action == ACTION_EXISTS) ? 0 : -1; 00418 00419 if (AST_LIST_LOCK(&formats)) { 00420 ast_log(LOG_WARNING, "Unable to lock format list\n"); 00421 return res; 00422 } 00423 /* Check for a specific format */ 00424 AST_LIST_TRAVERSE(&formats, f, list) { 00425 char *stringp, *ext = NULL; 00426 00427 if (fmt && !exts_compare(f->exts, fmt)) 00428 continue; 00429 00430 /* Look for a file matching the supported extensions. 00431 * The file must exist, and for OPEN, must match 00432 * one of the formats supported by the channel. 00433 */ 00434 stringp = ast_strdupa(f->exts); /* this is in the stack so does not need to be freed */ 00435 while ( (ext = strsep(&stringp, "|")) ) { 00436 struct stat st; 00437 char *fn = build_filename(filename, ext); 00438 00439 if (fn == NULL) 00440 continue; 00441 00442 if ( stat(fn, &st) ) { /* file not existent */ 00443 free(fn); 00444 continue; 00445 } 00446 /* for 'OPEN' we need to be sure that the format matches 00447 * what the channel can process 00448 */ 00449 if (action == ACTION_OPEN) { 00450 struct ast_channel *chan = (struct ast_channel *)arg2; 00451 FILE *bfile; 00452 struct ast_filestream *s; 00453 00454 if ( !(chan->writeformat & f->format) && 00455 !(f->format >= AST_FORMAT_MAX_AUDIO && fmt)) { 00456 free(fn); 00457 continue; /* not a supported format */ 00458 } 00459 if ( (bfile = fopen(fn, "r")) == NULL) { 00460 free(fn); 00461 continue; /* cannot open file */ 00462 } 00463 s = get_filestream(f, bfile); 00464 if (!s) { 00465 fclose(bfile); 00466 free(fn); /* cannot allocate descriptor */ 00467 continue; 00468 } 00469 if (open_wrapper(s)) { 00470 free(fn); 00471 ast_closestream(s); 00472 continue; /* cannot run open on file */ 00473 } 00474 /* ok this is good for OPEN */ 00475 res = 1; /* found */ 00476 s->lasttimeout = -1; 00477 s->fmt = f; 00478 s->trans = NULL; 00479 s->filename = NULL; 00480 if (s->fmt->format < AST_FORMAT_MAX_AUDIO) { 00481 if (chan->stream) 00482 ast_closestream(chan->stream); 00483 chan->stream = s; 00484 } else { 00485 if (chan->vstream) 00486 ast_closestream(chan->vstream); 00487 chan->vstream = s; 00488 } 00489 free(fn); 00490 break; 00491 } 00492 switch (action) { 00493 case ACTION_OPEN: 00494 break; /* will never get here */ 00495 00496 case ACTION_EXISTS: /* return the matching format */ 00497 res |= f->format; 00498 break; 00499 00500 case ACTION_DELETE: 00501 if ( (res = unlink(fn)) ) 00502 ast_log(LOG_WARNING, "unlink(%s) failed: %s\n", fn, strerror(errno)); 00503 break; 00504 00505 case ACTION_RENAME: 00506 case ACTION_COPY: { 00507 char *nfn = build_filename((const char *)arg2, ext); 00508 if (!nfn) 00509 ast_log(LOG_WARNING, "Out of memory\n"); 00510 else { 00511 res = action == ACTION_COPY ? copy(fn, nfn) : rename(fn, nfn); 00512 if (res) 00513 ast_log(LOG_WARNING, "%s(%s,%s) failed: %s\n", 00514 action == ACTION_COPY ? "copy" : "rename", 00515 fn, nfn, strerror(errno)); 00516 free(nfn); 00517 } 00518 } 00519 break; 00520 00521 default: 00522 ast_log(LOG_WARNING, "Unknown helper %d\n", action); 00523 } 00524 free(fn); 00525 } 00526 } 00527 AST_LIST_UNLOCK(&formats); 00528 return res; 00529 }
int ast_filerename | ( | const char * | oldname, | |
const char * | newname, | |||
const char * | fmt | |||
) |
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 908 of file file.c.
References ACTION_RENAME, and ast_filehelper().
Referenced by __ast_play_and_record(), ast_monitor_stop(), leave_voicemail(), play_record_review(), and rename_file().
00909 { 00910 return ast_filehelper(filename, filename2, fmt, ACTION_RENAME); 00911 }
void ast_filestream_frame_freed | ( | struct ast_frame * | fr | ) |
destroy a filestream using an ast_frame as input
This is a hack that is used also by the ast_trans_pvt and ast_dsp structures. When a structure contains an ast_frame pointer as one of its fields. It may be that the frame is still used after the outer structure is freed. This leads to invalid memory accesses. This function allows for us to hold off on destroying the ast_filestream until we are done using the ast_frame pointer that is part of it
fr | The ast_frame that is part of an ast_filestream we wish to free. |
Definition at line 1293 of file file.c.
References ao2_ref(), ast_clear_flag, AST_FRFLAG_FROM_FILESTREAM, and ast_filestream::fr.
Referenced by ast_frame_free().
01294 { 01295 struct ast_filestream *fs; 01296 01297 ast_clear_flag(fr, AST_FRFLAG_FROM_FILESTREAM); 01298 01299 fs = (struct ast_filestream *) (((char *) fr) - offsetof(struct ast_filestream, fr)); 01300 01301 ao2_ref(fs, -1); 01302 }
int ast_format_unregister | ( | const char * | name | ) |
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 110 of file file.c.
References AST_LIST_LOCK, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_LIST_UNLOCK, ast_log(), ast_verbose(), free, ast_format::list, LOG_WARNING, ast_format::name, option_verbose, and VERBOSE_PREFIX_2.
Referenced by unload_module().
00111 { 00112 struct ast_format *tmp; 00113 int res = -1; 00114 00115 if (AST_LIST_LOCK(&formats)) { 00116 ast_log(LOG_WARNING, "Unable to lock format list\n"); 00117 return -1; 00118 } 00119 AST_LIST_TRAVERSE_SAFE_BEGIN(&formats, tmp, list) { 00120 if (!strcasecmp(name, tmp->name)) { 00121 AST_LIST_REMOVE_CURRENT(&formats, list); 00122 free(tmp); 00123 res = 0; 00124 } 00125 } 00126 AST_LIST_TRAVERSE_SAFE_END 00127 AST_LIST_UNLOCK(&formats); 00128 00129 if (!res) { 00130 if (option_verbose > 1) 00131 ast_verbose( VERBOSE_PREFIX_2 "Unregistered format %s\n", name); 00132 } else 00133 ast_log(LOG_WARNING, "Tried to unregister format %s, already unregistered\n", name); 00134 00135 return res; 00136 }
static int ast_fsread_audio | ( | const void * | data | ) | [static] |
Definition at line 768 of file file.c.
References ast_readaudio_callback(), and FSREAD_SUCCESS_SCHED.
Referenced by ast_readaudio_callback().
00769 { 00770 struct ast_filestream *fs = (struct ast_filestream *)data; 00771 enum fsread_res res; 00772 00773 res = ast_readaudio_callback(fs); 00774 00775 if (res == FSREAD_SUCCESS_SCHED) 00776 return 1; 00777 00778 return 0; 00779 }
static int ast_fsread_video | ( | const void * | data | ) | [static] |
Definition at line 808 of file file.c.
References ast_readvideo_callback(), and FSREAD_SUCCESS_SCHED.
Referenced by ast_readvideo_callback().
00809 { 00810 struct ast_filestream *fs = (struct ast_filestream *)data; 00811 enum fsread_res res; 00812 00813 res = ast_readvideo_callback(fs); 00814 00815 if (res == FSREAD_SUCCESS_SCHED) 00816 return 1; 00817 00818 return 0; 00819 }
struct ast_filestream* ast_openstream | ( | struct ast_channel * | chan, | |
const char * | filename, | |||
const char * | preflang | |||
) |
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 624 of file file.c.
References ast_openstream_full().
Referenced by ast_streamfile(), dictate_exec(), handle_getoption(), handle_streamfile(), and speech_streamfile().
00625 { 00626 return ast_openstream_full(chan, filename, preflang, 0); 00627 }
struct ast_filestream* ast_openstream_full | ( | struct ast_channel * | chan, | |
const char * | filename, | |||
const char * | preflang, | |||
int | asis | |||
) |
chan | channel to work with | |
filename | to use | |
preflang | prefered language to use | |
asis | if set, don't clear generators Returns a ast_filestream pointer if it opens the file, NULL on error |
Definition at line 629 of file file.c.
References ACTION_OPEN, ast_deactivate_generator(), ast_filehelper(), AST_FORMAT_AUDIO_MASK, ast_log(), ast_set_write_format(), ast_stopstream(), ast_filestream::buf, fileexists_core(), LOG_WARNING, ast_channel::oldwriteformat, ast_channel::stream, and ast_channel::writeformat.
Referenced by ast_moh_files_next(), ast_openstream(), and gen_nextfile().
00630 { 00631 /* 00632 * Use fileexists_core() to find a file in a compatible 00633 * language and format, set up a suitable translator, 00634 * and open the stream. 00635 */ 00636 int fmts, res, buflen; 00637 char *buf; 00638 00639 if (!asis) { 00640 /* do this first, otherwise we detect the wrong writeformat */ 00641 ast_stopstream(chan); 00642 if (chan->generator) 00643 ast_deactivate_generator(chan); 00644 } 00645 if (preflang == NULL) 00646 preflang = ""; 00647 buflen = strlen(preflang) + strlen(filename) + 4; 00648 buf = alloca(buflen); 00649 if (buf == NULL) 00650 return NULL; 00651 fmts = fileexists_core(filename, NULL, preflang, buf, buflen); 00652 if (fmts > 0) 00653 fmts &= AST_FORMAT_AUDIO_MASK; 00654 if (fmts < 1) { 00655 ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename); 00656 return NULL; 00657 } 00658 chan->oldwriteformat = chan->writeformat; 00659 /* Set the channel to a format we can work with */ 00660 res = ast_set_write_format(chan, fmts); 00661 res = ast_filehelper(buf, chan, NULL, ACTION_OPEN); 00662 if (res >= 0) 00663 return chan->stream; 00664 return NULL; 00665 }
struct ast_filestream* ast_openvstream | ( | struct ast_channel * | chan, | |
const char * | filename, | |||
const char * | preflang | |||
) |
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 667 of file file.c.
References ACTION_OPEN, ast_filehelper(), AST_FORMAT_MAX_AUDIO, AST_FORMAT_MAX_VIDEO, ast_getformatname(), ast_log(), ast_filestream::buf, fileexists_core(), ast_filestream::fmt, format, LOG_WARNING, ast_channel::nativeformats, and ast_channel::vstream.
Referenced by ast_streamfile(), handle_getoption(), and handle_streamfile().
00668 { 00669 /* As above, but for video. But here we don't have translators 00670 * so we must enforce a format. 00671 */ 00672 unsigned int format; 00673 char *buf; 00674 int buflen; 00675 00676 if (preflang == NULL) 00677 preflang = ""; 00678 buflen = strlen(preflang) + strlen(filename) + 4; 00679 buf = alloca(buflen); 00680 if (buf == NULL) 00681 return NULL; 00682 00683 for (format = AST_FORMAT_MAX_AUDIO << 1; format <= AST_FORMAT_MAX_VIDEO; format = format << 1) { 00684 int fd; 00685 const char *fmt; 00686 00687 if (!(chan->nativeformats & format)) 00688 continue; 00689 fmt = ast_getformatname(format); 00690 if ( fileexists_core(filename, fmt, preflang, buf, buflen) < 1) /* no valid format */ 00691 continue; 00692 fd = ast_filehelper(buf, chan, fmt, ACTION_OPEN); 00693 if (fd >= 0) 00694 return chan->vstream; 00695 ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename); 00696 } 00697 return NULL; 00698 }
int ast_playstream | ( | struct ast_filestream * | s | ) |
s | filestream to play Returns 0 for success, -1 on failure |
Definition at line 827 of file file.c.
References AST_FORMAT_MAX_AUDIO, ast_readaudio_callback(), ast_readvideo_callback(), FSREAD_FAILURE, and s.
Referenced by ast_streamfile(), handle_getoption(), handle_streamfile(), and speech_streamfile().
00828 { 00829 enum fsread_res res; 00830 00831 if (s->fmt->format < AST_FORMAT_MAX_AUDIO) 00832 res = ast_readaudio_callback(s); 00833 else 00834 res = ast_readvideo_callback(s); 00835 00836 return (res == FSREAD_FAILURE) ? -1 : 0; 00837 }
static enum fsread_res ast_readaudio_callback | ( | struct ast_filestream * | s | ) | [static] |
Definition at line 721 of file file.c.
References ast_format_rate(), ast_fsread_audio(), ast_log(), ast_sched_add(), ast_settimeout(), ast_write(), FSREAD_FAILURE, FSREAD_SUCCESS_NOSCHED, FSREAD_SUCCESS_SCHED, LOG_WARNING, and s.
Referenced by ast_fsread_audio(), and ast_playstream().
00722 { 00723 int whennext = 0; 00724 00725 while (!whennext) { 00726 struct ast_frame *fr; 00727 00728 if (s->orig_chan_name && strcasecmp(s->owner->name, s->orig_chan_name)) 00729 goto return_failure; 00730 00731 fr = s->fmt->read(s, &whennext); 00732 if (!fr /* stream complete */ || ast_write(s->owner, fr) /* error writing */) { 00733 if (fr) 00734 ast_log(LOG_WARNING, "Failed to write frame\n"); 00735 goto return_failure; 00736 } 00737 } 00738 if (whennext != s->lasttimeout) { 00739 #ifdef HAVE_DAHDI 00740 if (s->owner->timingfd > -1) { 00741 int zap_timer_samples = whennext; 00742 int rate; 00743 /* whennext is in samples, but DAHDI timers operate in 8 kHz samples. */ 00744 if ((rate = ast_format_rate(s->fmt->format)) != 8000) { 00745 float factor; 00746 factor = ((float) rate) / ((float) 8000.0); 00747 zap_timer_samples = (int) ( ((float) zap_timer_samples) / factor ); 00748 } 00749 ast_settimeout(s->owner, zap_timer_samples, ast_fsread_audio, s); 00750 } else 00751 #endif 00752 s->owner->streamid = ast_sched_add(s->owner->sched, 00753 whennext / (ast_format_rate(s->fmt->format) / 1000), 00754 ast_fsread_audio, s); 00755 s->lasttimeout = whennext; 00756 return FSREAD_SUCCESS_NOSCHED; 00757 } 00758 return FSREAD_SUCCESS_SCHED; 00759 00760 return_failure: 00761 s->owner->streamid = -1; 00762 #ifdef HAVE_DAHDI 00763 ast_settimeout(s->owner, 0, NULL, NULL); 00764 #endif 00765 return FSREAD_FAILURE; 00766 }
struct ast_filestream* ast_readfile | ( | const char * | filename, | |
const char * | type, | |||
const char * | comment, | |||
int | flags, | |||
int | check, | |||
mode_t | mode | |||
) |
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 949 of file file.c.
References ast_closestream(), AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log(), build_filename(), errno, ast_format::exts, exts_compare(), f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, free, get_filestream(), LOG_WARNING, ast_filestream::mode, open_wrapper(), strdup, ast_filestream::trans, and ast_filestream::vfs.
Referenced by __ast_play_and_record(), cli_audio_convert(), and cli_audio_convert_deprecated().
00950 { 00951 FILE *bfile; 00952 struct ast_format *f; 00953 struct ast_filestream *fs = NULL; 00954 char *fn; 00955 00956 if (AST_LIST_LOCK(&formats)) { 00957 ast_log(LOG_WARNING, "Unable to lock format list\n"); 00958 return NULL; 00959 } 00960 00961 AST_LIST_TRAVERSE(&formats, f, list) { 00962 fs = NULL; 00963 if (!exts_compare(f->exts, type)) 00964 continue; 00965 00966 fn = build_filename(filename, type); 00967 errno = 0; 00968 bfile = fopen(fn, "r"); 00969 if (!bfile || (fs = get_filestream(f, bfile)) == NULL || 00970 open_wrapper(fs) ) { 00971 ast_log(LOG_WARNING, "Unable to open %s\n", fn); 00972 if (fs) { 00973 ast_closestream(fs); 00974 } 00975 fs = NULL; 00976 bfile = NULL; 00977 free(fn); 00978 continue; 00979 } 00980 /* found it */ 00981 fs->trans = NULL; 00982 fs->fmt = f; 00983 fs->flags = flags; 00984 fs->mode = mode; 00985 fs->filename = strdup(filename); 00986 fs->vfs = NULL; 00987 break; 00988 } 00989 00990 AST_LIST_UNLOCK(&formats); 00991 if (!fs) 00992 ast_log(LOG_WARNING, "No such format '%s'\n", type); 00993 00994 return fs; 00995 }
struct ast_frame* ast_readframe | ( | struct ast_filestream * | s | ) |
s | ast_filestream to act on Returns a frame or NULL if read failed |
Definition at line 700 of file file.c.
References ao2_ref(), AST_FRFLAG_FROM_FILESTREAM, ast_set_flag, f, and s.
Referenced by __ast_play_and_record(), cli_audio_convert(), cli_audio_convert_deprecated(), dictate_exec(), gen_readframe(), and moh_files_readframe().
00701 { 00702 struct ast_frame *f = NULL; 00703 int whennext = 0; 00704 if (s && s->fmt) 00705 f = s->fmt->read(s, &whennext); 00706 if (f) { 00707 ast_set_flag(f, AST_FRFLAG_FROM_FILESTREAM); 00708 ao2_ref(s, +1); 00709 } 00710 return f; 00711 }
static enum fsread_res ast_readvideo_callback | ( | struct ast_filestream * | s | ) | [static] |
Definition at line 783 of file file.c.
References ast_format_rate(), ast_fsread_video(), ast_log(), ast_sched_add(), ast_write(), FSREAD_FAILURE, FSREAD_SUCCESS_NOSCHED, FSREAD_SUCCESS_SCHED, LOG_WARNING, and s.
Referenced by ast_fsread_video(), and ast_playstream().
00784 { 00785 int whennext = 0; 00786 00787 while (!whennext) { 00788 struct ast_frame *fr = s->fmt->read(s, &whennext); 00789 if (!fr || ast_write(s->owner, fr)) { /* no stream or error, as above */ 00790 if (fr) 00791 ast_log(LOG_WARNING, "Failed to write frame\n"); 00792 s->owner->vstreamid = -1; 00793 return FSREAD_FAILURE; 00794 } 00795 } 00796 00797 if (whennext != s->lasttimeout) { 00798 s->owner->vstreamid = ast_sched_add(s->owner->sched, 00799 whennext / (ast_format_rate(s->fmt->format) / 1000), 00800 ast_fsread_video, s); 00801 s->lasttimeout = whennext; 00802 return FSREAD_SUCCESS_NOSCHED; 00803 } 00804 00805 return FSREAD_SUCCESS_SCHED; 00806 }
int ast_seekstream | ( | struct ast_filestream * | fs, | |
off_t | sample_offset, | |||
int | whence | |||
) |
fs | 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 839 of file file.c.
References ast_filestream::fmt, and ast_format::seek.
Referenced by __ast_read(), ast_control_streamfile(), ast_stream_fastforward(), ast_stream_rewind(), ast_write(), dictate_exec(), handle_getoption(), handle_recordfile(), and handle_streamfile().
int ast_stopstream | ( | struct ast_channel * | c | ) |
Stops a stream.
c | The channel you wish to stop playback on |
0 | always |
Definition at line 138 of file file.c.
References ast_channel_lock, ast_channel_unlock, ast_closestream(), ast_log(), ast_set_write_format(), LOG_WARNING, ast_channel::oldwriteformat, ast_channel::stream, and ast_channel::vstream.
Referenced by ast_adsi_transmit_message_full(), ast_control_streamfile(), ast_openstream_full(), ast_play_and_wait(), ast_readstring_full(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cz(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_en(), ast_say_number_full_en_GB(), ast_say_number_full_es(), ast_say_number_full_fr(), ast_say_number_full_ge(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_it(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_tw(), background_detect_exec(), builtin_blindtransfer(), conf_exec(), conf_run(), directory_exec(), handle_getoption(), handle_streamfile(), ices_exec(), ivr_dispatch(), leave_voicemail(), mp3_exec(), NBScat_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_file(), play_mailbox_owner(), playback_exec(), queue_exec(), read_exec(), recordthread(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), sayfile(), saynum(), send_morse(), send_tone_telemetry(), send_waveform_to_channel(), speech_background(), vm_authenticate(), vm_execmain(), wait_for_winner(), waitstream_core(), and zapateller_exec().
00139 { 00140 ast_channel_lock(tmp); 00141 00142 /* Stop a running stream if there is one */ 00143 if (tmp->stream) { 00144 ast_closestream(tmp->stream); 00145 tmp->stream = NULL; 00146 if (tmp->oldwriteformat && ast_set_write_format(tmp, tmp->oldwriteformat)) 00147 ast_log(LOG_WARNING, "Unable to restore format back to %d\n", tmp->oldwriteformat); 00148 } 00149 /* Stop the video stream too */ 00150 if (tmp->vstream != NULL) { 00151 ast_closestream(tmp->vstream); 00152 tmp->vstream = NULL; 00153 } 00154 00155 ast_channel_unlock(tmp); 00156 00157 return 0; 00158 }
int ast_stream_and_wait | ( | struct ast_channel * | chan, | |
const char * | file, | |||
const char * | language, | |||
const char * | digits | |||
) |
Definition at line 1309 of file file.c.
References ast_streamfile(), ast_strlen_zero(), and ast_waitstream().
Referenced by __ast_play_and_record(), app_exec(), ast_record_review(), bridge_playfile(), builtin_automonitor(), builtin_blindtransfer(), directory_exec(), do_atxfer(), invent_message(), ivr_dispatch(), leave_voicemail(), park_exec(), play_mailbox_owner(), play_message_callerid(), play_record_review(), and wait_file2().
01311 { 01312 int res = 0; 01313 if (!ast_strlen_zero(file)) { 01314 res = ast_streamfile(chan, file, language); 01315 if (!res) 01316 res = ast_waitstream(chan, digits); 01317 } 01318 return res; 01319 }
int ast_stream_fastforward | ( | struct ast_filestream * | fs, | |
off_t | ms | |||
) |
fs | filestream to act on | |
ms | milliseconds to move Returns 0 for success, or -1 for error |
Definition at line 854 of file file.c.
References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.
Referenced by waitstream_core().
00855 { 00856 return ast_seekstream(fs, ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR); 00857 }
int ast_stream_rewind | ( | struct ast_filestream * | fs, | |
off_t | ms | |||
) |
fs | filestream to act on | |
ms | milliseconds to move Returns 0 for success, or -1 for error |
Definition at line 859 of file file.c.
References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.
Referenced by __ast_play_and_record(), handle_recordfile(), and waitstream_core().
00860 { 00861 return ast_seekstream(fs, -ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR); 00862 }
int ast_streamfile | ( | struct ast_channel * | c, | |
const char * | filename, | |||
const char * | preflang | |||
) |
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 918 of file file.c.
References ast_applystream(), AST_FLAG_MASQ_NOSTREAM, ast_getformatname(), ast_getformatname_multiple(), ast_log(), ast_openstream(), ast_openvstream(), ast_playstream(), ast_strdup, ast_test_flag, ast_verbose(), errno, ast_filestream::fmt, ast_format::format, LOG_DEBUG, LOG_WARNING, ast_channel::name, ast_channel::nativeformats, option_verbose, ast_filestream::orig_chan_name, VERBOSE_PREFIX_3, and ast_filestream::vfs.
Referenced by __login_exec(), agent_call(), announce_thread(), app_exec(), ast_app_getdata(), ast_app_getdata_full(), ast_control_streamfile(), ast_play_and_wait(), ast_say_date_da(), ast_say_date_de(), ast_say_date_en(), ast_say_date_fr(), ast_say_date_ge(), ast_say_date_gr(), ast_say_date_he(), ast_say_date_nl(), ast_say_date_with_format_gr(), ast_say_datetime_en(), ast_say_datetime_fr(), ast_say_datetime_from_now_en(), ast_say_datetime_from_now_fr(), ast_say_datetime_from_now_ge(), ast_say_datetime_from_now_he(), ast_say_datetime_gr(), ast_say_datetime_he(), ast_say_datetime_nl(), ast_say_datetime_pt(), ast_say_datetime_tw(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cz(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_en(), ast_say_number_full_en_GB(), ast_say_number_full_es(), ast_say_number_full_fr(), ast_say_number_full_ge(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_it(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_tw(), ast_say_time_de(), ast_say_time_en(), ast_say_time_fr(), ast_say_time_ge(), ast_say_time_gr(), ast_say_time_nl(), ast_say_time_tw(), ast_stream_and_wait(), background_detect_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_run(), do_directory(), forward_message(), gr_say_number_female(), handle_recordfile(), leave_voicemail(), page_exec(), park_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_greeting(), playback_exec(), privacy_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), sayfile(), ss_thread(), vm_authenticate(), wait_file(), and wait_for_winner().
00919 { 00920 struct ast_filestream *fs; 00921 struct ast_filestream *vfs=NULL; 00922 char fmt[256]; 00923 00924 fs = ast_openstream(chan, filename, preflang); 00925 if (fs) 00926 vfs = ast_openvstream(chan, filename, preflang); 00927 if (vfs) 00928 ast_log(LOG_DEBUG, "Ooh, found a video stream, too, format %s\n", ast_getformatname(vfs->fmt->format)); 00929 if (fs){ 00930 int res; 00931 if (ast_test_flag(chan, AST_FLAG_MASQ_NOSTREAM)) 00932 fs->orig_chan_name = ast_strdup(chan->name); 00933 if (ast_applystream(chan, fs)) 00934 return -1; 00935 if (vfs && ast_applystream(chan, vfs)) 00936 return -1; 00937 res = ast_playstream(fs); 00938 if (!res && vfs) 00939 res = ast_playstream(vfs); 00940 if (option_verbose > 2) 00941 ast_verbose(VERBOSE_PREFIX_3 "<%s> Playing '%s' (language '%s')\n", chan->name, filename, preflang ? preflang : "default"); 00942 00943 return res; 00944 } 00945 ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname_multiple(fmt, sizeof(fmt), chan->nativeformats), strerror(errno)); 00946 return -1; 00947 }
off_t ast_tellstream | ( | struct ast_filestream * | fs | ) |
fs | fs to act on Returns a long as a sample offset into stream |
Definition at line 849 of file file.c.
References ast_filestream::fmt, and ast_format::tell.
Referenced by __ast_play_and_record(), ast_control_streamfile(), handle_getoption(), handle_recordfile(), and handle_streamfile().
int ast_truncstream | ( | struct ast_filestream * | fs | ) |
fs | filestream to act on Returns 0 for success, or -1 for error |
Definition at line 844 of file file.c.
References ast_filestream::fmt, and ast_format::trunc.
Referenced by __ast_play_and_record(), and handle_recordfile().
int ast_waitstream | ( | struct ast_channel * | c, | |
const char * | breakon | |||
) |
c | channel to waitstream 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 1271 of file file.c.
References waitstream_core().
Referenced by __login_exec(), agent_call(), announce_thread(), app_exec(), ast_play_and_wait(), ast_say_date_da(), ast_say_date_de(), ast_say_date_en(), ast_say_date_es(), ast_say_date_fr(), ast_say_date_ge(), ast_say_date_gr(), ast_say_date_he(), ast_say_date_nl(), ast_say_date_with_format_gr(), ast_say_datetime_en(), ast_say_datetime_fr(), ast_say_datetime_from_now_en(), ast_say_datetime_from_now_fr(), ast_say_datetime_from_now_ge(), ast_say_datetime_from_now_he(), ast_say_datetime_gr(), ast_say_datetime_he(), ast_say_datetime_nl(), ast_say_datetime_pt(), ast_say_datetime_tw(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cz(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_en(), ast_say_number_full_en_GB(), ast_say_number_full_es(), ast_say_number_full_fr(), ast_say_number_full_ge(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_it(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_tw(), ast_say_time_de(), ast_say_time_en(), ast_say_time_ge(), ast_say_time_gr(), ast_say_time_he(), ast_say_time_nl(), ast_say_time_tw(), ast_stream_and_wait(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_run(), directory_exec(), gr_say_number_female(), handle_recordfile(), leave_voicemail(), page_exec(), park_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_greeting(), playback_exec(), privacy_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), sayfile(), saynum(), send_morse(), send_tone_telemetry(), ss_thread(), vm_authenticate(), and wait_file().
01272 { 01273 return waitstream_core(c, breakon, NULL, NULL, 0, -1, -1, NULL); 01274 }
int ast_waitstream_exten | ( | struct ast_channel * | c, | |
const char * | context | |||
) |
c | channel to waitstream on | |
context | string of context to match digits to break upon Begins playback of a stream... Wait for a stream to stop or for any one of a valid extension digit to arrive, Returns 0 if the stream finishes, the character if it was interrupted, and -1 on error |
Definition at line 1282 of file file.c.
References ast_channel::context, and waitstream_core().
Referenced by pbx_builtin_background().
01283 { 01284 /* Waitstream, with return in the case of a valid 1 digit extension */ 01285 /* in the current or specified context being pressed */ 01286 01287 if (!context) 01288 context = c->context; 01289 return waitstream_core(c, NULL, NULL, NULL, 0, 01290 -1, -1, context); 01291 }
int ast_waitstream_fr | ( | struct ast_channel * | c, | |
const char * | breakon, | |||
const char * | forward, | |||
const char * | rewind, | |||
int | ms | |||
) |
c | channel to waitstream 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 1265 of file file.c.
References waitstream_core().
Referenced by ast_control_streamfile().
01266 { 01267 return waitstream_core(c, breakon, forward, rewind, ms, 01268 -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */); 01269 }
int ast_waitstream_full | ( | struct ast_channel * | c, | |
const char * | breakon, | |||
int | audiofd, | |||
int | cmdfd | |||
) |
Definition at line 1276 of file file.c.
References waitstream_core().
Referenced by ast_readstring_full(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cz(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_en(), ast_say_number_full_en_GB(), ast_say_number_full_es(), ast_say_number_full_fr(), ast_say_number_full_ge(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_it(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_tw(), handle_getoption(), handle_streamfile(), pl_odtworz_plik(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), and say_phonetic_str_full().
01277 { 01278 return waitstream_core(c, breakon, NULL, NULL, 0, 01279 audiofd, cmdfd, NULL /* no context */); 01280 }
struct ast_filestream* ast_writefile | ( | const char * | filename, | |
const char * | type, | |||
const char * | comment, | |||
int | flags, | |||
int | check, | |||
mode_t | mode | |||
) |
filename | the name of the file to write to | |
type | format of file you wish to write out to | |
comment | comment to go with | |
flags | 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 997 of file file.c.
References ast_closestream(), AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log(), ast_opt_cache_record_files, ast_strdupa, ast_filestream::buf, build_filename(), errno, ast_format::exts, exts_compare(), f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, free, get_filestream(), LOG_WARNING, ast_filestream::mode, ast_filestream::realfilename, record_cache_dir, rewrite_wrapper(), ast_format::seek, strdup, ast_filestream::trans, and ast_filestream::vfs.
Referenced by __ast_play_and_record(), ast_monitor_start(), ast_writestream(), cli_audio_convert(), cli_audio_convert_deprecated(), dictate_exec(), handle_recordfile(), mixmonitor_thread(), recordthread(), and rpt().
00998 { 00999 int fd, myflags = 0; 01000 /* compiler claims this variable can be used before initialization... */ 01001 FILE *bfile = NULL; 01002 struct ast_format *f; 01003 struct ast_filestream *fs = NULL; 01004 char *buf = NULL; 01005 size_t size = 0; 01006 int format_found = 0; 01007 01008 if (AST_LIST_LOCK(&formats)) { 01009 ast_log(LOG_WARNING, "Unable to lock format list\n"); 01010 return NULL; 01011 } 01012 01013 /* set the O_TRUNC flag if and only if there is no O_APPEND specified */ 01014 /* We really can't use O_APPEND as it will break WAV header updates */ 01015 if (flags & O_APPEND) { 01016 flags &= ~O_APPEND; 01017 } else { 01018 myflags = O_TRUNC; 01019 } 01020 01021 myflags |= O_WRONLY | O_CREAT; 01022 01023 /* XXX need to fix this - we should just do the fopen, 01024 * not open followed by fdopen() 01025 */ 01026 AST_LIST_TRAVERSE(&formats, f, list) { 01027 char *fn, *orig_fn = NULL; 01028 if (fs) 01029 break; 01030 01031 if (!exts_compare(f->exts, type)) 01032 continue; 01033 else 01034 format_found = 1; 01035 01036 fn = build_filename(filename, type); 01037 fd = open(fn, flags | myflags, mode); 01038 if (fd > -1) { 01039 /* fdopen() the resulting file stream */ 01040 bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w"); 01041 if (!bfile) { 01042 ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno)); 01043 close(fd); 01044 fd = -1; 01045 } 01046 } 01047 01048 if (ast_opt_cache_record_files && (fd > -1)) { 01049 char *c; 01050 01051 fclose(bfile); /* this also closes fd */ 01052 /* 01053 We touch orig_fn just as a place-holder so other things (like vmail) see the file is there. 01054 What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place. 01055 */ 01056 orig_fn = ast_strdupa(fn); 01057 for (c = fn; *c; c++) 01058 if (*c == '/') 01059 *c = '_'; 01060 01061 size = strlen(fn) + strlen(record_cache_dir) + 2; 01062 buf = alloca(size); 01063 strcpy(buf, record_cache_dir); 01064 strcat(buf, "/"); 01065 strcat(buf, fn); 01066 free(fn); 01067 fn = buf; 01068 fd = open(fn, flags | myflags, mode); 01069 if (fd > -1) { 01070 /* fdopen() the resulting file stream */ 01071 bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w"); 01072 if (!bfile) { 01073 ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno)); 01074 close(fd); 01075 fd = -1; 01076 } 01077 } 01078 } 01079 if (fd > -1) { 01080 errno = 0; 01081 fs = get_filestream(f, bfile); 01082 if (!fs || rewrite_wrapper(fs, comment)) { 01083 ast_log(LOG_WARNING, "Unable to rewrite %s\n", fn); 01084 close(fd); 01085 if (orig_fn) { 01086 unlink(fn); 01087 unlink(orig_fn); 01088 } 01089 if (fs) { 01090 ast_closestream(fs); 01091 fs = NULL; 01092 } 01093 continue; 01094 } 01095 fs->trans = NULL; 01096 fs->fmt = f; 01097 fs->flags = flags; 01098 fs->mode = mode; 01099 if (orig_fn) { 01100 fs->realfilename = strdup(orig_fn); 01101 fs->filename = strdup(fn); 01102 } else { 01103 fs->realfilename = NULL; 01104 fs->filename = strdup(filename); 01105 } 01106 fs->vfs = NULL; 01107 /* If truncated, we'll be at the beginning; if not truncated, then append */ 01108 f->seek(fs, 0, SEEK_END); 01109 } else if (errno != EEXIST) { 01110 ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno)); 01111 if (orig_fn) 01112 unlink(orig_fn); 01113 } 01114 /* if buf != NULL then fn is already free and pointing to it */ 01115 if (!buf) 01116 free(fn); 01117 } 01118 01119 AST_LIST_UNLOCK(&formats); 01120 01121 if (!format_found) 01122 ast_log(LOG_WARNING, "No such format '%s'\n", type); 01123 01124 return fs; 01125 }
int ast_writestream | ( | struct ast_filestream * | fs, | |
struct ast_frame * | f | |||
) |
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 160 of file file.c.
References AST_FORMAT_MAX_AUDIO, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_frfree, ast_getformatname(), ast_log(), ast_translate(), ast_translator_build_path(), ast_translator_free_path(), ast_writefile(), ast_writestream(), f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, ast_format::format, ast_filestream::lastwriteformat, LOG_DEBUG, LOG_WARNING, ast_filestream::mode, ast_format::name, ast_filestream::trans, type, ast_filestream::vfs, and ast_format::write.
Referenced by __ast_play_and_record(), __ast_read(), ast_write(), ast_writestream(), cli_audio_convert(), cli_audio_convert_deprecated(), dictate_exec(), handle_recordfile(), mixmonitor_thread(), recordthread(), and rpt().
00161 { 00162 int res = -1; 00163 int alt = 0; 00164 if (f->frametype == AST_FRAME_VIDEO) { 00165 if (fs->fmt->format < AST_FORMAT_MAX_AUDIO) { 00166 /* This is the audio portion. Call the video one... */ 00167 if (!fs->vfs && fs->filename) { 00168 const char *type = ast_getformatname(f->subclass & ~0x1); 00169 fs->vfs = ast_writefile(fs->filename, type, NULL, fs->flags, 0, fs->mode); 00170 ast_log(LOG_DEBUG, "Opened video output file\n"); 00171 } 00172 if (fs->vfs) 00173 return ast_writestream(fs->vfs, f); 00174 /* else ignore */ 00175 return 0; 00176 } else { 00177 /* Might / might not have mark set */ 00178 alt = 1; 00179 } 00180 } else if (f->frametype != AST_FRAME_VOICE) { 00181 ast_log(LOG_WARNING, "Tried to write non-voice frame\n"); 00182 return -1; 00183 } 00184 if (((fs->fmt->format | alt) & f->subclass) == f->subclass) { 00185 res = fs->fmt->write(fs, f); 00186 if (res < 0) 00187 ast_log(LOG_WARNING, "Natural write failed\n"); 00188 else if (res > 0) 00189 ast_log(LOG_WARNING, "Huh??\n"); 00190 } else { 00191 /* XXX If they try to send us a type of frame that isn't the normal frame, and isn't 00192 the one we've setup a translator for, we do the "wrong thing" XXX */ 00193 if (fs->trans && f->subclass != fs->lastwriteformat) { 00194 ast_translator_free_path(fs->trans); 00195 fs->trans = NULL; 00196 } 00197 if (!fs->trans) 00198 fs->trans = ast_translator_build_path(fs->fmt->format, f->subclass); 00199 if (!fs->trans) 00200 ast_log(LOG_WARNING, "Unable to translate to format %s, source format %s\n", 00201 fs->fmt->name, ast_getformatname(f->subclass)); 00202 else { 00203 struct ast_frame *trf; 00204 fs->lastwriteformat = f->subclass; 00205 /* Get the translated frame but don't consume the original in case they're using it on another stream */ 00206 trf = ast_translate(fs->trans, f, 0); 00207 if (trf) { 00208 res = fs->fmt->write(fs, trf); 00209 ast_frfree(trf); 00210 if (res) 00211 ast_log(LOG_WARNING, "Translated frame write failed\n"); 00212 } else 00213 res = 0; 00214 } 00215 } 00216 return res; 00217 }
static char* build_filename | ( | const char * | filename, | |
const char * | ext | |||
) | [static] |
construct a filename. Absolute pathnames are preserved, relative names are prefixed by the sounds/ directory. The wav49 suffix is replaced by 'WAV'. Returns a malloc'ed string to be freed by the caller.
Definition at line 262 of file file.c.
References asprintf, ast_config_AST_DATA_DIR, ast_log(), errno, and LOG_WARNING.
Referenced by ast_filehelper(), ast_readfile(), and ast_writefile().
00263 { 00264 char *fn = NULL; 00265 00266 if (!strcmp(ext, "wav49")) 00267 ext = "WAV"; 00268 00269 if (filename[0] == '/') { 00270 if (asprintf(&fn, "%s.%s", filename, ext) < 0) { 00271 ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno)); 00272 fn = NULL; 00273 } 00274 } else { 00275 if (asprintf(&fn, "%s/sounds/%s.%s", 00276 ast_config_AST_DATA_DIR, filename, ext) < 0) { 00277 ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno)); 00278 fn = NULL; 00279 } 00280 } 00281 return fn; 00282 }
static int copy | ( | const char * | infile, | |
const char * | outfile | |||
) | [static] |
Definition at line 219 of file file.c.
References ast_log(), errno, len(), and LOG_WARNING.
Referenced by action_getvar(), ast_filehelper(), copy_plain_file(), iax2_register(), and transcoder_show().
00220 { 00221 int ifd, ofd, len; 00222 char buf[4096]; /* XXX make it lerger. */ 00223 00224 if ((ifd = open(infile, O_RDONLY)) < 0) { 00225 ast_log(LOG_WARNING, "Unable to open %s in read-only mode\n", infile); 00226 return -1; 00227 } 00228 if ((ofd = open(outfile, O_WRONLY | O_TRUNC | O_CREAT, 0600)) < 0) { 00229 ast_log(LOG_WARNING, "Unable to open %s in write-only mode\n", outfile); 00230 close(ifd); 00231 return -1; 00232 } 00233 while ( (len = read(ifd, buf, sizeof(buf)) ) ) { 00234 int res; 00235 if (len < 0) { 00236 ast_log(LOG_WARNING, "Read failed on %s: %s\n", infile, strerror(errno)); 00237 break; 00238 } 00239 /* XXX handle partial writes */ 00240 res = write(ofd, buf, len); 00241 if (res != len) { 00242 ast_log(LOG_WARNING, "Write failed on %s (%d of %d): %s\n", outfile, res, len, strerror(errno)); 00243 len = -1; /* error marker */ 00244 break; 00245 } 00246 } 00247 close(ifd); 00248 close(ofd); 00249 if (len < 0) { 00250 unlink(outfile); 00251 return -1; /* error */ 00252 } 00253 return 0; /* success */ 00254 }
static int exts_compare | ( | const char * | exts, | |
const char * | type | |||
) | [static] |
Definition at line 286 of file file.c.
References ast_copy_string(), and ext.
Referenced by ast_filehelper(), ast_readfile(), and ast_writefile().
00287 { 00288 char tmp[256]; 00289 char *stringp = tmp, *ext; 00290 00291 ast_copy_string(tmp, exts, sizeof(tmp)); 00292 while ((ext = strsep(&stringp, "|"))) { 00293 if (!strcmp(ext, type)) 00294 return 1; 00295 } 00296 00297 return 0; 00298 }
static int fileexists_core | ( | const char * | filename, | |
const char * | fmt, | |||
const char * | preflang, | |||
char * | buf, | |||
int | buflen | |||
) | [static] |
helper routine to locate a file with a given format and language preference. Try preflang, preflang with stripped '_' suffix, or NULL. In the standard asterisk, language goes just before the last component. In an alternative configuration, the language should be a prefix to the actual filename.
The last parameter(s) point to a buffer of sufficient size, which on success is filled with the matching filename.
Definition at line 573 of file file.c.
References ast_strdupa, ast_strlen_zero(), DEFAULT_LANGUAGE, and fileexists_test().
Referenced by ast_fileexists(), ast_openstream_full(), and ast_openvstream().
00575 { 00576 int res = -1; 00577 char *lang = NULL; 00578 00579 if (buf == NULL) { 00580 return -1; 00581 } 00582 00583 /* We try languages in the following order: 00584 * preflang (may include dialect) 00585 * lang (preflang without dialect - if any) 00586 * <none> 00587 * default (unless the same as preflang or lang without dialect) 00588 */ 00589 00590 /* Try preferred language */ 00591 if (!ast_strlen_zero(preflang)) { 00592 /* try the preflang exactly as it was requested */ 00593 if ((res = fileexists_test(filename, fmt, preflang, buf, buflen)) > 0) { 00594 return res; 00595 } else { 00596 /* try without a dialect */ 00597 char *postfix = NULL; 00598 postfix = lang = ast_strdupa(preflang); 00599 00600 strsep(&postfix, "_"); 00601 if (postfix) { 00602 if ((res = fileexists_test(filename, fmt, lang, buf, buflen)) > 0) { 00603 return res; 00604 } 00605 } 00606 } 00607 } 00608 00609 /* Try without any language */ 00610 if ((res = fileexists_test(filename, fmt, NULL, buf, buflen)) > 0) { 00611 return res; 00612 } 00613 00614 /* Finally try the default language unless it was already tried before */ 00615 if ((ast_strlen_zero(preflang) || strcmp(preflang, DEFAULT_LANGUAGE)) && (ast_strlen_zero(lang) || strcmp(lang, DEFAULT_LANGUAGE))) { 00616 if ((res = fileexists_test(filename, fmt, DEFAULT_LANGUAGE, buf, buflen)) > 0) { 00617 return res; 00618 } 00619 } 00620 00621 return 0; 00622 }
static int fileexists_test | ( | const char * | filename, | |
const char * | fmt, | |||
const char * | lang, | |||
char * | buf, | |||
int | buflen | |||
) | [static] |
Definition at line 536 of file file.c.
References ACTION_EXISTS, ast_filehelper(), is_absolute_path(), and offset.
Referenced by fileexists_core().
00538 { 00539 if (buf == NULL) { 00540 return -1; 00541 } 00542 00543 if (ast_language_is_prefix && !is_absolute_path(filename)) { /* new layout */ 00544 if (lang) { 00545 snprintf(buf, buflen, "%s/%s", lang, filename); 00546 } else { 00547 snprintf(buf, buflen, "%s", filename); 00548 } 00549 } else { /* old layout */ 00550 strcpy(buf, filename); /* first copy the full string */ 00551 if (lang) { 00552 /* insert the language and suffix if needed */ 00553 const char *c = strrchr(filename, '/'); 00554 int offset = c ? c - filename + 1 : 0; /* points right after the last '/' */ 00555 snprintf(buf + offset, buflen - offset, "%s/%s", lang, filename + offset); 00556 } 00557 } 00558 00559 return ast_filehelper(buf, NULL, fmt, ACTION_EXISTS); 00560 }
static void filestream_destructor | ( | void * | arg | ) | [static] |
Definition at line 300 of file file.c.
References ast_closestream(), AST_FORMAT_MAX_AUDIO, ast_module_unref(), ast_safe_system(), AST_SCHED_DEL, ast_settimeout(), ast_translator_free_path(), ast_format::close, f, ast_format::format, free, and ast_format::module.
Referenced by get_filestream().
00301 { 00302 char *cmd = NULL; 00303 size_t size = 0; 00304 struct ast_filestream *f = arg; 00305 00306 /* Stop a running stream if there is one */ 00307 if (f->owner) { 00308 if (f->fmt->format < AST_FORMAT_MAX_AUDIO) { 00309 f->owner->stream = NULL; 00310 AST_SCHED_DEL(f->owner->sched, f->owner->streamid); 00311 #ifdef HAVE_DAHDI 00312 ast_settimeout(f->owner, 0, NULL, NULL); 00313 #endif 00314 } else { 00315 f->owner->vstream = NULL; 00316 AST_SCHED_DEL(f->owner->sched, f->owner->vstreamid); 00317 } 00318 } 00319 /* destroy the translator on exit */ 00320 if (f->trans) 00321 ast_translator_free_path(f->trans); 00322 00323 if (f->realfilename && f->filename) { 00324 size = strlen(f->filename) + strlen(f->realfilename) + 15; 00325 cmd = alloca(size); 00326 memset(cmd,0,size); 00327 snprintf(cmd,size,"/bin/mv -f %s %s",f->filename,f->realfilename); 00328 ast_safe_system(cmd); 00329 } 00330 00331 if (f->filename) 00332 free(f->filename); 00333 if (f->realfilename) 00334 free(f->realfilename); 00335 if (f->fmt->close) 00336 f->fmt->close(f); 00337 if (f->f) 00338 fclose(f->f); 00339 if (f->vfs) 00340 ast_closestream(f->vfs); 00341 if (f->orig_chan_name) 00342 free((void *) f->orig_chan_name); 00343 ast_module_unref(f->fmt->module); 00344 }
static int fn_wrapper | ( | struct ast_filestream * | s, | |
const char * | comment, | |||
enum wrap_fn | mode | |||
) | [static] |
Definition at line 370 of file file.c.
References ast_log(), ast_module_ref(), f, LOG_WARNING, ast_format::module, ast_format::name, ast_format::open, ast_format::rewrite, s, and WRAP_OPEN.
Referenced by open_wrapper(), and rewrite_wrapper().
00371 { 00372 struct ast_format *f = s->fmt; 00373 int ret = -1; 00374 00375 if (mode == WRAP_OPEN && f->open && f->open(s)) 00376 ast_log(LOG_WARNING, "Unable to open format %s\n", f->name); 00377 else if (mode == WRAP_REWRITE && f->rewrite && f->rewrite(s, comment)) 00378 ast_log(LOG_WARNING, "Unable to rewrite format %s\n", f->name); 00379 else { 00380 /* preliminary checks succeed. update usecount */ 00381 ast_module_ref(f->module); 00382 ret = 0; 00383 } 00384 return ret; 00385 }
static struct ast_filestream* get_filestream | ( | struct ast_format * | fmt, | |
FILE * | bfile | |||
) | [static] |
Definition at line 346 of file file.c.
References ao2_alloc(), ast_format::buf_size, ast_format::desc_size, filestream_destructor(), ast_filestream::fmt, ast_format::name, and s.
Referenced by ast_filehelper(), ast_readfile(), and ast_writefile().
00347 { 00348 struct ast_filestream *s; 00349 00350 int l = sizeof(*s) + fmt->buf_size + fmt->desc_size; /* total allocation size */ 00351 if ( (s = ao2_alloc(l, filestream_destructor)) == NULL) 00352 return NULL; 00353 s->fmt = fmt; 00354 s->f = bfile; 00355 00356 if (fmt->desc_size) 00357 s->_private = ((char *)(s+1)) + fmt->buf_size; 00358 if (fmt->buf_size) 00359 s->buf = (char *)(s+1); 00360 s->fr.src = fmt->name; 00361 return s; 00362 }
static int is_absolute_path | ( | const char * | filename | ) | [static] |
Definition at line 531 of file file.c.
Referenced by fileexists_test().
00532 { 00533 return filename[0] == '/'; 00534 }
static int open_wrapper | ( | struct ast_filestream * | s | ) | [static] |
Definition at line 392 of file file.c.
References fn_wrapper(), s, and WRAP_OPEN.
Referenced by ast_filehelper(), and ast_readfile().
00393 { 00394 return fn_wrapper(s, NULL, WRAP_OPEN); 00395 }
static int rewrite_wrapper | ( | struct ast_filestream * | s, | |
const char * | comment | |||
) | [static] |
Definition at line 387 of file file.c.
References fn_wrapper(), and s.
Referenced by ast_writefile().
00388 { 00389 return fn_wrapper(s, comment, WRAP_REWRITE); 00390 }
static int show_file_formats | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1321 of file file.c.
References ast_cli(), ast_getformatname(), AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log(), ast_format::exts, f, ast_format::format, FORMAT, FORMAT2, ast_format::list, LOG_WARNING, ast_format::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01322 { 01323 #define FORMAT "%-10s %-10s %-20s\n" 01324 #define FORMAT2 "%-10s %-10s %-20s\n" 01325 struct ast_format *f; 01326 int count_fmt = 0; 01327 01328 if (argc != 4) 01329 return RESULT_SHOWUSAGE; 01330 ast_cli(fd, FORMAT, "Format", "Name", "Extensions"); 01331 01332 if (AST_LIST_LOCK(&formats)) { 01333 ast_log(LOG_WARNING, "Unable to lock format list\n"); 01334 return -1; 01335 } 01336 01337 AST_LIST_TRAVERSE(&formats, f, list) { 01338 ast_cli(fd, FORMAT2, ast_getformatname(f->format), f->name, f->exts); 01339 count_fmt++; 01340 } 01341 AST_LIST_UNLOCK(&formats); 01342 ast_cli(fd, "%d file formats registered.\n", count_fmt); 01343 return RESULT_SUCCESS; 01344 #undef FORMAT 01345 #undef FORMAT2 01346 }
static int show_file_formats_deprecated | ( | int | fd, | |
int | argc, | |||
char * | argv[] | |||
) | [static] |
Definition at line 1348 of file file.c.
References ast_cli(), ast_getformatname(), AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log(), ast_format::exts, f, ast_format::format, FORMAT, FORMAT2, ast_format::list, LOG_WARNING, ast_format::name, RESULT_SHOWUSAGE, and RESULT_SUCCESS.
01349 { 01350 #define FORMAT "%-10s %-10s %-20s\n" 01351 #define FORMAT2 "%-10s %-10s %-20s\n" 01352 struct ast_format *f; 01353 int count_fmt = 0; 01354 01355 if (argc != 3) 01356 return RESULT_SHOWUSAGE; 01357 ast_cli(fd, FORMAT, "Format", "Name", "Extensions"); 01358 01359 if (AST_LIST_LOCK(&formats)) { 01360 ast_log(LOG_WARNING, "Unable to lock format list\n"); 01361 return -1; 01362 } 01363 01364 AST_LIST_TRAVERSE(&formats, f, list) { 01365 ast_cli(fd, FORMAT2, ast_getformatname(f->format), f->name, f->exts); 01366 count_fmt++; 01367 } 01368 AST_LIST_UNLOCK(&formats); 01369 ast_cli(fd, "%d file formats registered.\n", count_fmt); 01370 return RESULT_SUCCESS; 01371 #undef FORMAT 01372 #undef FORMAT2 01373 }
static int waitstream_core | ( | struct ast_channel * | c, | |
const char * | breakon, | |||
const char * | forward, | |||
const char * | rewind, | |||
int | skip_ms, | |||
int | audiofd, | |||
int | cmdfd, | |||
const char * | context | |||
) | [static] |
the core of all waitstream() functions
Definition at line 1130 of file file.c.
References ast_channel::_softhangup, ast_clear_flag, AST_CONTROL_ANSWER, AST_CONTROL_BUSY, AST_CONTROL_CONGESTION, AST_CONTROL_HANGUP, AST_CONTROL_HOLD, AST_CONTROL_PROCEEDING, AST_CONTROL_PROGRESS, AST_CONTROL_RINGING, AST_CONTROL_SRCUPDATE, AST_CONTROL_UNHOLD, AST_CONTROL_VIDUPDATE, ast_exists_extension(), AST_FLAG_END_DTMF_ONLY, AST_FLAG_MASQ_NOSTREAM, AST_FRAME_CONTROL, AST_FRAME_DTMF_END, AST_FRAME_VOICE, ast_frfree, ast_log(), ast_read(), ast_sched_runq(), ast_sched_wait(), ast_set_flag, ast_stopstream(), ast_strdupa, ast_stream_fastforward(), ast_stream_rewind(), ast_test_flag, ast_waitfor(), ast_waitfor_nandfds(), ast_channel::cid, ast_callerid::cid_num, ast_frame::data, ast_frame::datalen, errno, exten, ast_frame::frametype, LOG_WARNING, ast_channel::name, ast_filestream::orig_chan_name, ast_channel::sched, ast_channel::stream, and ast_frame::subclass.
Referenced by ast_waitstream(), ast_waitstream_exten(), ast_waitstream_fr(), and ast_waitstream_full().
01133 { 01134 const char *orig_chan_name = NULL; 01135 int err = 0; 01136 01137 if (!breakon) 01138 breakon = ""; 01139 if (!forward) 01140 forward = ""; 01141 if (!rewind) 01142 rewind = ""; 01143 01144 /* Switch the channel to end DTMF frame only. waitstream_core doesn't care about the start of DTMF. */ 01145 ast_set_flag(c, AST_FLAG_END_DTMF_ONLY); 01146 01147 if (ast_test_flag(c, AST_FLAG_MASQ_NOSTREAM)) 01148 orig_chan_name = ast_strdupa(c->name); 01149 01150 while (c->stream) { 01151 int res; 01152 int ms; 01153 01154 if (orig_chan_name && strcasecmp(orig_chan_name, c->name)) { 01155 ast_stopstream(c); 01156 err = 1; 01157 break; 01158 } 01159 01160 ms = ast_sched_wait(c->sched); 01161 01162 if (ms < 0 && !c->timingfunc) { 01163 ast_stopstream(c); 01164 break; 01165 } 01166 if (ms < 0) 01167 ms = 1000; 01168 if (cmdfd < 0) { 01169 res = ast_waitfor(c, ms); 01170 if (res < 0) { 01171 ast_log(LOG_WARNING, "Select failed (%s)\n", strerror(errno)); 01172 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY); 01173 return res; 01174 } 01175 } else { 01176 int outfd; 01177 struct ast_channel *rchan = ast_waitfor_nandfds(&c, 1, &cmdfd, (cmdfd > -1) ? 1 : 0, NULL, &outfd, &ms); 01178 if (!rchan && (outfd < 0) && (ms)) { 01179 /* Continue */ 01180 if (errno == EINTR) 01181 continue; 01182 ast_log(LOG_WARNING, "Wait failed (%s)\n", strerror(errno)); 01183 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY); 01184 return -1; 01185 } else if (outfd > -1) { /* this requires cmdfd set */ 01186 /* The FD we were watching has something waiting */ 01187 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY); 01188 return 1; 01189 } 01190 /* if rchan is set, it is 'c' */ 01191 res = rchan ? 1 : 0; /* map into 'res' values */ 01192 } 01193 if (res > 0) { 01194 struct ast_frame *fr = ast_read(c); 01195 if (!fr) { 01196 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY); 01197 return -1; 01198 } 01199 switch(fr->frametype) { 01200 case AST_FRAME_DTMF_END: 01201 if (context) { 01202 const char exten[2] = { fr->subclass, '\0' }; 01203 if (ast_exists_extension(c, context, exten, 1, c->cid.cid_num)) { 01204 res = fr->subclass; 01205 ast_frfree(fr); 01206 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY); 01207 return res; 01208 } 01209 } else { 01210 res = fr->subclass; 01211 if (strchr(forward,res)) { 01212 ast_stream_fastforward(c->stream, skip_ms); 01213 } else if (strchr(rewind,res)) { 01214 ast_stream_rewind(c->stream, skip_ms); 01215 } else if (strchr(breakon, res)) { 01216 ast_frfree(fr); 01217 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY); 01218 return res; 01219 } 01220 } 01221 break; 01222 case AST_FRAME_CONTROL: 01223 switch(fr->subclass) { 01224 case AST_CONTROL_HANGUP: 01225 case AST_CONTROL_BUSY: 01226 case AST_CONTROL_CONGESTION: 01227 ast_frfree(fr); 01228 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY); 01229 return -1; 01230 case AST_CONTROL_RINGING: 01231 case AST_CONTROL_ANSWER: 01232 case AST_CONTROL_VIDUPDATE: 01233 case AST_CONTROL_SRCUPDATE: 01234 case AST_CONTROL_HOLD: 01235 case AST_CONTROL_UNHOLD: 01236 case AST_CONTROL_PROGRESS: 01237 case AST_CONTROL_PROCEEDING: 01238 /* Unimportant */ 01239 break; 01240 default: 01241 ast_log(LOG_WARNING, "Unexpected control subclass '%d'\n", fr->subclass); 01242 } 01243 break; 01244 case AST_FRAME_VOICE: 01245 /* Write audio if appropriate */ 01246 if (audiofd > -1) { 01247 if (write(audiofd, fr->data, fr->datalen) < 0) { 01248 ast_log(LOG_WARNING, "write() failed: %s\n", strerror(errno)); 01249 } 01250 } 01251 default: 01252 /* Ignore all others */ 01253 break; 01254 } 01255 ast_frfree(fr); 01256 } 01257 ast_sched_runq(c->sched); 01258 } 01259 01260 ast_clear_flag(c, AST_FLAG_END_DTMF_ONLY); 01261 01262 return (err || c->_softhangup) ? -1 : 0; 01263 }
struct ast_cli_entry cli_file[] |
Initial value:
{ { { "core", "show", "file", "formats" }, show_file_formats, "Displays file formats", show_file_formats_usage, NULL, &cli_show_file_formats_deprecated }, }
Definition at line 1384 of file file.c.
Referenced by ast_file_init().
Initial value:
{ { "show", "file", "formats" }, show_file_formats_deprecated, NULL, NULL }
char show_file_formats_usage[] |