Mon Sep 20 2010 00:31:03

Asterisk developer's documentation


Defines | Functions

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>
Include dependency graph for file.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)
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 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:
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().

{
   s->owner = chan;
   return 0;
}

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

{
   /* 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 1471 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:
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().

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

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

{
   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:
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(), 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:
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 1355 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:
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().

{
   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:
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_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);
   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:
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_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:
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().

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

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

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

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

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

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

{
   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:
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(), 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)
      ast_seekstream(fs, 0, SEEK_SET);
   else
      return 0;

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

{
   return fs->fmt->tell(fs);
}

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

{
   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:
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 1316 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:
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 1327 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:
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 1310 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 */);
}

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

{
   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 || 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 */

         if ((fs->write_buffer = ast_malloc(32768))){
            setvbuf(fs->f, fs->write_buffer, _IOFBF, 32768);
         }

         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:
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::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;
}