Wed Oct 28 11:52:24 2009

Asterisk developer's documentation


file.h File Reference

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

Go to the source code of this file.

Defines

#define AST_DIGIT_ANY   "0123456789#*ABCD"
#define AST_DIGIT_ANYNUM   "0123456789"
#define AST_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.
struct ast_filestreamast_openstream (struct ast_channel *chan, const char *filename, const char *preflang)
 Opens stream for use in seeking, playing.
struct ast_filestreamast_openstream_full (struct ast_channel *chan, const char *filename, const char *preflang, int asis)
 Opens stream for use in seeking, playing.
struct ast_filestreamast_openvstream (struct ast_channel *chan, const char *filename, const char *preflang)
 Opens stream for use in seeking, playing.
int ast_playstream (struct ast_filestream *s)
 Play a open stream on a channel.
struct ast_filestreamast_readfile (const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode)
 Starts reading from a file.
struct ast_frameast_readframe (struct ast_filestream *s)
 Read a frame from a filestream.
int ast_seekstream (struct ast_filestream *fs, off_t sample_offset, int whence)
 Seeks into stream.
int ast_stopstream (struct ast_channel *c)
 Stops a stream.
int ast_stream_and_wait (struct ast_channel *chan, const char *file, const char *digits)
 stream file until digit If the file name is non-empty, try to play it.
int ast_stream_fastforward (struct ast_filestream *fs, off_t ms)
 Fast forward stream ms.
int ast_stream_rewind (struct ast_filestream *fs, off_t ms)
 Rewind stream ms.
int ast_streamfile (struct ast_channel *c, const char *filename, const char *preflang)
 Streams a file.
off_t ast_tellstream (struct ast_filestream *fs)
 Tell where we are in a stream.
int ast_truncstream (struct ast_filestream *fs)
 Trunc stream at current location.
int ast_waitstream (struct ast_channel *c, const char *breakon)
 Waits for a stream to stop or digit to be pressed.
int ast_waitstream_exten (struct ast_channel *c, const char *context)
 Waits for a stream to stop or digit matching a valid one digit exten to be pressed.
int ast_waitstream_fr (struct ast_channel *c, const char *breakon, const char *forward, const char *rewind, int ms)
 Same as waitstream but allows stream to be forwarded or rewound.
int ast_waitstream_full (struct ast_channel *c, const char *breakon, int audiofd, int monfd)
struct ast_filestreamast_writefile (const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode)
 Starts writing a file.
int ast_writestream (struct ast_filestream *fs, struct ast_frame *f)
 Writes a frame to a stream.


Detailed Description

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

Definition in file file.h.


Define Documentation

#define AST_DIGIT_ANY   "0123456789#*ABCD"

#define AST_DIGIT_ANYNUM   "0123456789"

Definition at line 45 of file file.h.

Referenced by initreqprep().

#define AST_RESERVED_POINTERS   20

Definition at line 326 of file file.h.

#define SEEK_FORCECUR   10


Function Documentation

int ast_applystream ( struct ast_channel chan,
struct ast_filestream s 
)

Applys a open stream to a channel.

Parameters:
chan channel to work
s ast_filestream to apply
Return values:
0 on success.
-1 on failure.

Definition at line 844 of file file.c.

References ast_filestream::owner.

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

00845 {
00846    s->owner = chan;
00847    return 0;
00848 }

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

References ao2_ref, AST_FORMAT_AUDIO_MASK, AST_SCHED_DEL, ast_settimeout(), ast_filestream::fmt, ast_format::format, ast_filestream::owner, ast_channel::sched, ast_channel::stream, ast_channel::streamid, ast_channel::vstream, and ast_channel::vstreamid.

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

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

int ast_file_init ( void   ) 

Initialize file stuff

Initializes all the various file stuff. Basically just registers the cli stuff Returns 0 all the time

Provided by file.c

Definition at line 1394 of file file.c.

References ast_cli_register_multiple().

Referenced by main().

01395 {
01396    ast_cli_register_multiple(cli_file, sizeof(cli_file) / sizeof(struct ast_cli_entry));
01397    return 0;
01398 }

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

References ACTION_COPY, and ast_filehelper().

Referenced by copy_plain_file(), and vm_forwardoptions().

00939 {
00940    return ast_filehelper(filename, filename2, fmt, ACTION_COPY);
00941 }

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

References ACTION_DELETE, and ast_filehelper().

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

00929 {
00930    return ast_filehelper(filename, NULL, fmt, ACTION_DELETE);
00931 }

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

Definition at line 914 of file file.c.

References buf, and fileexists_core().

Referenced by announce_thread(), app_exec(), ast_moh_files_next(), ast_monitor_start(), ast_monitor_stop(), common_exec(), eivr_comm(), forward_message(), function_playback(), invent_message(), leave_voicemail(), minivm_delete_exec(), play_message(), play_message_callerid(), 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().

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

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

References ACTION_RENAME, and ast_filehelper().

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

00934 {
00935    return ast_filehelper(filename, filename2, fmt, ACTION_RENAME);
00936 }

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

Opens stream for use in seeking, playing.

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

Definition at line 619 of file file.c.

References ast_openstream_full().

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

00620 {
00621    return ast_openstream_full(chan, filename, preflang, 0);
00622 }

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

Opens stream for use in seeking, playing.

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

Definition at line 624 of file file.c.

References ACTION_OPEN, ast_deactivate_generator(), ast_filehelper(), AST_FORMAT_AUDIO_MASK, ast_log(), ast_set_write_format(), ast_stopstream(), buf, fileexists_core(), ast_channel::generator, LOG_WARNING, ast_channel::oldwriteformat, ast_channel::stream, and ast_channel::writeformat.

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

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

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

Opens stream for use in seeking, playing.

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

Definition at line 662 of file file.c.

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

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

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

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

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

Starts reading from a file.

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

Definition at line 985 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 __ast_play_and_record(), and handle_cli_file_convert().

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

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

Read a frame from a filestream.

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

Definition at line 720 of file file.c.

References read_frame().

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

00721 {
00722    int whennext = 0;
00723 
00724    return read_frame(s, &whennext);
00725 }

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

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

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

00863 {
00864    return fs->fmt->seek(fs, sample_offset, whence);
00865 }

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

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

Referenced by _ast_adsi_transmit_message_full(), ast_control_streamfile(), ast_openstream_full(), ast_play_and_wait(), ast_readstring_full(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_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_zh(), background_detect_exec(), builtin_blindtransfer(), conf_exec(), conf_run(), directory_exec(), handle_getoption(), handle_speechrecognize(), handle_streamfile(), ices_exec(), ivr_dispatch(), leave_voicemail(), minivm_greet_exec(), mp3_exec(), NBScat_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_file(), play_mailbox_owner(), playback_exec(), queue_exec(), read_exec(), readexten_exec(), record_exec(), recordthread(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), sayfile(), saynum(), select_item_seq(), send_morse(), send_tone_telemetry(), send_waveform_to_channel(), speech_background(), vm_authenticate(), vm_execmain(), wait_for_winner(), waitstream_core(), and zapateller_exec().

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

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

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

Referenced by __ast_play_and_record(), app_exec(), ast_record_review(), bridge_playfile(), builtin_atxfer(), builtin_automixmonitor(), builtin_blindtransfer(), directory_exec(), forward_message(), invent_message(), ivr_dispatch(), leave_voicemail(), masq_park_call(), park_exec_full(), play_mailbox_owner(), play_message_callerid(), play_message_in_bridged_call(), play_record_review(), sayname(), select_item_seq(), and wait_file2().

01343 {
01344    int res = 0;
01345    if (!ast_strlen_zero(file)) {
01346       res = ast_streamfile(chan, file, chan->language);
01347       if (!res) {
01348          res = ast_waitstream(chan, digits);
01349       }
01350    }
01351    return res;
01352 } 

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

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

Referenced by waitstream_core().

00878 {
00879    return ast_seekstream(fs, ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
00880 }

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

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

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

00883 {
00884    return ast_seekstream(fs, -ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
00885 }

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 943 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 action_bridge(), agent_call(), announce_thread(), app_exec(), ast_app_getdata(), ast_app_getdata_full(), ast_control_streamfile(), ast_play_and_wait(), ast_say_date_da(), ast_say_date_de(), ast_say_date_en(), ast_say_date_fr(), ast_say_date_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_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_zh(), ast_say_time_de(), ast_say_time_en(), ast_say_time_fr(), ast_say_time_gr(), ast_say_time_hu(), ast_say_time_ka(), ast_say_time_nl(), ast_say_time_zh(), ast_stream_and_wait(), auth_exec(), background_detect_exec(), bridge_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_run(), dial_exec_full(), do_directory(), find_conf_realtime(), forward_message(), gr_say_number_female(), handle_recordfile(), invent_message(), leave_voicemail(), login_exec(), 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(), record_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), sayfile(), select_item_menu(), setup_privacy_args(), ss_thread(), vm_authenticate(), wait_file(), and wait_for_winner().

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

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

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

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

00873 {
00874    return fs->fmt->tell(fs);
00875 }

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

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

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

00868 {
00869    return fs->fmt->trunc(fs);
00870 }

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

References waitstream_core().

Referenced by action_bridge(), agent_call(), announce_thread(), app_exec(), ast_play_and_wait(), ast_say_date_da(), ast_say_date_de(), ast_say_date_en(), ast_say_date_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_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_zh(), ast_say_time_de(), ast_say_time_en(), ast_say_time_gr(), ast_say_time_he(), ast_say_time_hu(), ast_say_time_ka(), ast_say_time_nl(), ast_say_time_zh(), ast_stream_and_wait(), auth_exec(), bridge_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_run(), dial_exec_full(), directory_exec(), find_conf_realtime(), gr_say_number_female(), handle_recordfile(), invent_message(), leave_voicemail(), login_exec(), 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(), record_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), sayfile(), saynum(), select_item_menu(), send_morse(), send_tone_telemetry(), setup_privacy_args(), ss_thread(), vm_authenticate(), and wait_file().

01316 {
01317    return waitstream_core(c, breakon, NULL, NULL, 0, -1, -1, NULL);
01318 }

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

References ast_channel::context, and waitstream_core().

Referenced by pbx_builtin_background().

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

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

References waitstream_core().

Referenced by ast_control_streamfile().

01310 {
01311    return waitstream_core(c, breakon, forward, reverse, ms,
01312       -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */);
01313 }

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

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

Starts writing a file.

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

Definition at line 1033 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, buf, build_filename(), errno, ast_format::exts, exts_compare(), ast_filestream::f, f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, get_filestream(), LOG_WARNING, ast_filestream::mode, ast_filestream::realfilename, record_cache_dir, rewrite_wrapper(), ast_format::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(), record_exec(), recordthread(), and rpt().

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

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 144 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(), ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, ast_format::format, ast_frame::frame_list, ast_frame::frametype, ast_filestream::lastwriteformat, LOG_WARNING, ast_filestream::mode, ast_format::name, ast_frame::subclass, ast_filestream::trans, type, ast_filestream::vfs, and ast_format::write.

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

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


Generated on Wed Oct 28 11:52:25 2009 for Asterisk - the Open Source PBX by  doxygen 1.5.6