Fri Feb 10 06:36:05 2012

Asterisk developer's documentation


file.h File Reference

Generic File Format Support. Should be included by clients of the file handling routines. File service providers should instead include mod_format.h. More...

Go to the source code of this file.

Defines

#define AST_DIGIT_ANY   "0123456789#*ABCD"
#define AST_DIGIT_ANYNUM   "0123456789"
#define AST_DIGIT_NONE   ""
#define AST_MAX_FORMATS   10
#define AST_RESERVED_POINTERS   20
#define SEEK_FORCECUR   10

Functions

int ast_applystream (struct ast_channel *chan, struct ast_filestream *s)
 Applys a open stream to a channel.
int ast_closestream (struct ast_filestream *f)
 Closes a stream.
int ast_file_init (void)
int ast_filecopy (const char *oldname, const char *newname, const char *fmt)
 Copies a file.
int ast_filedelete (const char *filename, const char *fmt)
 Deletes a file.
int ast_fileexists (const char *filename, const char *fmt, const char *preflang)
 Checks for the existence of a given file.
int ast_filerename (const char *oldname, const char *newname, const char *fmt)
 Renames a file.
char * ast_format_str_reduce (char *fmts)
struct ast_filestreamast_openstream (struct ast_channel *chan, const char *filename, const char *preflang)
 Opens stream for use in seeking, playing.
struct ast_filestreamast_openstream_full (struct ast_channel *chan, const char *filename, const char *preflang, int asis)
 Opens stream for use in seeking, playing.
struct ast_filestreamast_openvstream (struct ast_channel *chan, const char *filename, const char *preflang)
 Opens stream for use in seeking, playing.
int ast_playstream (struct ast_filestream *s)
 Play a open stream on a channel.
struct ast_filestreamast_readfile (const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode)
 Starts reading from a file.
struct ast_frameast_readframe (struct ast_filestream *s)
 Read a frame from a filestream.
int ast_seekstream (struct ast_filestream *fs, off_t sample_offset, int whence)
 Seeks into stream.
int ast_stopstream (struct ast_channel *c)
 Stops a stream.
int ast_stream_and_wait (struct ast_channel *chan, const char *file, const char *digits)
 stream file until digit If the file name is non-empty, try to play it.
int ast_stream_fastforward (struct ast_filestream *fs, off_t ms)
 Fast forward stream ms.
int ast_stream_rewind (struct ast_filestream *fs, off_t ms)
 Rewind stream ms.
int ast_streamfile (struct ast_channel *c, const char *filename, const char *preflang)
 Streams a file.
off_t ast_tellstream (struct ast_filestream *fs)
 Tell where we are in a stream.
int ast_truncstream (struct ast_filestream *fs)
 Trunc stream at current location.
int ast_waitstream (struct ast_channel *c, const char *breakon)
 Waits for a stream to stop or digit to be pressed.
int ast_waitstream_exten (struct ast_channel *c, const char *context)
 Waits for a stream to stop or digit matching a valid one digit exten to be pressed.
int ast_waitstream_fr (struct ast_channel *c, const char *breakon, const char *forward, const char *rewind, int ms)
 Same as waitstream but allows stream to be forwarded or rewound.
int ast_waitstream_full (struct ast_channel *c, const char *breakon, int audiofd, int monfd)
struct ast_filestreamast_writefile (const char *filename, const char *type, const 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.


Detailed Description

Generic File Format Support. Should be included by clients of the file handling routines. File service providers should instead include mod_format.h.

Definition in file file.h.


Define Documentation

#define AST_DIGIT_ANY   "0123456789#*ABCD"

#define AST_DIGIT_ANYNUM   "0123456789"

Definition at line 49 of file file.h.

Referenced by initreqprep().

#define AST_DIGIT_NONE   ""

Convenient for waiting

Definition at line 47 of file file.h.

Referenced by sayunixtime_exec().

#define AST_MAX_FORMATS   10

The maximum number of formats we expect to see in a format string

Definition at line 44 of file file.h.

Referenced by __ast_play_and_record(), and ast_format_str_reduce().

#define AST_RESERVED_POINTERS   20

Definition at line 331 of file file.h.

#define SEEK_FORCECUR   10


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
s ast_filestream to apply
Return values:
0 on success.
-1 on failure.

Definition at line 923 of file file.c.

References ast_filestream::owner.

Referenced by ast_streamfile(), handle_getoption(), handle_recordfile(), handle_streamfile(), and speech_streamfile().

00924 {
00925    s->owner = chan;
00926    return 0;
00927 }

int ast_closestream ( struct ast_filestream f  ) 

Closes a stream.

Parameters:
f filestream to close Close a playback or recording stream
Return values:
0 on success.
-1 on failure.

Definition at line 966 of file file.c.

References ao2_ref, and filestream_close().

Referenced by __ast_play_and_record(), ast_hangup(), ast_moh_files_next(), ast_monitor_start(), ast_monitor_stop(), ast_readfile(), ast_stopstream(), ast_writefile(), dictate_exec(), filehelper(), filestream_destructor(), gen_closestream(), handle_cli_file_convert(), handle_recordfile(), local_ast_moh_stop(), mixmonitor_ds_close_fs(), moh_files_release(), record_exec(), recordthread(), and rpt().

00967 {
00968    /* This used to destroy the filestream, but it now just decrements a refcount.
00969     * We close the stream in order to quit queuing frames now, because we might
00970     * change the writeformat, which could result in a subsequent write error, if
00971     * the format is different. */
00972    filestream_close(f);
00973    ao2_ref(f, -1);
00974    return 0;
00975 }

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

Provided by file.c

Definition at line 1552 of file file.c.

References ARRAY_LEN, and ast_cli_register_multiple().

01553 {
01554    ast_cli_register_multiple(cli_file, ARRAY_LEN(cli_file));
01555    return 0;
01556 }

int ast_filecopy ( const char *  oldname,
const char *  newname,
const 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 1005 of file file.c.

References ACTION_COPY, and filehelper().

Referenced by copy_plain_file(), and vm_forwardoptions().

01006 {
01007    return filehelper(filename, filename2, fmt, ACTION_COPY);
01008 }

int ast_filedelete ( const char *  filename,
const char *  fmt 
)

Deletes a file.

Parameters:
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 995 of file file.c.

References ACTION_DELETE, and filehelper().

Referenced by __ast_play_and_record(), announce_thread(), ast_monitor_start(), ast_monitor_stop(), conf_free(), conf_run(), confbridge_exec(), dial_exec_full(), handle_cli_file_convert(), leave_voicemail(), play_record_review(), record_exec(), setup_privacy_args(), and vm_delete().

00996 {
00997    return filehelper(filename, NULL, fmt, ACTION_DELETE);
00998 }

int ast_fileexists ( const char *  filename,
const char *  fmt,
const 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.
Return values:
0,false. The file does not exist
1,true. The file does exist.

Definition at line 981 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(), conf_run(), dial_exec_full(), eivr_comm(), forward_message(), function_playback(), get_folder(), invent_message(), leave_voicemail(), minivm_delete_exec(), play_file(), play_message(), play_message_callerid(), readexten_exec(), record_exec(), retrydial_exec(), rpt_tele_thread(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), sayname(), saynode(), setup_privacy_args(), vm_intro(), vm_newuser(), vm_options(), and vm_tempgreeting().

00982 {
00983    char *buf;
00984    int buflen;
00985 
00986    if (preflang == NULL)
00987       preflang = "";
00988    buflen = strlen(preflang) + strlen(filename) + 4;  /* room for everything */
00989    buf = alloca(buflen);
00990    if (buf == NULL)
00991       return 0;
00992    return fileexists_core(filename, fmt, preflang, buf, buflen, NULL) ? 1 : 0;
00993 }

int ast_filerename ( const char *  oldname,
const char *  newname,
const 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 1000 of file file.c.

References ACTION_RENAME, and filehelper().

Referenced by __ast_play_and_record(), ast_monitor_stop(), forward_message(), leave_voicemail(), play_record_review(), rename_file(), and vm_forwardoptions().

01001 {
01002    return filehelper(filename, filename2, fmt, ACTION_RENAME);
01003 }

char* ast_format_str_reduce ( char *  fmts  ) 

Remove duplicate formats from a format string.

Parameters:
fmts a format string, this string will be modified
Return values:
NULL error
Returns:
a pointer to the reduced format string, this is a pointer to fmts

Definition at line 1436 of file file.c.

References ast_log(), AST_MAX_FORMATS, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdupa, ast_format_def::exts, exts_compare(), f, first, len(), ast_format_def::list, LOG_WARNING, strsep(), and type.

Referenced by actual_load_config().

01437 {
01438    struct ast_format_def *f;
01439    struct ast_format_def *fmts_ptr[AST_MAX_FORMATS];
01440    char *fmts_str[AST_MAX_FORMATS];
01441    char *stringp, *type;
01442    char *orig = fmts;
01443    int i, j, x, first, found = 0;
01444    int len = strlen(fmts) + 1;
01445    int res;
01446 
01447    if (AST_RWLIST_RDLOCK(&formats)) {
01448       ast_log(LOG_WARNING, "Unable to lock format list\n");
01449       return NULL;
01450    }
01451 
01452    stringp = ast_strdupa(fmts);
01453 
01454    for (x = 0; (type = strsep(&stringp, "|")) && x < AST_MAX_FORMATS; x++) {
01455       AST_RWLIST_TRAVERSE(&formats, f, list) {
01456          if (exts_compare(f->exts, type)) {
01457             found = 1;
01458             break;
01459          }
01460       }
01461 
01462       fmts_str[x] = type;
01463       if (found) {
01464          fmts_ptr[x] = f;
01465       } else {
01466          fmts_ptr[x] = NULL;
01467       }
01468    }
01469    AST_RWLIST_UNLOCK(&formats);
01470 
01471    first = 1;
01472    for (i = 0; i < x; i++) {
01473       /* ignore invalid entries */
01474       if (!fmts_ptr[i]) {
01475          ast_log(LOG_WARNING, "ignoring unknown format '%s'\n", fmts_str[i]);
01476          continue;
01477       }
01478 
01479       /* special handling for the first entry */
01480       if (first) {
01481          res = snprintf(fmts, len, "%s", fmts_str[i]);
01482          fmts += res;
01483          len -= res;
01484          first = 0;
01485          continue;
01486       }
01487 
01488       found = 0;
01489       for (j = 0; j < i; j++) {
01490          /* this is a duplicate */
01491          if (fmts_ptr[j] == fmts_ptr[i]) {
01492             found = 1;
01493             break;
01494          }
01495       }
01496 
01497       if (!found) {
01498          res = snprintf(fmts, len, "|%s", fmts_str[i]);
01499          fmts += res;
01500          len -= res;
01501       }
01502    }
01503 
01504    if (first) {
01505       ast_log(LOG_WARNING, "no known formats found in format list (%s)\n", orig);
01506       return NULL;
01507    }
01508 
01509    return orig;
01510 }

struct ast_filestream* ast_openstream ( struct ast_channel chan,
const char *  filename,
const char *  preflang 
) [read]

Opens stream for use in seeking, playing.

Parameters:
chan channel to work with
filename to use
preflang prefered language to use
Return values:
a ast_filestream pointer if it opens the file.
NULL on error.

Definition at line 662 of file file.c.

References ast_openstream_full().

Referenced by ast_streamfile(), dictate_exec(), handle_getoption(), handle_streamfile(), and speech_streamfile().

00663 {
00664    return ast_openstream_full(chan, filename, preflang, 0);
00665 }

struct ast_filestream* ast_openstream_full ( struct ast_channel chan,
const char *  filename,
const char *  preflang,
int  asis 
) [read]

Opens stream for use in seeking, playing.

Parameters:
chan channel to work with
filename to use
preflang prefered language to use
asis if set, don't clear generators
Return values:
a ast_filestream pointer if it opens the file.
NULL on error.

Definition at line 667 of file file.c.

References ACTION_OPEN, ast_deactivate_generator(), ast_format_cap_alloc_nolock(), ast_format_cap_destroy(), ast_format_cap_has_type(), ast_format_copy(), AST_FORMAT_TYPE_AUDIO, ast_log(), ast_set_write_format_from_cap(), ast_stopstream(), fileexists_core(), filehelper(), ast_channel::generator, LOG_WARNING, ast_channel::oldwriteformat, ast_channel::stream, and ast_channel::writeformat.

Referenced by ast_moh_files_next(), ast_openstream(), and gen_nextfile().

00668 {
00669    /* 
00670     * Use fileexists_core() to find a file in a compatible
00671     * language and format, set up a suitable translator,
00672     * and open the stream.
00673     */
00674    struct ast_format_cap *file_fmt_cap;
00675    int res;
00676    int buflen;
00677    char *buf;
00678 
00679    if (!asis) {
00680       /* do this first, otherwise we detect the wrong writeformat */
00681       ast_stopstream(chan);
00682       if (chan->generator)
00683          ast_deactivate_generator(chan);
00684    }
00685    if (preflang == NULL)
00686       preflang = "";
00687    buflen = strlen(preflang) + strlen(filename) + 4;
00688    buf = alloca(buflen);
00689    if (buf == NULL)
00690       return NULL;
00691 
00692    if (!(file_fmt_cap = ast_format_cap_alloc_nolock())) {
00693       return NULL;
00694    }
00695    if (!fileexists_core(filename, NULL, preflang, buf, buflen, file_fmt_cap) ||
00696       !ast_format_cap_has_type(file_fmt_cap, AST_FORMAT_TYPE_AUDIO)) {
00697 
00698       ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename);
00699       file_fmt_cap = ast_format_cap_destroy(file_fmt_cap);
00700       return NULL;
00701    }
00702 
00703    /* Set the channel to a format we can work with and save off the previous format. */
00704    ast_format_copy(&chan->oldwriteformat, &chan->writeformat);
00705    /* Set the channel to the best format that exists for the file. */
00706    res = ast_set_write_format_from_cap(chan, file_fmt_cap);
00707    /* don't need this anymore now that the channel's write format is set. */
00708    file_fmt_cap = ast_format_cap_destroy(file_fmt_cap);
00709 
00710    if (res == -1) {  /* No format available that works with this channel */
00711       return NULL;
00712    }
00713    res = filehelper(buf, chan, NULL, ACTION_OPEN);
00714    if (res >= 0)
00715       return chan->stream;
00716    return NULL;
00717 }

struct ast_filestream* ast_openvstream ( struct ast_channel chan,
const char *  filename,
const char *  preflang 
) [read]

Opens stream for use in seeking, playing.

Parameters:
chan channel to work with
filename to use
preflang prefered language to use
Return values:
a ast_filestream pointer if it opens the file.
NULL on error.

Definition at line 719 of file file.c.

References ACTION_OPEN, ast_format_cap_alloc_nolock(), ast_format_cap_destroy(), ast_format_cap_has_type(), ast_format_cap_iscompatible(), ast_format_cap_iter_end(), ast_format_cap_iter_next(), ast_format_cap_iter_start(), AST_FORMAT_GET_TYPE, AST_FORMAT_TYPE_VIDEO, ast_getformatname(), ast_log(), fileexists_core(), filehelper(), ast_format::id, LOG_WARNING, ast_channel::nativeformats, and ast_channel::vstream.

Referenced by ast_streamfile(), handle_getoption(), and handle_streamfile().

00720 {
00721    /* As above, but for video. But here we don't have translators
00722     * so we must enforce a format.
00723     */
00724    struct ast_format tmp_fmt;
00725    struct ast_format_cap *tmp_cap;
00726    char *buf;
00727    int buflen;
00728    const char *fmt;
00729    int fd;
00730 
00731    if (preflang == NULL)
00732       preflang = "";
00733    buflen = strlen(preflang) + strlen(filename) + 4;
00734    buf = alloca(buflen);
00735    if (buf == NULL)
00736       return NULL;
00737 
00738    /* is the channel capable of video without translation ?*/
00739    if (!ast_format_cap_has_type(chan->nativeformats, AST_FORMAT_TYPE_VIDEO)) {
00740       return NULL;
00741    }
00742    if (!(tmp_cap = ast_format_cap_alloc_nolock())) {
00743       return NULL;
00744    }
00745    /* Video is supported, so see what video formats exist for this file */
00746    if (!fileexists_core(filename, NULL, preflang, buf, buflen, tmp_cap)) {
00747       tmp_cap = ast_format_cap_destroy(tmp_cap);
00748       return NULL;
00749    }
00750 
00751    /* iterate over file formats and pick the first one compatible with the channel's native formats */
00752    ast_format_cap_iter_start(tmp_cap);
00753    while (!ast_format_cap_iter_next(tmp_cap, &tmp_fmt)) {
00754       fmt = ast_getformatname(&tmp_fmt);
00755       if ((AST_FORMAT_GET_TYPE(tmp_fmt.id) != AST_FORMAT_TYPE_VIDEO) ||
00756          !ast_format_cap_iscompatible(chan->nativeformats, &tmp_fmt)) {
00757          continue;
00758       }
00759 
00760       fd = filehelper(buf, chan, fmt, ACTION_OPEN);
00761       if (fd >= 0) {
00762          ast_format_cap_iter_end(tmp_cap);
00763          tmp_cap = ast_format_cap_destroy(tmp_cap);
00764          return chan->vstream;
00765       }
00766       ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename);
00767    }
00768    ast_format_cap_iter_end(tmp_cap);
00769    tmp_cap = ast_format_cap_destroy(tmp_cap);
00770 
00771    return NULL;
00772 }

int ast_playstream ( struct ast_filestream s  ) 

Play a open stream on a channel.

Parameters:
s filestream to play
Return values:
0 on success.
-1 on failure.

Definition at line 929 of file file.c.

References AST_FORMAT_GET_TYPE, AST_FORMAT_TYPE_AUDIO, ast_readaudio_callback(), ast_readvideo_callback(), ast_filestream::fmt, ast_format_def::format, FSREAD_FAILURE, and ast_format::id.

Referenced by ast_streamfile(), handle_getoption(), handle_streamfile(), and speech_streamfile().

00930 {
00931    enum fsread_res res;
00932 
00933    if (AST_FORMAT_GET_TYPE(s->fmt->format.id) == AST_FORMAT_TYPE_AUDIO)
00934       res = ast_readaudio_callback(s);
00935    else
00936       res = ast_readvideo_callback(s);
00937 
00938    return (res == FSREAD_FAILURE) ? -1 : 0;
00939 }

struct ast_filestream* ast_readfile ( const char *  filename,
const char *  type,
const char *  comment,
int  flags,
int  check,
mode_t  mode 
) [read]

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.
Return values:
a struct ast_filestream on success.
NULL on failure.

Definition at line 1060 of file file.c.

References ast_closestream(), ast_free, ast_log(), AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdup, build_filename(), errno, ast_format_def::exts, exts_compare(), f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, get_filestream(), LOG_WARNING, ast_filestream::mode, open_wrapper(), ast_filestream::trans, and ast_filestream::vfs.

Referenced by __ast_play_and_record(), and handle_cli_file_convert().

01061 {
01062    FILE *bfile;
01063    struct ast_format_def *f;
01064    struct ast_filestream *fs = NULL;
01065    char *fn;
01066    int format_found = 0;   
01067 
01068    AST_RWLIST_RDLOCK(&formats);
01069 
01070    AST_RWLIST_TRAVERSE(&formats, f, list) {
01071       fs = NULL;
01072       if (!exts_compare(f->exts, type))
01073          continue;
01074       else 
01075          format_found = 1;
01076 
01077       fn = build_filename(filename, type);
01078       errno = 0;
01079       bfile = fopen(fn, "r");
01080 
01081       if (!bfile || (fs = get_filestream(f, bfile)) == NULL || open_wrapper(fs) ) {
01082          ast_log(LOG_WARNING, "Unable to open %s\n", fn);
01083          if (fs) {
01084             ast_closestream(fs);
01085          }
01086          fs = NULL;
01087          bfile = NULL;
01088          ast_free(fn);
01089          break;            
01090       }
01091       /* found it */
01092       fs->trans = NULL;
01093       fs->fmt = f;
01094       fs->flags = flags;
01095       fs->mode = mode;
01096       fs->filename = ast_strdup(filename);
01097       fs->vfs = NULL;
01098       break;
01099    }
01100 
01101    AST_RWLIST_UNLOCK(&formats);
01102    if (!format_found)
01103       ast_log(LOG_WARNING, "No such format '%s'\n", type);
01104 
01105    return fs;
01106 }

struct ast_frame* ast_readframe ( struct ast_filestream s  )  [read]

Read a frame from a filestream.

Parameters:
s ast_filestream to act on
Returns:
a frame.
Return values:
NULL if read failed.

Definition at line 799 of file file.c.

References read_frame().

Referenced by __ast_play_and_record(), dictate_exec(), gen_readframe(), handle_cli_file_convert(), and moh_files_readframe().

00800 {
00801    int whennext = 0;
00802 
00803    return read_frame(s, &whennext);
00804 }

int ast_seekstream ( struct ast_filestream fs,
off_t  sample_offset,
int  whence 
)

Seeks into stream.

Parameters:
fs ast_filestream to perform seek on
sample_offset numbers of samples to seek
whence SEEK_SET, SEEK_CUR, SEEK_END
Return values:
0 on success.
-1 on failure.

Definition at line 941 of file file.c.

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

Referenced by __ast_read(), ast_control_streamfile(), ast_moh_files_next(), ast_stream_fastforward(), ast_stream_rewind(), ast_streamfile(), ast_write(), dictate_exec(), handle_getoption(), handle_recordfile(), handle_streamfile(), and speech_streamfile().

00942 {
00943    return fs->fmt->seek(fs, sample_offset, whence);
00944 }

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

Return values:
0 always
Note:
The channel does not need to be locked before calling this function.

Definition at line 126 of file file.c.

References ast_channel_lock, ast_channel_unlock, ast_closestream(), ast_getformatname(), ast_log(), ast_set_write_format(), ast_format::id, LOG_WARNING, ast_channel::oldwriteformat, ast_channel::stream, and ast_channel::vstream.

Referenced by action_playback_and_continue(), 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_enumeration_full_vi(), ast_say_number_full_cs(), 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_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), ast_say_number_full_ka(), 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_th(), ast_say_number_full_ur(), ast_say_number_full_vi(), ast_say_number_full_zh(), background_detect_exec(), conf_exec(), conf_run(), dial_exec_full(), directory_exec(), grab_transfer(), handle_getoption(), handle_speechrecognize(), handle_streamfile(), ices_exec(), ivr_dispatch(), leave_voicemail(), minivm_greet_exec(), mp3_exec(), NBScat_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_file(), play_mailbox_owner(), playback_exec(), queue_exec(), read_exec(), readexten_exec(), record_exec(), recordthread(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), sayfile(), saynum(), select_item_seq(), send_morse(), send_tone_telemetry(), send_waveform_to_channel(), speech_background(), vm_authenticate(), vm_execmain(), wait_for_winner(), waitstream_core(), and zapateller_exec().

00127 {
00128    ast_channel_lock(tmp);
00129 
00130    /* Stop a running stream if there is one */
00131    if (tmp->stream) {
00132       ast_closestream(tmp->stream);
00133       tmp->stream = NULL;
00134       if (tmp->oldwriteformat.id && ast_set_write_format(tmp, &tmp->oldwriteformat))
00135          ast_log(LOG_WARNING, "Unable to restore format back to %s\n", ast_getformatname(&tmp->oldwriteformat));
00136    }
00137    /* Stop the video stream too */
00138    if (tmp->vstream != NULL) {
00139       ast_closestream(tmp->vstream);
00140       tmp->vstream = NULL;
00141    }
00142 
00143    ast_channel_unlock(tmp);
00144 
00145    return 0;
00146 }

int ast_stream_and_wait ( struct ast_channel chan,
const char *  file,
const char *  digits 
)

stream file until digit If the file name is non-empty, try to play it.

Note:
If digits == "" then we can simply check for non-zero.
Returns:
0 if success.
Return values:
-1 if error.
digit if interrupted by a digit.

Definition at line 1423 of file file.c.

References ast_channel_language(), ast_channel_name(), ast_streamfile(), ast_strlen_zero(), ast_test_suite_event_notify, and ast_waitstream().

Referenced by __ast_play_and_record(), action_kick_last(), action_playback(), action_toggle_mute(), action_toggle_mute_participants(), announce_user_count(), app_exec(), ast_pickup_call(), ast_record_review(), bridge_playfile(), builtin_atxfer(), builtin_automixmonitor(), builtin_blindtransfer(), confbridge_exec(), directory_exec(), execute_menu_entry(), feature_attended_transfer(), feature_blind_transfer(), forward_message(), grab_transfer(), invent_message(), ivr_dispatch(), join_conference_bridge(), leave_voicemail(), masq_park_call(), park_call_exec(), parked_call_exec(), play_mailbox_owner(), play_message_callerid(), play_message_on_chan(), play_prompt_to_channel(), play_record_review(), play_sound_helper(), sayname(), select_item_seq(), vm_forwardoptions(), vmsayname_exec(), wait_file2(), and xfer_park_call_helper().

01424 {
01425    int res = 0;
01426    if (!ast_strlen_zero(file)) {
01427       ast_test_suite_event_notify("PLAYBACK", "Message: %s\r\nChannel: %s", file, ast_channel_name(chan));
01428       res = ast_streamfile(chan, file, ast_channel_language(chan));
01429       if (!res) {
01430          res = ast_waitstream(chan, digits);
01431       }
01432    }
01433    return res;
01434 } 

int ast_stream_fastforward ( struct ast_filestream fs,
off_t  ms 
)

Fast forward stream ms.

Parameters:
fs filestream to act on
ms milliseconds to move
Return values:
0 on success.
-1 on failure.

Definition at line 956 of file file.c.

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

Referenced by waitstream_core().

00957 {
00958    return ast_seekstream(fs, ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
00959 }

int ast_stream_rewind ( struct ast_filestream fs,
off_t  ms 
)

Rewind stream ms.

Parameters:
fs filestream to act on
ms milliseconds to move
Return values:
0 on success.
-1 on failure.

Definition at line 961 of file file.c.

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

Referenced by __ast_play_and_record(), handle_recordfile(), record_exec(), and waitstream_core().

00962 {
00963    return ast_seekstream(fs, -ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
00964 }

int ast_streamfile ( struct ast_channel c,
const char *  filename,
const 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.
Return values:
0 on success.
-1 on failure.

Definition at line 1010 of file file.c.

References ast_applystream(), ast_channel_name(), ast_debug, AST_FLAG_MASQ_NOSTREAM, ast_getformatname(), ast_getformatname_multiple(), ast_log(), ast_openstream(), ast_openvstream(), ast_playstream(), ast_seekstream(), ast_strdup, ast_test_flag, ast_verb, errno, ast_filestream::f, ast_filestream::fmt, ast_format_def::format, LOG_WARNING, ast_channel::nativeformats, ast_filestream::orig_chan_name, ast_filestream::vfs, and ast_channel::writeformat.

Referenced by __analog_ss_thread(), action_bridge(), action_playback_and_continue(), agent_call(), analog_ss_thread(), 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_gr(), ast_say_date_he(), ast_say_date_hu(), ast_say_date_ka(), ast_say_date_nl(), ast_say_date_th(), 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_he(), ast_say_datetime_from_now_ka(), ast_say_datetime_gr(), ast_say_datetime_he(), ast_say_datetime_nl(), ast_say_datetime_pt(), ast_say_datetime_th(), ast_say_datetime_zh(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_enumeration_full_vi(), ast_say_number_full_cs(), 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_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), ast_say_number_full_ka(), 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_th(), ast_say_number_full_ur(), ast_say_number_full_vi(), ast_say_number_full_zh(), ast_say_time_de(), ast_say_time_en(), ast_say_time_fr(), ast_say_time_gr(), ast_say_time_hu(), ast_say_time_ka(), ast_say_time_nl(), ast_say_time_zh(), ast_stream_and_wait(), auth_exec(), background_detect_exec(), bridge_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_get_pin(), conf_run(), dial_exec_full(), do_directory(), find_conf_realtime(), forward_message(), gr_say_number_female(), handle_recordfile(), invent_message(), leave_voicemail(), local_attended_transfer(), login_exec(), minivm_greet_exec(), page_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_record_review(), playback_exec(), privacy_exec(), readexten_exec(), record_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), sayfile(), select_item_menu(), setup_privacy_args(), vm_authenticate(), wait_file(), and wait_for_winner().

01011 {
01012    struct ast_filestream *fs;
01013    struct ast_filestream *vfs=NULL;
01014    char fmt[256];
01015    off_t pos;
01016    int seekattempt;
01017    int res;
01018 
01019    fs = ast_openstream(chan, filename, preflang);
01020    if (!fs) {
01021       ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname_multiple(fmt, sizeof(fmt), chan->nativeformats), strerror(errno));
01022       return -1;
01023    }
01024 
01025    /* check to see if there is any data present (not a zero length file),
01026     * done this way because there is no where for ast_openstream_full to
01027     * return the file had no data. */
01028    pos = ftello(fs->f);
01029    seekattempt = fseeko(fs->f, -1, SEEK_END);
01030    if (seekattempt) {
01031       if (errno == EINVAL) {
01032          /* Zero-length file, as opposed to a pipe */
01033          return 0;
01034       } else {
01035          ast_seekstream(fs, 0, SEEK_SET);
01036       }
01037    } else {
01038       fseeko(fs->f, pos, SEEK_SET);
01039    }
01040 
01041    vfs = ast_openvstream(chan, filename, preflang);
01042    if (vfs) {
01043       ast_debug(1, "Ooh, found a video stream, too, format %s\n", ast_getformatname(&vfs->fmt->format));
01044    }
01045 
01046    if (ast_test_flag(chan, AST_FLAG_MASQ_NOSTREAM))
01047       fs->orig_chan_name = ast_strdup(ast_channel_name(chan));
01048    if (ast_applystream(chan, fs))
01049       return -1;
01050    if (vfs && ast_applystream(chan, vfs))
01051       return -1;
01052    res = ast_playstream(fs);
01053    if (!res && vfs)
01054       res = ast_playstream(vfs);
01055    ast_verb(3, "<%s> Playing '%s.%s' (language '%s')\n", ast_channel_name(chan), filename, ast_getformatname(&chan->writeformat), preflang ? preflang : "default");
01056 
01057    return res;
01058 }

off_t ast_tellstream ( struct ast_filestream fs  ) 

Tell where we are in a stream.

Parameters:
fs fs to act on
Returns:
a long as a sample offset into stream

Definition at line 951 of file file.c.

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

Referenced by __ast_play_and_record(), ast_control_streamfile(), ast_moh_files_next(), handle_getoption(), handle_recordfile(), handle_speechrecognize(), and handle_streamfile().

00952 {
00953    return fs->fmt->tell(fs);
00954 }

int ast_truncstream ( struct ast_filestream fs  ) 

Trunc stream at current location.

Parameters:
fs filestream to act on
Return values:
0 on success.
-1 on failure.

Definition at line 946 of file file.c.

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

Referenced by __ast_play_and_record(), handle_recordfile(), and record_exec().

00947 {
00948    return fs->fmt->trunc(fs);
00949 }

int ast_waitstream ( struct ast_channel c,
const char *  breakon 
)

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

Parameters:
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,
Return values:
0 if the stream finishes
the character if it was interrupted,
-1 on error

Definition at line 1396 of file file.c.

References waitstream_core().

Referenced by __analog_ss_thread(), action_bridge(), action_playback_and_continue(), agent_call(), analog_ss_thread(), announce_thread(), app_exec(), ast_play_and_wait(), ast_say_date_da(), ast_say_date_de(), ast_say_date_en(), ast_say_date_fr(), ast_say_date_gr(), ast_say_date_he(), ast_say_date_hu(), ast_say_date_ka(), ast_say_date_nl(), ast_say_date_th(), 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_he(), ast_say_datetime_from_now_ka(), ast_say_datetime_gr(), ast_say_datetime_he(), ast_say_datetime_nl(), ast_say_datetime_pt(), ast_say_datetime_th(), ast_say_datetime_zh(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_enumeration_full_vi(), ast_say_number_full_cs(), 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_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), ast_say_number_full_ka(), 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_th(), ast_say_number_full_ur(), ast_say_number_full_vi(), ast_say_number_full_zh(), ast_say_time_de(), ast_say_time_en(), ast_say_time_gr(), ast_say_time_he(), ast_say_time_hu(), ast_say_time_ka(), ast_say_time_nl(), ast_say_time_zh(), ast_stream_and_wait(), auth_exec(), bridge_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_get_pin(), conf_run(), directory_exec(), find_conf_realtime(), gr_say_number_female(), handle_recordfile(), invent_message(), leave_voicemail(), local_attended_transfer(), login_exec(), minivm_greet_exec(), page_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_record_review(), playback_exec(), privacy_exec(), record_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), sayfile(), saynum(), select_item_menu(), send_morse(), send_tone_telemetry(), setup_privacy_args(), vm_authenticate(), and wait_file().

01397 {
01398    return waitstream_core(c, breakon, NULL, NULL, 0, -1, -1, NULL);
01399 }

int ast_waitstream_exten ( struct ast_channel c,
const char *  context 
)

Waits for a stream to stop or digit matching a valid one digit exten to be pressed.

Parameters:
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,
Return values:
0 if the stream finishes.
the character if it was interrupted.
-1 on error.

Definition at line 1407 of file file.c.

References ast_channel::context, and waitstream_core().

Referenced by pbx_builtin_background().

01408 {
01409    /* Waitstream, with return in the case of a valid 1 digit extension */
01410    /* in the current or specified context being pressed */
01411 
01412    if (!context)
01413       context = c->context;
01414    return waitstream_core(c, NULL, NULL, NULL, 0,
01415       -1, -1, context);
01416 }

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

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

Parameters:
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,
Return values:
0 if the stream finishes.
the character if it was interrupted.
-1 on error.

Definition at line 1390 of file file.c.

References waitstream_core().

Referenced by ast_control_streamfile().

01391 {
01392    return waitstream_core(c, breakon, forward, reverse, ms,
01393       -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */);
01394 }

int ast_waitstream_full ( struct ast_channel c,
const char *  breakon,
int  audiofd,
int  monfd 
)

struct ast_filestream* ast_writefile ( const char *  filename,
const char *  type,
const char *  comment,
int  flags,
int  check,
mode_t  mode 
) [read]

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
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.
Return values:
a struct ast_filestream on success.
NULL on failure.

Definition at line 1108 of file file.c.

References ast_closestream(), ast_free, ast_log(), ast_malloc, ast_opt_cache_record_files, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdup, ast_strdupa, ast_filestream::buf, build_filename(), errno, ast_format_def::exts, exts_compare(), ast_filestream::f, f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, get_filestream(), LOG_WARNING, ast_filestream::mode, ast_filestream::realfilename, record_cache_dir, rewrite_wrapper(), ast_format_def::seek, ast_filestream::trans, ast_filestream::vfs, and ast_filestream::write_buffer.

Referenced by __ast_play_and_record(), ast_monitor_start(), ast_writestream(), dictate_exec(), handle_cli_file_convert(), handle_recordfile(), mixmonitor_save_prep(), record_exec(), recordthread(), and rpt().

01109 {
01110    int fd, myflags = 0;
01111    /* compiler claims this variable can be used before initialization... */
01112    FILE *bfile = NULL;
01113    struct ast_format_def *f;
01114    struct ast_filestream *fs = NULL;
01115    char *buf = NULL;
01116    size_t size = 0;
01117    int format_found = 0;
01118 
01119    AST_RWLIST_RDLOCK(&formats);
01120 
01121    /* set the O_TRUNC flag if and only if there is no O_APPEND specified */
01122    /* We really can't use O_APPEND as it will break WAV header updates */
01123    if (flags & O_APPEND) { 
01124       flags &= ~O_APPEND;
01125    } else {
01126       myflags = O_TRUNC;
01127    }
01128    
01129    myflags |= O_WRONLY | O_CREAT;
01130 
01131    /* XXX need to fix this - we should just do the fopen,
01132     * not open followed by fdopen()
01133     */
01134    AST_RWLIST_TRAVERSE(&formats, f, list) {
01135       char *fn, *orig_fn = NULL;
01136       if (fs)
01137          break;
01138 
01139       if (!exts_compare(f->exts, type))
01140          continue;
01141       else
01142          format_found = 1;
01143 
01144       fn = build_filename(filename, type);
01145       fd = open(fn, flags | myflags, mode);
01146       if (fd > -1) {
01147          /* fdopen() the resulting file stream */
01148          bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w");
01149          if (!bfile) {
01150             ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno));
01151             close(fd);
01152             fd = -1;
01153          }
01154       }
01155       
01156       if (ast_opt_cache_record_files && (fd > -1)) {
01157          char *c;
01158 
01159          fclose(bfile); /* this also closes fd */
01160          /*
01161            We touch orig_fn just as a place-holder so other things (like vmail) see the file is there.
01162            What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place.
01163          */
01164          orig_fn = ast_strdupa(fn);
01165          for (c = fn; *c; c++)
01166             if (*c == '/')
01167                *c = '_';
01168 
01169          size = strlen(fn) + strlen(record_cache_dir) + 2;
01170          buf = alloca(size);
01171          strcpy(buf, record_cache_dir);
01172          strcat(buf, "/");
01173          strcat(buf, fn);
01174          ast_free(fn);
01175          fn = buf;
01176          fd = open(fn, flags | myflags, mode);
01177          if (fd > -1) {
01178             /* fdopen() the resulting file stream */
01179             bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w");
01180             if (!bfile) {
01181                ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno));
01182                close(fd);
01183                fd = -1;
01184             }
01185          }
01186       }
01187       if (fd > -1) {
01188          errno = 0;
01189          fs = get_filestream(f, bfile);
01190          if (fs) {
01191             if ((fs->write_buffer = ast_malloc(32768))) {
01192                setvbuf(fs->f, fs->write_buffer, _IOFBF, 32768);
01193             }
01194          }
01195          if (!fs || rewrite_wrapper(fs, comment)) {
01196             ast_log(LOG_WARNING, "Unable to rewrite %s\n", fn);
01197             close(fd);
01198             if (orig_fn) {
01199                unlink(fn);
01200                unlink(orig_fn);
01201             }
01202             if (fs) {
01203                ast_closestream(fs);
01204                fs = NULL;
01205             }
01206             continue;
01207          }
01208          fs->trans = NULL;
01209          fs->fmt = f;
01210          fs->flags = flags;
01211          fs->mode = mode;
01212          if (orig_fn) {
01213             fs->realfilename = ast_strdup(orig_fn);
01214             fs->filename = ast_strdup(fn);
01215          } else {
01216             fs->realfilename = NULL;
01217             fs->filename = ast_strdup(filename);
01218          }
01219          fs->vfs = NULL;
01220          /* If truncated, we'll be at the beginning; if not truncated, then append */
01221          f->seek(fs, 0, SEEK_END);
01222       } else if (errno != EEXIST) {
01223          ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno));
01224          if (orig_fn)
01225             unlink(orig_fn);
01226       }
01227       /* if buf != NULL then fn is already free and pointing to it */
01228       if (!buf)
01229          ast_free(fn);
01230    }
01231 
01232    AST_RWLIST_UNLOCK(&formats);
01233 
01234    if (!format_found)
01235       ast_log(LOG_WARNING, "No such format '%s'\n", type);
01236 
01237    return fs;
01238 }

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
Return values:
0 on success.
-1 on failure.

Definition at line 148 of file file.c.

References ast_debug, ast_format_cmp(), AST_FORMAT_CMP_EQUAL, AST_FORMAT_CMP_NOT_EQUAL, ast_format_copy(), AST_FORMAT_GET_TYPE, AST_FORMAT_TYPE_AUDIO, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_frfree, ast_getformatname(), AST_LIST_NEXT, ast_log(), ast_translate(), ast_translator_build_path(), ast_translator_free_path(), ast_writefile(), ast_writestream(), ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, ast_frame_subclass::format, ast_format_def::format, ast_frame::frametype, ast_format::id, ast_filestream::lastwriteformat, LOG_WARNING, ast_filestream::mode, ast_format_def::name, ast_frame::subclass, ast_filestream::trans, type, ast_filestream::vfs, and ast_format_def::write.

Referenced by __ast_play_and_record(), __ast_read(), ast_write(), ast_writestream(), dictate_exec(), handle_cli_file_convert(), handle_recordfile(), mixmonitor_thread(), record_exec(), recordthread(), and rpt().

00149 {
00150    int res = -1;
00151    if (f->frametype == AST_FRAME_VIDEO) {
00152       if (AST_FORMAT_GET_TYPE(fs->fmt->format.id) == AST_FORMAT_TYPE_AUDIO) {
00153          /* This is the audio portion.  Call the video one... */
00154          if (!fs->vfs && fs->filename) {
00155             const char *type = ast_getformatname(&f->subclass.format);
00156             fs->vfs = ast_writefile(fs->filename, type, NULL, fs->flags, 0, fs->mode);
00157             ast_debug(1, "Opened video output file\n");
00158          }
00159          if (fs->vfs)
00160             return ast_writestream(fs->vfs, f);
00161          /* else ignore */
00162          return 0;            
00163       }
00164    } else if (f->frametype != AST_FRAME_VOICE) {
00165       ast_log(LOG_WARNING, "Tried to write non-voice frame\n");
00166       return -1;
00167    }
00168    if (ast_format_cmp(&f->subclass.format, &fs->fmt->format) != AST_FORMAT_CMP_NOT_EQUAL) {
00169       res =  fs->fmt->write(fs, f);
00170       if (res < 0) 
00171          ast_log(LOG_WARNING, "Natural write failed\n");
00172       else if (res > 0)
00173          ast_log(LOG_WARNING, "Huh??\n");
00174    } else {
00175       /* XXX If they try to send us a type of frame that isn't the normal frame, and isn't
00176              the one we've setup a translator for, we do the "wrong thing" XXX */
00177       if (fs->trans && (ast_format_cmp(&f->subclass.format, &fs->lastwriteformat) != AST_FORMAT_CMP_EQUAL)) {
00178          ast_translator_free_path(fs->trans);
00179          fs->trans = NULL;
00180       }
00181       if (!fs->trans) 
00182          fs->trans = ast_translator_build_path(&fs->fmt->format, &f->subclass.format);
00183       if (!fs->trans)
00184          ast_log(LOG_WARNING, "Unable to translate to format %s, source format %s\n",
00185             fs->fmt->name, ast_getformatname(&f->subclass.format));
00186       else {
00187          struct ast_frame *trf;
00188          ast_format_copy(&fs->lastwriteformat, &f->subclass.format);
00189          /* Get the translated frame but don't consume the original in case they're using it on another stream */
00190          if ((trf = ast_translate(fs->trans, f, 0))) {
00191             struct ast_frame *cur;
00192 
00193             /* the translator may have returned multiple frames, so process them */
00194             for (cur = trf; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
00195                if ((res = fs->fmt->write(fs, trf))) {
00196                   ast_log(LOG_WARNING, "Translated frame write failed\n");
00197                   break;
00198                }
00199             }
00200             ast_frfree(trf);
00201          } else {
00202             res = 0;
00203          }
00204       }
00205    }
00206    return res;
00207 }


Generated on Fri Feb 10 06:36:05 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.5.6