Sat Mar 10 01:55:23 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...

#include <fcntl.h>
#include <sys/mman.h>

Go to the source code of this file.

Defines

#define AST_DIGIT_ANY   "0123456789#*ABCD"
#define AST_DIGIT_ANYNUM   "0123456789"
#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)
ast_filestreamast_openstream (struct ast_channel *chan, const char *filename, const char *preflang)
 Opens stream for use in seeking, playing.
ast_filestreamast_openstream_full (struct ast_channel *chan, const char *filename, const char *preflang, int asis)
 Opens stream for use in seeking, playing.
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.
ast_filestreamast_readfile (const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode)
 Starts reading from a file.
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)
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"

Convenient for waiting

Definition at line 47 of file file.h.

Referenced by ast_ivr_menu_run_internal(), ast_play_and_wait(), ast_readstring_full(), ast_record_review(), bridge_playfile(), builtin_atxfer(), builtin_blindtransfer(), conf_exec(), conf_run(), dial_exec_full(), dictate_exec(), directory_exec(), feature_attended_transfer(), feature_blind_transfer(), festival_exec(), get_folder(), grab_transfer(), ivr_dispatch(), menu_callback(), pbx_builtin_background(), play_file(), play_mailbox_owner(), play_message(), play_message_callerid(), play_message_datetime(), play_message_duration(), play_record_review(), retrydial_exec(), say_and_wait(), say_position(), sayname(), sayunixtime_exec(), select_item_menu(), select_item_seq(), vm_intro_gr(), vm_intro_he(), vm_intro_multilang(), vm_intro_pt(), vm_intro_pt_BR(), vmsayname_exec(), and wait_file2().

#define AST_DIGIT_ANYNUM   "0123456789"

Definition at line 48 of file file.h.

Referenced by initreqprep().

#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 329 of file file.h.

#define SEEK_FORCECUR   10

Definition at line 50 of file file.h.

Referenced by __ast_read(), ast_write(), au_seek(), g719seek(), g729_seek(), gsm_seek(), ilbc_seek(), pcm_seek(), siren14seek(), siren7seek(), slinear_seek(), vox_seek(), and wav_seek().


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 860 of file file.c.

References ast_filestream::owner.

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

00861 {
00862    s->owner = chan;
00863    return 0;
00864 }

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 903 of file file.c.

References ao2_ref, f, and filestream_close().

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

00904 {
00905    /* This used to destroy the filestream, but it now just decrements a refcount.
00906     * We close the stream in order to quit queuing frames now, because we might
00907     * change the writeformat, which could result in a subsequent write error, if
00908     * the format is different. */
00909    filestream_close(f);
00910    ao2_ref(f, -1);
00911    return 0;
00912 }

int ast_file_init ( void   ) 

Provided by file.c

Definition at line 1489 of file file.c.

References ARRAY_LEN, ast_cli_register_multiple(), and cli_file.

01490 {
01491    ast_cli_register_multiple(cli_file, ARRAY_LEN(cli_file));
01492    return 0;
01493 }

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 942 of file file.c.

References ast_filehelper().

Referenced by copy_plain_file(), and vm_forwardoptions().

00943 {
00944    return ast_filehelper(filename, filename2, fmt, ACTION_COPY);
00945 }

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 932 of file file.c.

References ACTION_DELETE, and ast_filehelper().

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

00933 {
00934    return ast_filehelper(filename, NULL, fmt, ACTION_DELETE);
00935 }

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.
Returns:
0 if file does not exist, non-zero positive otherwise.

Definition at line 918 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().

00919 {
00920    char *buf;
00921    int buflen;
00922 
00923    if (preflang == NULL)
00924       preflang = "";
00925    buflen = strlen(preflang) + strlen(filename) + 4;  /* room for everything */
00926    buf = alloca(buflen);
00927    if (buf == NULL)
00928       return 0;
00929    return fileexists_core(filename, fmt, preflang, buf, buflen);
00930 }

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 937 of file file.c.

References ACTION_RENAME, and ast_filehelper().

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

00938 {
00939    return ast_filehelper(filename, filename2, fmt, ACTION_RENAME);
00940 }

char* ast_format_str_reduce ( char *  fmts  ) 

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 1373 of file file.c.

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

Referenced by actual_load_config().

01374 {
01375    struct ast_format *f;
01376    struct ast_format *fmts_ptr[AST_MAX_FORMATS];
01377    char *fmts_str[AST_MAX_FORMATS];
01378    char *stringp, *type;
01379    char *orig = fmts;
01380    int i, j, x, first, found = 0;
01381    int len = strlen(fmts) + 1;
01382    int res;
01383 
01384    if (AST_RWLIST_RDLOCK(&formats)) {
01385       ast_log(LOG_WARNING, "Unable to lock format list\n");
01386       return NULL;
01387    }
01388 
01389    stringp = ast_strdupa(fmts);
01390 
01391    for (x = 0; (type = strsep(&stringp, "|")) && x < AST_MAX_FORMATS; x++) {
01392       AST_RWLIST_TRAVERSE(&formats, f, list) {
01393          if (exts_compare(f->exts, type)) {
01394             found = 1;
01395             break;
01396          }
01397       }
01398 
01399       fmts_str[x] = type;
01400       if (found) {
01401          fmts_ptr[x] = f;
01402       } else {
01403          fmts_ptr[x] = NULL;
01404       }
01405    }
01406    AST_RWLIST_UNLOCK(&formats);
01407 
01408    first = 1;
01409    for (i = 0; i < x; i++) {
01410       /* ignore invalid entries */
01411       if (!fmts_ptr[i]) {
01412          ast_log(LOG_WARNING, "ignoring unknown format '%s'\n", fmts_str[i]);
01413          continue;
01414       }
01415 
01416       /* special handling for the first entry */
01417       if (first) {
01418          res = snprintf(fmts, len, "%s", fmts_str[i]);
01419          fmts += res;
01420          len -= res;
01421          first = 0;
01422          continue;
01423       }
01424 
01425       found = 0;
01426       for (j = 0; j < i; j++) {
01427          /* this is a duplicate */
01428          if (fmts_ptr[j] == fmts_ptr[i]) {
01429             found = 1;
01430             break;
01431          }
01432       }
01433 
01434       if (!found) {
01435          res = snprintf(fmts, len, "|%s", fmts_str[i]);
01436          fmts += res;
01437          len -= res;
01438       }
01439    }
01440 
01441    if (first) {
01442       ast_log(LOG_WARNING, "no known formats found in format list (%s)\n", orig);
01443       return NULL;
01444    }
01445 
01446    return orig;
01447 }

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

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 631 of file file.c.

References ast_openstream_full().

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

00632 {
00633    return ast_openstream_full(chan, filename, preflang, 0);
00634 }

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

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 636 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_openstream(), and gen_nextfile().

00637 {
00638    /* 
00639     * Use fileexists_core() to find a file in a compatible
00640     * language and format, set up a suitable translator,
00641     * and open the stream.
00642     */
00643    format_t fmts, res;
00644    int buflen;
00645    char *buf;
00646 
00647    if (!asis) {
00648       /* do this first, otherwise we detect the wrong writeformat */
00649       ast_stopstream(chan);
00650       if (chan->generator)
00651          ast_deactivate_generator(chan);
00652    }
00653    if (preflang == NULL)
00654       preflang = "";
00655    buflen = strlen(preflang) + strlen(filename) + 4;
00656    buf = alloca(buflen);
00657    if (buf == NULL)
00658       return NULL;
00659    fmts = fileexists_core(filename, NULL, preflang, buf, buflen);
00660    if (fmts > 0)
00661       fmts &= AST_FORMAT_AUDIO_MASK;
00662    if (fmts < 1) {
00663       ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename);
00664       return NULL;
00665    }
00666    chan->oldwriteformat = chan->writeformat;
00667    /* Set the channel to a format we can work with */
00668    res = ast_set_write_format(chan, fmts);
00669    if (res == -1) {  /* No format available that works with this channel */
00670       return NULL;
00671    }
00672    res = ast_filehelper(buf, chan, NULL, ACTION_OPEN);
00673    if (res >= 0)
00674       return chan->stream;
00675    return NULL;
00676 }

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

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 678 of file file.c.

References ACTION_OPEN, ast_filehelper(), AST_FORMAT_FIRST_VIDEO_BIT, AST_FORMAT_VIDEO_MASK, 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().

00679 {
00680    /* As above, but for video. But here we don't have translators
00681     * so we must enforce a format.
00682     */
00683    format_t format;
00684    char *buf;
00685    int buflen;
00686 
00687    if (preflang == NULL)
00688       preflang = "";
00689    buflen = strlen(preflang) + strlen(filename) + 4;
00690    buf = alloca(buflen);
00691    if (buf == NULL)
00692       return NULL;
00693 
00694    for (format = AST_FORMAT_FIRST_VIDEO_BIT; format <= AST_FORMAT_VIDEO_MASK; format = format << 1) {
00695       int fd;
00696       const char *fmt;
00697 
00698       if (!(chan->nativeformats & format))
00699          continue;
00700       fmt = ast_getformatname(format);
00701       if ( fileexists_core(filename, fmt, preflang, buf, buflen) < 1)   /* no valid format */
00702          continue;
00703       fd = ast_filehelper(buf, chan, fmt, ACTION_OPEN);
00704       if (fd >= 0)
00705          return chan->vstream;
00706       ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename);
00707    }
00708    return NULL;
00709 }

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 866 of file file.c.

References AST_FORMAT_AUDIO_MASK, ast_readaudio_callback(), ast_readvideo_callback(), ast_filestream::fmt, ast_format::format, and FSREAD_FAILURE.

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

00867 {
00868    enum fsread_res res;
00869 
00870    if (s->fmt->format & AST_FORMAT_AUDIO_MASK)
00871       res = ast_readaudio_callback(s);
00872    else
00873       res = ast_readvideo_callback(s);
00874 
00875    return (res == FSREAD_FAILURE) ? -1 : 0;
00876 }

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

Starts reading from a file.

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

Definition at line 997 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::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 handle_cli_file_convert().

00998 {
00999    FILE *bfile;
01000    struct ast_format *f;
01001    struct ast_filestream *fs = NULL;
01002    char *fn;
01003    int format_found = 0;   
01004 
01005    AST_RWLIST_RDLOCK(&formats);
01006 
01007    AST_RWLIST_TRAVERSE(&formats, f, list) {
01008       fs = NULL;
01009       if (!exts_compare(f->exts, type))
01010          continue;
01011       else 
01012          format_found = 1;
01013 
01014       fn = build_filename(filename, type);
01015       errno = 0;
01016       bfile = fopen(fn, "r");
01017 
01018       if (!bfile || (fs = get_filestream(f, bfile)) == NULL || open_wrapper(fs) ) {
01019          ast_log(LOG_WARNING, "Unable to open %s\n", fn);
01020          if (fs) {
01021             ast_closestream(fs);
01022          }
01023          fs = NULL;
01024          bfile = NULL;
01025          ast_free(fn);
01026          break;            
01027       }
01028       /* found it */
01029       fs->trans = NULL;
01030       fs->fmt = f;
01031       fs->flags = flags;
01032       fs->mode = mode;
01033       fs->filename = ast_strdup(filename);
01034       fs->vfs = NULL;
01035       break;
01036    }
01037 
01038    AST_RWLIST_UNLOCK(&formats);
01039    if (!format_found)
01040       ast_log(LOG_WARNING, "No such format '%s'\n", type);
01041 
01042    return fs;
01043 }

struct ast_frame* ast_readframe ( struct ast_filestream s  ) 

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 736 of file file.c.

References read_frame().

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

00737 {
00738    int whennext = 0;
00739 
00740    return read_frame(s, &whennext);
00741 }

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 878 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_streamfile(), ast_write(), dictate_exec(), handle_getoption(), handle_recordfile(), handle_streamfile(), and speech_streamfile().

00879 {
00880    return fs->fmt->seek(fs, sample_offset, whence);
00881 }

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 124 of file file.c.

References ast_channel_lock, ast_channel_unlock, ast_closestream(), ast_getformatname(), 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_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(), menu_callback(), minivm_greet_exec(), mp3_exec(), NBScat_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_file(), play_mailbox_owner(), playback_exec(), read_exec(), readexten_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().

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

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 1360 of file file.c.

References ast_streamfile(), ast_strlen_zero(), ast_test_suite_event_notify, ast_waitstream(), and ast_channel::language.

Referenced by __ast_play_and_record(), announce_user_count(), app_exec(), ast_pickup_call(), ast_record_review(), bridge_playfile(), builtin_atxfer(), builtin_automixmonitor(), builtin_blindtransfer(), confbridge_exec(), directory_exec(), feature_attended_transfer(), feature_blind_transfer(), forward_message(), grab_transfer(), invent_message(), ivr_dispatch(), join_conference_bridge(), masq_park_call(), menu_callback(), 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_file(), sayname(), select_item_seq(), vm_forwardoptions(), vmsayname_exec(), wait_file2(), and xfer_park_call_helper().

01361 {
01362    int res = 0;
01363    if (!ast_strlen_zero(file)) {
01364       ast_test_suite_event_notify("PLAYBACK", "Message: %s", file);
01365       res = ast_streamfile(chan, file, chan->language);
01366       if (!res) {
01367          res = ast_waitstream(chan, digits);
01368       }
01369    }
01370    return res;
01371 } 

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 893 of file file.c.

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

Referenced by waitstream_core().

00894 {
00895    return ast_seekstream(fs, ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
00896 }

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 898 of file file.c.

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

Referenced by handle_recordfile(), and waitstream_core().

00899 {
00900    return ast_seekstream(fs, -ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
00901 }

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 947 of file file.c.

References ast_applystream(), 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::format, LOG_WARNING, ast_channel::name, ast_channel::nativeformats, ast_filestream::orig_chan_name, ast_filestream::vfs, and ast_channel::writeformat.

Referenced by __analog_ss_thread(), action_bridge(), 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(), background_detect_exec(), bridge_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), 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(), menu_callback(), 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(), 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().

00948 {
00949    struct ast_filestream *fs;
00950    struct ast_filestream *vfs=NULL;
00951    char fmt[256];
00952    off_t pos;
00953    int seekattempt;
00954    int res;
00955 
00956    fs = ast_openstream(chan, filename, preflang);
00957    if (!fs) {
00958       ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname_multiple(fmt, sizeof(fmt), chan->nativeformats), strerror(errno));
00959       return -1;
00960    }
00961 
00962    /* check to see if there is any data present (not a zero length file),
00963     * done this way because there is no where for ast_openstream_full to
00964     * return the file had no data. */
00965    pos = ftello(fs->f);
00966    seekattempt = fseeko(fs->f, -1, SEEK_END);
00967    if (seekattempt) {
00968       if (errno == EINVAL) {
00969          /* Zero-length file, as opposed to a pipe */
00970          return 0;
00971       } else {
00972          ast_seekstream(fs, 0, SEEK_SET);
00973       }
00974    } else {
00975       fseeko(fs->f, pos, SEEK_SET);
00976    }
00977 
00978    vfs = ast_openvstream(chan, filename, preflang);
00979    if (vfs) {
00980       ast_debug(1, "Ooh, found a video stream, too, format %s\n", ast_getformatname(vfs->fmt->format));
00981    }
00982 
00983    if (ast_test_flag(chan, AST_FLAG_MASQ_NOSTREAM))
00984       fs->orig_chan_name = ast_strdup(chan->name);
00985    if (ast_applystream(chan, fs))
00986       return -1;
00987    if (vfs && ast_applystream(chan, vfs))
00988       return -1;
00989    res = ast_playstream(fs);
00990    if (!res && vfs)
00991       res = ast_playstream(vfs);
00992    ast_verb(3, "<%s> Playing '%s.%s' (language '%s')\n", chan->name, filename, ast_getformatname(chan->writeformat), preflang ? preflang : "default");
00993 
00994    return res;
00995 }

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 888 of file file.c.

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

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

00889 {
00890    return fs->fmt->tell(fs);
00891 }

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 883 of file file.c.

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

Referenced by handle_recordfile().

00884 {
00885    return fs->fmt->trunc(fs);
00886 }

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 1333 of file file.c.

References waitstream_core().

Referenced by __analog_ss_thread(), action_bridge(), 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(), bridge_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_run(), directory_exec(), find_conf_realtime(), gr_say_number_female(), handle_recordfile(), invent_message(), leave_voicemail(), local_attended_transfer(), login_exec(), menu_callback(), 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(), 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().

01334 {
01335    return waitstream_core(c, breakon, NULL, NULL, 0, -1, -1, NULL);
01336 }

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 1344 of file file.c.

References ast_channel::context, and waitstream_core().

Referenced by pbx_builtin_background().

01345 {
01346    /* Waitstream, with return in the case of a valid 1 digit extension */
01347    /* in the current or specified context being pressed */
01348 
01349    if (!context)
01350       context = c->context;
01351    return waitstream_core(c, NULL, NULL, NULL, 0,
01352       -1, -1, context);
01353 }

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 1327 of file file.c.

References waitstream_core().

Referenced by ast_control_streamfile().

01328 {
01329    return waitstream_core(c, breakon, forward, reverse, ms,
01330       -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */);
01331 }

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

Same as waitstream, but with audio output to fd and monitored fd checking.

Returns:
1 if monfd is ready for reading

Definition at line 1338 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_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(), handle_getoption(), handle_streamfile(), pl_odtworz_plik(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), and say_phonetic_str_full().

01339 {
01340    return waitstream_core(c, breakon, NULL, NULL, 0,
01341       audiofd, cmdfd, NULL /* no context */);
01342 }

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

Starts writing a file.

Parameters:
filename the name of the file to write to
type format of file you wish to write out to
comment comment to go with
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 1045 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::exts, exts_compare(), f, ast_filestream::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::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_thread(), recordthread(), and rpt().

01046 {
01047    int fd, myflags = 0;
01048    /* compiler claims this variable can be used before initialization... */
01049    FILE *bfile = NULL;
01050    struct ast_format *f;
01051    struct ast_filestream *fs = NULL;
01052    char *buf = NULL;
01053    size_t size = 0;
01054    int format_found = 0;
01055 
01056    AST_RWLIST_RDLOCK(&formats);
01057 
01058    /* set the O_TRUNC flag if and only if there is no O_APPEND specified */
01059    /* We really can't use O_APPEND as it will break WAV header updates */
01060    if (flags & O_APPEND) { 
01061       flags &= ~O_APPEND;
01062    } else {
01063       myflags = O_TRUNC;
01064    }
01065    
01066    myflags |= O_WRONLY | O_CREAT;
01067 
01068    /* XXX need to fix this - we should just do the fopen,
01069     * not open followed by fdopen()
01070     */
01071    AST_RWLIST_TRAVERSE(&formats, f, list) {
01072       char *fn, *orig_fn = NULL;
01073       if (fs)
01074          break;
01075 
01076       if (!exts_compare(f->exts, type))
01077          continue;
01078       else
01079          format_found = 1;
01080 
01081       fn = build_filename(filename, type);
01082       fd = open(fn, flags | myflags, mode);
01083       if (fd > -1) {
01084          /* fdopen() the resulting file stream */
01085          bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w");
01086          if (!bfile) {
01087             ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno));
01088             close(fd);
01089             fd = -1;
01090          }
01091       }
01092       
01093       if (ast_opt_cache_record_files && (fd > -1)) {
01094          char *c;
01095 
01096          fclose(bfile); /* this also closes fd */
01097          /*
01098            We touch orig_fn just as a place-holder so other things (like vmail) see the file is there.
01099            What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place.
01100          */
01101          orig_fn = ast_strdupa(fn);
01102          for (c = fn; *c; c++)
01103             if (*c == '/')
01104                *c = '_';
01105 
01106          size = strlen(fn) + strlen(record_cache_dir) + 2;
01107          buf = alloca(size);
01108          strcpy(buf, record_cache_dir);
01109          strcat(buf, "/");
01110          strcat(buf, fn);
01111          ast_free(fn);
01112          fn = buf;
01113          fd = open(fn, flags | myflags, mode);
01114          if (fd > -1) {
01115             /* fdopen() the resulting file stream */
01116             bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w");
01117             if (!bfile) {
01118                ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno));
01119                close(fd);
01120                fd = -1;
01121             }
01122          }
01123       }
01124       if (fd > -1) {
01125          errno = 0;
01126          fs = get_filestream(f, bfile);
01127          if (fs) {
01128             if ((fs->write_buffer = ast_malloc(32768))) {
01129                setvbuf(fs->f, fs->write_buffer, _IOFBF, 32768);
01130             }
01131          }
01132          if (!fs || rewrite_wrapper(fs, comment)) {
01133             ast_log(LOG_WARNING, "Unable to rewrite %s\n", fn);
01134             close(fd);
01135             if (orig_fn) {
01136                unlink(fn);
01137                unlink(orig_fn);
01138             }
01139             if (fs) {
01140                ast_closestream(fs);
01141                fs = NULL;
01142             }
01143             continue;
01144          }
01145          fs->trans = NULL;
01146          fs->fmt = f;
01147          fs->flags = flags;
01148          fs->mode = mode;
01149          if (orig_fn) {
01150             fs->realfilename = ast_strdup(orig_fn);
01151             fs->filename = ast_strdup(fn);
01152          } else {
01153             fs->realfilename = NULL;
01154             fs->filename = ast_strdup(filename);
01155          }
01156          fs->vfs = NULL;
01157          /* If truncated, we'll be at the beginning; if not truncated, then append */
01158          f->seek(fs, 0, SEEK_END);
01159       } else if (errno != EEXIST) {
01160          ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno));
01161          if (orig_fn)
01162             unlink(orig_fn);
01163       }
01164       /* if buf != NULL then fn is already free and pointing to it */
01165       if (!buf)
01166          ast_free(fn);
01167    }
01168 
01169    AST_RWLIST_UNLOCK(&formats);
01170 
01171    if (!format_found)
01172       ast_log(LOG_WARNING, "No such format '%s'\n", type);
01173 
01174    return fs;
01175 }

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 146 of file file.c.

References ast_debug, AST_FORMAT_AUDIO_MASK, 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(), f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, ast_format::format, ast_filestream::lastwriteformat, 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(), dictate_exec(), handle_cli_file_convert(), handle_recordfile(), mixmonitor_thread(), recordthread(), and rpt().

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


Generated on Sat Mar 10 01:55:23 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7