Thu Apr 28 2011 16:57:10

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

This graph shows which files directly or indirectly include this file:

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

#define AST_RESERVED_POINTERS   20

Definition at line 329 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:
chanchannel to work
sast_filestream to apply
Return values:
0on success.
-1on failure.

Definition at line 847 of file file.c.

References chan, and ast_filestream::owner.

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

{
   s->owner = chan;
   return 0;
}
int ast_closestream ( struct ast_filestream f)

Closes a stream.

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

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

{
   /* This used to destroy the filestream, but it now just decrements a refcount.
    * We need to force the stream to quit queuing frames now, because we might
    * change the writeformat, which could result in a subsequent write error, if
    * the format is different. */

   /* Stop a running stream if there is one */
   if (f->owner) {
      if (f->fmt->format < AST_FORMAT_AUDIO_MASK) {
         f->owner->stream = NULL;
         AST_SCHED_DEL(f->owner->sched, f->owner->streamid);
         ast_settimeout(f->owner, 0, NULL, NULL);
      } else {
         f->owner->vstream = NULL;
         AST_SCHED_DEL(f->owner->sched, f->owner->vstreamid);
      }
   }

   ao2_ref(f, -1);
   return 0;
}
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 1476 of file file.c.

References ARRAY_LEN, and ast_cli_register_multiple().

int ast_filecopy ( const char *  oldname,
const char *  newname,
const char *  fmt 
)

Copies a file.

Parameters:
oldnamename of the file you wish to copy (minus extension)
newnamename you wish the file to be copied to (minus extension)
fmtthe 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 941 of file file.c.

References ACTION_COPY, and ast_filehelper().

Referenced by copy_plain_file(), and vm_forwardoptions().

{
   return ast_filehelper(filename, filename2, fmt, ACTION_COPY);
}
int ast_filedelete ( const char *  filename,
const char *  fmt 
)

Deletes a file.

Parameters:
filenamename of the file you wish to delete (minus the extension)
fmtof the file Delete a given file in a given format, or if fmt is NULL, then do so for all

Definition at line 931 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(), dial_exec_full(), handle_cli_file_convert(), leave_voicemail(), play_record_review(), record_exec(), setup_privacy_args(), and vm_delete().

{
   return ast_filehelper(filename, NULL, fmt, ACTION_DELETE);
}
int ast_fileexists ( const char *  filename,
const char *  fmt,
const char *  preflang 
)

Checks for the existence of a given file.

Parameters:
filenamename of the file you wish to check, minus the extension
fmtthe 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 917 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(), dial_exec_full(), eivr_comm(), forward_message(), function_playback(), invent_message(), leave_voicemail(), minivm_delete_exec(), play_file(), 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().

{
   char *buf;
   int buflen;

   if (preflang == NULL)
      preflang = "";
   buflen = strlen(preflang) + strlen(filename) + 4;  /* room for everything */
   buf = alloca(buflen);
   if (buf == NULL)
      return 0;
   return fileexists_core(filename, fmt, preflang, buf, buflen);
}
int ast_filerename ( const char *  oldname,
const char *  newname,
const char *  fmt 
)

Renames a file.

Parameters:
oldnamethe name of the file you wish to act upon (minus the extension)
newnamethe name you wish to rename the file to (minus the extension)
fmtthe 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 936 of file file.c.

References ACTION_RENAME, and ast_filehelper().

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

{
   return ast_filehelper(filename, filename2, fmt, ACTION_RENAME);
}
char* ast_format_str_reduce ( char *  fmts)

Remove duplicate formats from a format string.

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

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

{
   struct ast_format *f;
   struct ast_format *fmts_ptr[AST_MAX_FORMATS];
   char *fmts_str[AST_MAX_FORMATS];
   char *stringp, *type;
   char *orig = fmts;
   int i, j, x, first, found = 0;
   int len = strlen(fmts) + 1;
   int res;

   if (AST_RWLIST_RDLOCK(&formats)) {
      ast_log(LOG_WARNING, "Unable to lock format list\n");
      return NULL;
   }

   stringp = ast_strdupa(fmts);

   for (x = 0; (type = strsep(&stringp, "|")) && x < AST_MAX_FORMATS; x++) {
      AST_RWLIST_TRAVERSE(&formats, f, list) {
         if (exts_compare(f->exts, type)) {
            found = 1;
            break;
         }
      }

      fmts_str[x] = type;
      if (found) {
         fmts_ptr[x] = f;
      } else {
         fmts_ptr[x] = NULL;
      }
   }
   AST_RWLIST_UNLOCK(&formats);

   first = 1;
   for (i = 0; i < x; i++) {
      /* ignore invalid entries */
      if (!fmts_ptr[i]) {
         ast_log(LOG_WARNING, "ignoring unknown format '%s'\n", fmts_str[i]);
         continue;
      }

      /* special handling for the first entry */
      if (first) {
         res = snprintf(fmts, len, "%s", fmts_str[i]);
         fmts += res;
         len -= res;
         first = 0;
         continue;
      }

      found = 0;
      for (j = 0; j < i; j++) {
         /* this is a duplicate */
         if (fmts_ptr[j] == fmts_ptr[i]) {
            found = 1;
            break;
         }
      }

      if (!found) {
         res = snprintf(fmts, len, "|%s", fmts_str[i]);
         fmts += res;
         len -= res;
      }
   }

   if (first) {
      ast_log(LOG_WARNING, "no known formats found in format list (%s)\n", orig);
      return NULL;
   }

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

Opens stream for use in seeking, playing.

Parameters:
chanchannel to work with
filenameto use
preflangprefered language to use
Return values:
aast_filestream pointer if it opens the file.
NULLon 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().

{
   return ast_openstream_full(chan, filename, preflang, 0);
}
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:
chanchannel to work with
filenameto use
preflangprefered language to use
asisif set, don't clear generators
Return values:
aast_filestream pointer if it opens the file.
NULLon 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().

{
   /* 
    * Use fileexists_core() to find a file in a compatible
    * language and format, set up a suitable translator,
    * and open the stream.
    */
   int fmts, res, buflen;
   char *buf;

   if (!asis) {
      /* do this first, otherwise we detect the wrong writeformat */
      ast_stopstream(chan);
      if (chan->generator)
         ast_deactivate_generator(chan);
   }
   if (preflang == NULL)
      preflang = "";
   buflen = strlen(preflang) + strlen(filename) + 4;
   buf = alloca(buflen);
   if (buf == NULL)
      return NULL;
   fmts = fileexists_core(filename, NULL, preflang, buf, buflen);
   if (fmts > 0)
      fmts &= AST_FORMAT_AUDIO_MASK;
   if (fmts < 1) {
      ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename);
      return NULL;
   }
   chan->oldwriteformat = chan->writeformat;
   /* Set the channel to a format we can work with */
   res = ast_set_write_format(chan, fmts);
   if (res == -1) {  /* No format available that works with this channel */
      return NULL;
   }
   res = ast_filehelper(buf, chan, NULL, ACTION_OPEN);
   if (res >= 0)
      return chan->stream;
   return NULL;
}
struct ast_filestream* ast_openvstream ( struct ast_channel chan,
const char *  filename,
const char *  preflang 
) [read]

Opens stream for use in seeking, playing.

Parameters:
chanchannel to work with
filenameto use
preflangprefered language to use
Return values:
aast_filestream pointer if it opens the file.
NULLon error.

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

{
   /* As above, but for video. But here we don't have translators
    * so we must enforce a format.
    */
   unsigned int format;
   char *buf;
   int buflen;

   if (preflang == NULL)
      preflang = "";
   buflen = strlen(preflang) + strlen(filename) + 4;
   buf = alloca(buflen);
   if (buf == NULL)
      return NULL;

   for (format = AST_FORMAT_AUDIO_MASK + 1; format <= AST_FORMAT_VIDEO_MASK; format = format << 1) {
      int fd;
      const char *fmt;

      if (!(chan->nativeformats & format))
         continue;
      fmt = ast_getformatname(format);
      if ( fileexists_core(filename, fmt, preflang, buf, buflen) < 1)   /* no valid format */
         continue;
      fd = ast_filehelper(buf, chan, fmt, ACTION_OPEN);
      if (fd >= 0)
         return chan->vstream;
      ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename);
   }
   return NULL;
}
int ast_playstream ( struct ast_filestream s)

Play a open stream on a channel.

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

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

{
   enum fsread_res res;

   if (s->fmt->format & AST_FORMAT_AUDIO_MASK)
      res = ast_readaudio_callback(s);
   else
      res = ast_readvideo_callback(s);

   return (res == FSREAD_FAILURE) ? -1 : 0;
}
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:
filenamethe name of the file to read from
typeformat of file you wish to read from
commentcomment to go with
flagsfile flags
check(unimplemented, hence negligible)
modeOpen 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:
astruct ast_filestream on success.
NULLon failure.

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

{
   FILE *bfile;
   struct ast_format *f;
   struct ast_filestream *fs = NULL;
   char *fn;
   int format_found = 0;   

   AST_RWLIST_RDLOCK(&formats);

   AST_RWLIST_TRAVERSE(&formats, f, list) {
      fs = NULL;
      if (!exts_compare(f->exts, type))
         continue;
      else 
         format_found = 1;

      fn = build_filename(filename, type);
      errno = 0;
      bfile = fopen(fn, "r");

      if (!bfile || (fs = get_filestream(f, bfile)) == NULL || open_wrapper(fs) ) {
         ast_log(LOG_WARNING, "Unable to open %s\n", fn);
         if (fs) {
            ast_closestream(fs);
         }
         fs = NULL;
         bfile = NULL;
         ast_free(fn);
         break;            
      }
      /* found it */
      fs->trans = NULL;
      fs->fmt = f;
      fs->flags = flags;
      fs->mode = mode;
      fs->filename = ast_strdup(filename);
      fs->vfs = NULL;
      break;
   }

   AST_RWLIST_UNLOCK(&formats);
   if (!format_found)
      ast_log(LOG_WARNING, "No such format '%s'\n", type);

   return fs;
}
struct ast_frame* ast_readframe ( struct ast_filestream s) [read]

Read a frame from a filestream.

Parameters:
sast_filestream to act on
Returns:
a frame.
Return values:
NULLif read failed.

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

{
   int whennext = 0;

   return read_frame(s, &whennext);
}
int ast_seekstream ( struct ast_filestream fs,
off_t  sample_offset,
int  whence 
)

Seeks into stream.

Parameters:
fsast_filestream to perform seek on
sample_offsetnumbers of samples to seek
whenceSEEK_SET, SEEK_CUR, SEEK_END
Return values:
0on success.
-1on failure.

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

{
   return fs->fmt->seek(fs, sample_offset, whence);
}
int ast_stopstream ( struct ast_channel c)

Stops a stream.

Parameters:
cThe channel you wish to stop playback on

Stop playback of a stream

Return values:
0always
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(), dial_exec_full(), directory_exec(), grab_transfer(), handle_getoption(), handle_speechrecognize(), handle_streamfile(), ices_exec(), ivr_dispatch(), leave_voicemail(), menu_callback(), 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().

{
   ast_channel_lock(tmp);

   /* Stop a running stream if there is one */
   if (tmp->stream) {
      ast_closestream(tmp->stream);
      tmp->stream = NULL;
      if (tmp->oldwriteformat && ast_set_write_format(tmp, tmp->oldwriteformat))
         ast_log(LOG_WARNING, "Unable to restore format back to %d\n", tmp->oldwriteformat);
   }
   /* Stop the video stream too */
   if (tmp->vstream != NULL) {
      ast_closestream(tmp->vstream);
      tmp->vstream = NULL;
   }

   ast_channel_unlock(tmp);

   return 0;
}
int ast_stream_and_wait ( struct ast_channel chan,
const char *  file,
const char *  digits 
)
int ast_stream_fastforward ( struct ast_filestream fs,
off_t  ms 
)

Fast forward stream ms.

Parameters:
fsfilestream to act on
msmilliseconds to move
Return values:
0on success.
-1on failure.

Definition at line 880 of file file.c.

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

Referenced by waitstream_core().

{
   return ast_seekstream(fs, ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
}
int ast_stream_rewind ( struct ast_filestream fs,
off_t  ms 
)

Rewind stream ms.

Parameters:
fsfilestream to act on
msmilliseconds to move
Return values:
0on success.
-1on failure.

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

{
   return ast_seekstream(fs, -ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
}
int ast_streamfile ( struct ast_channel c,
const char *  filename,
const char *  preflang 
)

Streams a file.

Parameters:
cchannel to stream the file to
filenamethe name of the file you wish to stream, minus the extension
preflangthe 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:
0on success.
-1on failure.

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

{
   struct ast_filestream *fs;
   struct ast_filestream *vfs=NULL;
   char fmt[256];
   int seekattempt;
   int res;

   fs = ast_openstream(chan, filename, preflang);
   if (!fs) {
      ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname_multiple(fmt, sizeof(fmt), chan->nativeformats), strerror(errno));
      return -1;
   }

   /* check to see if there is any data present (not a zero length file),
    * done this way because there is no where for ast_openstream_full to
    * return the file had no data. */
   seekattempt = fseek(fs->f, -1, SEEK_END);
   if (seekattempt && errno == EINVAL) {
      /* Zero-length file, as opposed to a pipe */
      return 0;
   } else {
      ast_seekstream(fs, 0, SEEK_SET);
   }

   vfs = ast_openvstream(chan, filename, preflang);
   if (vfs) {
      ast_debug(1, "Ooh, found a video stream, too, format %s\n", ast_getformatname(vfs->fmt->format));
   }

   if (ast_test_flag(chan, AST_FLAG_MASQ_NOSTREAM))
      fs->orig_chan_name = ast_strdup(chan->name);
   if (ast_applystream(chan, fs))
      return -1;
   if (vfs && ast_applystream(chan, vfs))
      return -1;
   res = ast_playstream(fs);
   if (!res && vfs)
      res = ast_playstream(vfs);
   ast_verb(3, "<%s> Playing '%s.%s' (language '%s')\n", chan->name, filename, ast_getformatname(chan->writeformat), preflang ? preflang : "default");

   return res;
}
off_t ast_tellstream ( struct ast_filestream fs)

Tell where we are in a stream.

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

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

{
   return fs->fmt->tell(fs);
}
int ast_truncstream ( struct ast_filestream fs)

Trunc stream at current location.

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

Definition at line 870 of file file.c.

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

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

{
   return fs->fmt->trunc(fs);
}
int ast_waitstream ( struct ast_channel c,
const char *  breakon 
)

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

Parameters:
cchannel to waitstream on
breakonstring 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:
0if the stream finishes
thecharacter if it was interrupted,
-1on error

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

{
   return waitstream_core(c, breakon, NULL, NULL, 0, -1, -1, NULL);
}
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:
cchannel to waitstream on
contextstring 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:
0if the stream finishes.
thecharacter if it was interrupted.
-1on error.

Definition at line 1332 of file file.c.

References ast_channel::context, and waitstream_core().

Referenced by pbx_builtin_background().

{
   /* Waitstream, with return in the case of a valid 1 digit extension */
   /* in the current or specified context being pressed */

   if (!context)
      context = c->context;
   return waitstream_core(c, NULL, NULL, NULL, 0,
      -1, -1, context);
}
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:
cchannel to waitstream on
breakonstring of DTMF digits to break upon
forwardDTMF digit to fast forward upon
rewindDTMF digit to rewind upon
msHow 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:
0if the stream finishes.
thecharacter if it was interrupted.
-1on error.

Definition at line 1315 of file file.c.

References waitstream_core().

Referenced by ast_control_streamfile().

{
   return waitstream_core(c, breakon, forward, reverse, ms,
      -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */);
}
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:
filenamethe name of the file to write to
typeformat of file you wish to write out to
commentcomment to go with
flagsoutput file flags
check(unimplemented, hence negligible)
modeOpen 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:
astruct ast_filestream on success.
NULLon failure.

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

{
   int fd, myflags = 0;
   /* compiler claims this variable can be used before initialization... */
   FILE *bfile = NULL;
   struct ast_format *f;
   struct ast_filestream *fs = NULL;
   char *buf = NULL;
   size_t size = 0;
   int format_found = 0;

   AST_RWLIST_RDLOCK(&formats);

   /* set the O_TRUNC flag if and only if there is no O_APPEND specified */
   /* We really can't use O_APPEND as it will break WAV header updates */
   if (flags & O_APPEND) { 
      flags &= ~O_APPEND;
   } else {
      myflags = O_TRUNC;
   }
   
   myflags |= O_WRONLY | O_CREAT;

   /* XXX need to fix this - we should just do the fopen,
    * not open followed by fdopen()
    */
   AST_RWLIST_TRAVERSE(&formats, f, list) {
      char *fn, *orig_fn = NULL;
      if (fs)
         break;

      if (!exts_compare(f->exts, type))
         continue;
      else
         format_found = 1;

      fn = build_filename(filename, type);
      fd = open(fn, flags | myflags, mode);
      if (fd > -1) {
         /* fdopen() the resulting file stream */
         bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w");
         if (!bfile) {
            ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno));
            close(fd);
            fd = -1;
         }
      }
      
      if (ast_opt_cache_record_files && (fd > -1)) {
         char *c;

         fclose(bfile); /* this also closes fd */
         /*
           We touch orig_fn just as a place-holder so other things (like vmail) see the file is there.
           What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place.
         */
         orig_fn = ast_strdupa(fn);
         for (c = fn; *c; c++)
            if (*c == '/')
               *c = '_';

         size = strlen(fn) + strlen(record_cache_dir) + 2;
         buf = alloca(size);
         strcpy(buf, record_cache_dir);
         strcat(buf, "/");
         strcat(buf, fn);
         ast_free(fn);
         fn = buf;
         fd = open(fn, flags | myflags, mode);
         if (fd > -1) {
            /* fdopen() the resulting file stream */
            bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w");
            if (!bfile) {
               ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno));
               close(fd);
               fd = -1;
            }
         }
      }
      if (fd > -1) {
         errno = 0;
         fs = get_filestream(f, bfile);
         if (fs) {
            if ((fs->write_buffer = ast_malloc(32768))) {
               setvbuf(fs->f, fs->write_buffer, _IOFBF, 32768);
            }
         }
         if (!fs || rewrite_wrapper(fs, comment)) {
            ast_log(LOG_WARNING, "Unable to rewrite %s\n", fn);
            close(fd);
            if (orig_fn) {
               unlink(fn);
               unlink(orig_fn);
            }
            if (fs) {
               ast_closestream(fs);
               fs = NULL;
            }
            continue;
         }
         fs->trans = NULL;
         fs->fmt = f;
         fs->flags = flags;
         fs->mode = mode;
         if (orig_fn) {
            fs->realfilename = ast_strdup(orig_fn);
            fs->filename = ast_strdup(fn);
         } else {
            fs->realfilename = NULL;
            fs->filename = ast_strdup(filename);
         }
         fs->vfs = NULL;
         /* If truncated, we'll be at the beginning; if not truncated, then append */
         f->seek(fs, 0, SEEK_END);
      } else if (errno != EEXIST) {
         ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno));
         if (orig_fn)
            unlink(orig_fn);
      }
      /* if buf != NULL then fn is already free and pointing to it */
      if (!buf)
         ast_free(fn);
   }

   AST_RWLIST_UNLOCK(&formats);

   if (!format_found)
      ast_log(LOG_WARNING, "No such format '%s'\n", type);

   return fs;
}
int ast_writestream ( struct ast_filestream fs,
struct ast_frame f 
)

Writes a frame to a stream.

Parameters:
fsfilestream to write to
fframe to write to the filestream Send a frame to a filestream -- note: does NOT free the frame, call ast_frfree manually
Return values:
0on success.
-1on 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::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().

{
   int res = -1;
   int alt = 0;
   if (f->frametype == AST_FRAME_VIDEO) {
      if (fs->fmt->format & AST_FORMAT_AUDIO_MASK) {
         /* This is the audio portion.  Call the video one... */
         if (!fs->vfs && fs->filename) {
            const char *type = ast_getformatname(f->subclass & ~0x1);
            fs->vfs = ast_writefile(fs->filename, type, NULL, fs->flags, 0, fs->mode);
            ast_debug(1, "Opened video output file\n");
         }
         if (fs->vfs)
            return ast_writestream(fs->vfs, f);
         /* else ignore */
         return 0;            
      } else {
         /* Might / might not have mark set */
         alt = 1;
      }
   } else if (f->frametype != AST_FRAME_VOICE) {
      ast_log(LOG_WARNING, "Tried to write non-voice frame\n");
      return -1;
   }
   if (((fs->fmt->format | alt) & f->subclass) == f->subclass) {
      res =  fs->fmt->write(fs, f);
      if (res < 0) 
         ast_log(LOG_WARNING, "Natural write failed\n");
      else if (res > 0)
         ast_log(LOG_WARNING, "Huh??\n");
   } else {
      /* XXX If they try to send us a type of frame that isn't the normal frame, and isn't
             the one we've setup a translator for, we do the "wrong thing" XXX */
      if (fs->trans && f->subclass != fs->lastwriteformat) {
         ast_translator_free_path(fs->trans);
         fs->trans = NULL;
      }
      if (!fs->trans) 
         fs->trans = ast_translator_build_path(fs->fmt->format, f->subclass);
      if (!fs->trans)
         ast_log(LOG_WARNING, "Unable to translate to format %s, source format %s\n",
            fs->fmt->name, ast_getformatname(f->subclass));
      else {
         struct ast_frame *trf;
         fs->lastwriteformat = f->subclass;
         /* Get the translated frame but don't consume the original in case they're using it on another stream */
         if ((trf = ast_translate(fs->trans, f, 0))) {
            struct ast_frame *cur;

            /* the translator may have returned multiple frames, so process them */
            for (cur = trf; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
               if ((res = fs->fmt->write(fs, trf))) {
                  ast_log(LOG_WARNING, "Translated frame write failed\n");
                  break;
               }
            }
            ast_frfree(trf);
         } else {
            res = 0;
         }
      }
   }
   return res;
}