Mon Jun 27 16:51:14 2011

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

References ast_filestream::owner.

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

00842 {
00843    s->owner = chan;
00844    return 0;
00845 }

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

References ao2_ref, AST_FORMAT_AUDIO_MASK, AST_SCHED_DEL, ast_settimeout(), f, and ast_format::format.

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().

00885 {
00886    /* This used to destroy the filestream, but it now just decrements a refcount.
00887     * We need to force the stream to quit queuing frames now, because we might
00888     * change the writeformat, which could result in a subsequent write error, if
00889     * the format is different. */
00890 
00891    /* Stop a running stream if there is one */
00892    if (f->owner) {
00893       if (f->fmt->format < AST_FORMAT_AUDIO_MASK) {
00894          f->owner->stream = NULL;
00895          AST_SCHED_DEL(f->owner->sched, f->owner->streamid);
00896          ast_settimeout(f->owner, 0, NULL, NULL);
00897       } else {
00898          f->owner->vstream = NULL;
00899          AST_SCHED_DEL(f->owner->sched, f->owner->vstreamid);
00900       }
00901    }
00902 
00903    ao2_ref(f, -1);
00904    return 0;
00905 }

int ast_file_init ( void   ) 

Provided by file.c

Definition at line 1474 of file file.c.

References ARRAY_LEN, ast_cli_register_multiple(), and cli_file.

01475 {
01476    ast_cli_register_multiple(cli_file, ARRAY_LEN(cli_file));
01477    return 0;
01478 }

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

References ast_filehelper().

Referenced by copy_plain_file(), and vm_forwardoptions().

00936 {
00937    return ast_filehelper(filename, filename2, fmt, ACTION_COPY);
00938 }

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 925 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().

00926 {
00927    return ast_filehelper(filename, NULL, fmt, ACTION_DELETE);
00928 }

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 911 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(), 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().

00912 {
00913    char *buf;
00914    int buflen;
00915 
00916    if (preflang == NULL)
00917       preflang = "";
00918    buflen = strlen(preflang) + strlen(filename) + 4;  /* room for everything */
00919    buf = alloca(buflen);
00920    if (buf == NULL)
00921       return 0;
00922    return fileexists_core(filename, fmt, preflang, buf, buflen);
00923 }

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 930 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().

00931 {
00932    return ast_filehelper(filename, filename2, fmt, ACTION_RENAME);
00933 }

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 1358 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 load_config().

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

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

References ast_openstream_full().

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

00613 {
00614    return ast_openstream_full(chan, filename, preflang, 0);
00615 }

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 617 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().

00618 {
00619    /* 
00620     * Use fileexists_core() to find a file in a compatible
00621     * language and format, set up a suitable translator,
00622     * and open the stream.
00623     */
00624    format_t fmts, res;
00625    int buflen;
00626    char *buf;
00627 
00628    if (!asis) {
00629       /* do this first, otherwise we detect the wrong writeformat */
00630       ast_stopstream(chan);
00631       if (chan->generator)
00632          ast_deactivate_generator(chan);
00633    }
00634    if (preflang == NULL)
00635       preflang = "";
00636    buflen = strlen(preflang) + strlen(filename) + 4;
00637    buf = alloca(buflen);
00638    if (buf == NULL)
00639       return NULL;
00640    fmts = fileexists_core(filename, NULL, preflang, buf, buflen);
00641    if (fmts > 0)
00642       fmts &= AST_FORMAT_AUDIO_MASK;
00643    if (fmts < 1) {
00644       ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename);
00645       return NULL;
00646    }
00647    chan->oldwriteformat = chan->writeformat;
00648    /* Set the channel to a format we can work with */
00649    res = ast_set_write_format(chan, fmts);
00650    if (res == -1) {  /* No format available that works with this channel */
00651       return NULL;
00652    }
00653    res = ast_filehelper(buf, chan, NULL, ACTION_OPEN);
00654    if (res >= 0)
00655       return chan->stream;
00656    return NULL;
00657 }

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

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

00660 {
00661    /* As above, but for video. But here we don't have translators
00662     * so we must enforce a format.
00663     */
00664    format_t format;
00665    char *buf;
00666    int buflen;
00667 
00668    if (preflang == NULL)
00669       preflang = "";
00670    buflen = strlen(preflang) + strlen(filename) + 4;
00671    buf = alloca(buflen);
00672    if (buf == NULL)
00673       return NULL;
00674 
00675    for (format = AST_FORMAT_AUDIO_MASK + 1; format <= AST_FORMAT_VIDEO_MASK; format = format << 1) {
00676       int fd;
00677       const char *fmt;
00678 
00679       if (!(chan->nativeformats & format))
00680          continue;
00681       fmt = ast_getformatname(format);
00682       if ( fileexists_core(filename, fmt, preflang, buf, buflen) < 1)   /* no valid format */
00683          continue;
00684       fd = ast_filehelper(buf, chan, fmt, ACTION_OPEN);
00685       if (fd >= 0)
00686          return chan->vstream;
00687       ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename);
00688    }
00689    return NULL;
00690 }

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 847 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().

00848 {
00849    enum fsread_res res;
00850 
00851    if (s->fmt->format & AST_FORMAT_AUDIO_MASK)
00852       res = ast_readaudio_callback(s);
00853    else
00854       res = ast_readvideo_callback(s);
00855 
00856    return (res == FSREAD_FAILURE) ? -1 : 0;
00857 }

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 984 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().

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

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

References read_frame().

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

00718 {
00719    int whennext = 0;
00720 
00721    return read_frame(s, &whennext);
00722 }

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 859 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().

00860 {
00861    return fs->fmt->seek(fs, sample_offset, whence);
00862 }

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 123 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(), builtin_blindtransfer(), 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().

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

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

References ast_streamfile(), ast_strlen_zero(), 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_exec_full(), play_mailbox_owner(), play_message_callerid(), play_message_in_bridged_call(), play_prompt_to_channel(), play_record_review(), play_sound_file(), sayname(), select_item_seq(), vmsayname_exec(), and wait_file2().

01347 {
01348    int res = 0;
01349    if (!ast_strlen_zero(file)) {
01350       res = ast_streamfile(chan, file, chan->language);
01351       if (!res) {
01352          res = ast_waitstream(chan, digits);
01353       }
01354    }
01355    return res;
01356 } 

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

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

Referenced by waitstream_core().

00875 {
00876    return ast_seekstream(fs, ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
00877 }

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

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

Referenced by handle_recordfile(), and waitstream_core().

00880 {
00881    return ast_seekstream(fs, -ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
00882 }

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 940 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(), park_exec_full(), 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().

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

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 869 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().

00870 {
00871    return fs->fmt->tell(fs);
00872 }

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

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

Referenced by handle_recordfile().

00865 {
00866    return fs->fmt->trunc(fs);
00867 }

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 1319 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(), park_exec_full(), 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().

01320 {
01321    return waitstream_core(c, breakon, NULL, NULL, 0, -1, -1, NULL);
01322 }

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

References ast_channel::context, and waitstream_core().

Referenced by pbx_builtin_background().

01331 {
01332    /* Waitstream, with return in the case of a valid 1 digit extension */
01333    /* in the current or specified context being pressed */
01334 
01335    if (!context)
01336       context = c->context;
01337    return waitstream_core(c, NULL, NULL, NULL, 0,
01338       -1, -1, context);
01339 }

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

References waitstream_core().

Referenced by ast_control_streamfile().

01314 {
01315    return waitstream_core(c, breakon, forward, reverse, ms,
01316       -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */);
01317 }

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 1324 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().

01325 {
01326    return waitstream_core(c, breakon, NULL, NULL, 0,
01327       audiofd, cmdfd, NULL /* no context */);
01328 }

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 1032 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().

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

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 145 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().

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


Generated on Mon Jun 27 16:51:14 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7