#include <fcntl.h>
#include <sys/mman.h>
Go to the source code of this file.
Defines | |
#define | AST_DIGIT_ANY "0123456789#*ABCD" |
#define | AST_DIGIT_ANYNUM "0123456789" |
#define | 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_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. | |
void | ast_filestream_frame_freed (struct ast_frame *fr) |
destroy a filestream using an ast_frame as input | |
ast_filestream * | ast_openstream (struct ast_channel *chan, const char *filename, const char *preflang) |
Opens stream for use in seeking, playing. | |
ast_filestream * | ast_openstream_full (struct ast_channel *chan, const char *filename, const char *preflang, int asis) |
Opens stream for use in seeking, playing. | |
ast_filestream * | ast_openvstream (struct ast_channel *chan, const char *filename, const char *preflang) |
Opens stream for use in seeking, playing. | |
int | ast_playstream (struct ast_filestream *s) |
Play a open stream on a channel. | |
ast_filestream * | ast_readfile (const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode) |
Starts reading from a file. | |
ast_frame * | ast_readframe (struct ast_filestream *s) |
Read a frame from a filestream. | |
int | ast_seekstream (struct ast_filestream *fs, off_t sample_offset, int whence) |
Seeks into stream. | |
int | ast_stopstream (struct ast_channel *c) |
Stops a stream. | |
int | ast_stream_and_wait (struct ast_channel *chan, const char *file, const char *digits) |
stream file until digit If the file name is non-empty, try to play it. | |
int | ast_stream_fastforward (struct ast_filestream *fs, off_t ms) |
Fast forward stream ms. | |
int | ast_stream_rewind (struct ast_filestream *fs, off_t ms) |
Rewind stream ms. | |
int | ast_streamfile (struct ast_channel *c, const char *filename, const char *preflang) |
Streams a file. | |
off_t | ast_tellstream (struct ast_filestream *fs) |
Tell where we are in a stream. | |
int | ast_truncstream (struct ast_filestream *fs) |
Trunc stream at current location. | |
int | ast_waitstream (struct ast_channel *c, const char *breakon) |
Waits for a stream to stop or digit to be pressed. | |
int | ast_waitstream_exten (struct ast_channel *c, const char *context) |
Waits for a stream to stop or digit matching a valid one digit exten to be pressed. | |
int | ast_waitstream_fr (struct ast_channel *c, const char *breakon, const char *forward, const char *rewind, int ms) |
Same as waitstream but allows stream to be forwarded or rewound. | |
int | ast_waitstream_full (struct ast_channel *c, const char *breakon, int audiofd, int monfd) |
ast_filestream * | ast_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. |
Definition in file file.h.
#define AST_DIGIT_ANY "0123456789#*ABCD" |
Convenient for waiting
Definition at line 44 of file file.h.
Referenced by ast_ivr_menu_run_internal(), ast_play_and_wait(), ast_readstring_full(), ast_record_review(), bridge_playfile(), builtin_atxfer(), builtin_blindtransfer(), conf_exec(), conf_run(), dial_exec_full(), dictate_exec(), directory_exec(), festival_exec(), get_folder(), ivr_dispatch(), pbx_builtin_background(), play_file(), play_mailbox_owner(), play_message(), play_message_callerid(), play_message_datetime(), play_message_duration(), play_record_review(), retrydial_exec(), say_and_wait(), say_position(), sayunixtime_exec(), select_item_menu(), select_item_seq(), vm_intro_gr(), vm_intro_multilang(), vm_intro_pt(), vm_intro_pt_BR(), and wait_file2().
#define AST_DIGIT_ANYNUM "0123456789" |
#define SEEK_FORCECUR 10 |
Definition at line 47 of file file.h.
Referenced by __ast_read(), ast_write(), au_seek(), g729_seek(), gsm_seek(), ilbc_seek(), pcm_seek(), slinear_seek(), vox_seek(), and wav_seek().
int ast_applystream | ( | struct ast_channel * | chan, | |
struct ast_filestream * | s | |||
) |
Applys a open stream to a channel.
chan | channel to work | |
s | ast_filestream to apply |
0 | on success. | |
-1 | on failure. |
Definition at line 827 of file file.c.
Referenced by ast_streamfile(), handle_getoption(), handle_recordfile(), handle_streamfile(), and speech_streamfile().
int ast_closestream | ( | struct ast_filestream * | f | ) |
Closes a stream.
f | filestream to close Close a playback or recording stream |
0 | on success. | |
-1 | on failure. |
Definition at line 870 of file file.c.
References ao2_ref(), AST_FRFLAG_FROM_FILESTREAM, ast_test_flag, and f.
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(), and moh_files_release().
00871 { 00872 if (ast_test_flag(&f->fr, AST_FRFLAG_FROM_FILESTREAM)) { 00873 /* If this flag is still set, it essentially means that the reference 00874 * count of f is non-zero. We can't destroy this filestream until 00875 * whatever is using the filestream's frame has finished. 00876 * 00877 * Since this was called, however, we need to remove the reference from 00878 * when this filestream was first allocated. That way, when the embedded 00879 * frame is freed, the refcount will reach 0 and we can finish destroying 00880 * this filestream properly. 00881 */ 00882 ao2_ref(f, -1); 00883 return 0; 00884 } 00885 00886 ao2_ref(f, -1); 00887 return 0; 00888 }
int ast_filecopy | ( | const char * | oldname, | |
const char * | newname, | |||
const char * | fmt | |||
) |
Copies a file.
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 918 of file file.c.
References ast_filehelper().
Referenced by copy_plain_file(), and vm_forwardoptions().
00919 { 00920 return ast_filehelper(filename, filename2, fmt, ACTION_COPY); 00921 }
int ast_filedelete | ( | const char * | filename, | |
const char * | fmt | |||
) |
Deletes a file.
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 908 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_mailbox_owner(), play_record_review(), setup_privacy_args(), vm_delete(), and vm_forwardoptions().
00909 { 00910 return ast_filehelper(filename, NULL, fmt, ACTION_DELETE); 00911 }
int ast_fileexists | ( | const char * | filename, | |
const char * | fmt, | |||
const char * | preflang | |||
) |
Checks for the existence of a given file.
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. |
Definition at line 894 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(), invent_message(), leave_voicemail(), minivm_delete_exec(), play_greeting(), play_mailbox_owner(), play_message_callerid(), record_exec(), retrydial_exec(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), setup_privacy_args(), vm_intro(), vm_newuser(), vm_options(), and vm_tempgreeting().
00895 { 00896 char *buf; 00897 int buflen; 00898 00899 if (preflang == NULL) 00900 preflang = ""; 00901 buflen = strlen(preflang) + strlen(filename) + 4; /* room for everything */ 00902 buf = alloca(buflen); 00903 if (buf == NULL) 00904 return 0; 00905 return fileexists_core(filename, fmt, preflang, buf, buflen); 00906 }
int ast_filerename | ( | const char * | oldname, | |
const char * | newname, | |||
const char * | fmt | |||
) |
Renames a file.
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 |
Definition at line 913 of file file.c.
References ACTION_RENAME, and ast_filehelper().
Referenced by __ast_play_and_record(), ast_monitor_stop(), play_record_review(), and rename_file().
00914 { 00915 return ast_filehelper(filename, filename2, fmt, ACTION_RENAME); 00916 }
void ast_filestream_frame_freed | ( | struct ast_frame * | fr | ) |
destroy a filestream using an ast_frame as input
This is a hack that is used also by the ast_trans_pvt and ast_dsp structures. When a structure contains an ast_frame pointer as one of its fields. It may be that the frame is still used after the outer structure is freed. This leads to invalid memory accesses. This function allows for us to hold off on destroying the ast_filestream until we are done using the ast_frame pointer that is part of it
fr | The ast_frame that is part of an ast_filestream we wish to free. |
Definition at line 1294 of file file.c.
References ao2_ref(), ast_clear_flag, AST_FRFLAG_FROM_FILESTREAM, and ast_filestream::fr.
Referenced by __frame_free().
01295 { 01296 struct ast_filestream *fs; 01297 01298 ast_clear_flag(fr, AST_FRFLAG_FROM_FILESTREAM); 01299 01300 fs = (struct ast_filestream *) (((char *) fr) - offsetof(struct ast_filestream, fr)); 01301 01302 ao2_ref(fs, -1); 01303 }
struct ast_filestream* ast_openstream | ( | struct ast_channel * | chan, | |
const char * | filename, | |||
const char * | preflang | |||
) |
Opens stream for use in seeking, playing.
chan | channel to work with | |
filename | to use | |
preflang | prefered language to use |
a | ast_filestream pointer if it opens the file. | |
NULL | on error. |
Definition at line 613 of file file.c.
References ast_openstream_full(), and chan.
Referenced by ast_streamfile(), dictate_exec(), handle_getoption(), handle_streamfile(), and speech_streamfile().
00614 { 00615 return ast_openstream_full(chan, filename, preflang, 0); 00616 }
struct ast_filestream* ast_openstream_full | ( | struct ast_channel * | chan, | |
const char * | filename, | |||
const char * | preflang, | |||
int | asis | |||
) |
Opens stream for use in seeking, playing.
chan | channel to work with | |
filename | to use | |
preflang | prefered language to use | |
asis | if set, don't clear generators |
a | ast_filestream pointer if it opens the file. | |
NULL | on error. |
Definition at line 618 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, chan, fileexists_core(), LOG_WARNING, ast_channel::oldwriteformat, ast_channel::stream, and ast_channel::writeformat.
Referenced by ast_moh_files_next(), ast_openstream(), and gen_nextfile().
00619 { 00620 /* 00621 * Use fileexists_core() to find a file in a compatible 00622 * language and format, set up a suitable translator, 00623 * and open the stream. 00624 */ 00625 int fmts, res, buflen; 00626 char *buf; 00627 00628 if (!asis) { 00629 /* do this first, otherwise we detect the wrong writeformat */ 00630 ast_stopstream(chan); 00631 if (chan->generator) 00632 ast_deactivate_generator(chan); 00633 } 00634 if (preflang == NULL) 00635 preflang = ""; 00636 buflen = strlen(preflang) + strlen(filename) + 4; 00637 buf = alloca(buflen); 00638 if (buf == NULL) 00639 return NULL; 00640 fmts = fileexists_core(filename, NULL, preflang, buf, buflen); 00641 if (fmts > 0) 00642 fmts &= AST_FORMAT_AUDIO_MASK; 00643 if (fmts < 1) { 00644 ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename); 00645 return NULL; 00646 } 00647 chan->oldwriteformat = chan->writeformat; 00648 /* Set the channel to a format we can work with */ 00649 res = ast_set_write_format(chan, fmts); 00650 res = ast_filehelper(buf, chan, NULL, ACTION_OPEN); 00651 if (res >= 0) 00652 return chan->stream; 00653 return NULL; 00654 }
struct ast_filestream* ast_openvstream | ( | struct ast_channel * | chan, | |
const char * | filename, | |||
const char * | preflang | |||
) |
Opens stream for use in seeking, playing.
chan | channel to work with | |
filename | to use | |
preflang | prefered language to use |
a | ast_filestream pointer if it opens the file. | |
NULL | on error. |
Definition at line 656 of file file.c.
References ACTION_OPEN, ast_filehelper(), AST_FORMAT_AUDIO_MASK, AST_FORMAT_VIDEO_MASK, ast_getformatname(), ast_log(), buf, chan, fileexists_core(), ast_filestream::fmt, format, LOG_WARNING, ast_channel::nativeformats, and ast_channel::vstream.
Referenced by ast_streamfile(), handle_getoption(), and handle_streamfile().
00657 { 00658 /* As above, but for video. But here we don't have translators 00659 * so we must enforce a format. 00660 */ 00661 unsigned int format; 00662 char *buf; 00663 int buflen; 00664 00665 if (preflang == NULL) 00666 preflang = ""; 00667 buflen = strlen(preflang) + strlen(filename) + 4; 00668 buf = alloca(buflen); 00669 if (buf == NULL) 00670 return NULL; 00671 00672 for (format = AST_FORMAT_AUDIO_MASK + 1; format <= AST_FORMAT_VIDEO_MASK; format = format << 1) { 00673 int fd; 00674 const char *fmt; 00675 00676 if (!(chan->nativeformats & format)) 00677 continue; 00678 fmt = ast_getformatname(format); 00679 if ( fileexists_core(filename, fmt, preflang, buf, buflen) < 1) /* no valid format */ 00680 continue; 00681 fd = ast_filehelper(buf, chan, fmt, ACTION_OPEN); 00682 if (fd >= 0) 00683 return chan->vstream; 00684 ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename); 00685 } 00686 return NULL; 00687 }
int ast_playstream | ( | struct ast_filestream * | s | ) |
Play a open stream on a channel.
s | filestream to play |
0 | on success. | |
-1 | on failure. |
Definition at line 833 of file file.c.
References AST_FORMAT_AUDIO_MASK, ast_readaudio_callback(), ast_readvideo_callback(), FSREAD_FAILURE, and s.
Referenced by ast_streamfile(), handle_getoption(), handle_streamfile(), and speech_streamfile().
00834 { 00835 enum fsread_res res; 00836 00837 if (s->fmt->format & AST_FORMAT_AUDIO_MASK) 00838 res = ast_readaudio_callback(s); 00839 else 00840 res = ast_readvideo_callback(s); 00841 00842 return (res == FSREAD_FAILURE) ? -1 : 0; 00843 }
struct ast_filestream* ast_readfile | ( | const char * | filename, | |
const char * | type, | |||
const char * | comment, | |||
int | flags, | |||
int | check, | |||
mode_t | mode | |||
) |
Starts reading from a file.
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. |
a | struct ast_filestream on success. | |
NULL | on failure. |
Definition at line 954 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().
00955 { 00956 FILE *bfile; 00957 struct ast_format *f; 00958 struct ast_filestream *fs = NULL; 00959 char *fn; 00960 int format_found = 0; 00961 00962 AST_RWLIST_RDLOCK(&formats); 00963 00964 AST_RWLIST_TRAVERSE(&formats, f, list) { 00965 fs = NULL; 00966 if (!exts_compare(f->exts, type)) 00967 continue; 00968 else 00969 format_found = 1; 00970 00971 fn = build_filename(filename, type); 00972 errno = 0; 00973 bfile = fopen(fn, "r"); 00974 00975 if (!bfile || (fs = get_filestream(f, bfile)) == NULL || open_wrapper(fs) ) { 00976 ast_log(LOG_WARNING, "Unable to open %s\n", fn); 00977 if (fs) { 00978 ast_closestream(fs); 00979 } 00980 fs = NULL; 00981 bfile = NULL; 00982 ast_free(fn); 00983 break; 00984 } 00985 /* found it */ 00986 fs->trans = NULL; 00987 fs->fmt = f; 00988 fs->flags = flags; 00989 fs->mode = mode; 00990 fs->filename = ast_strdup(filename); 00991 fs->vfs = NULL; 00992 break; 00993 } 00994 00995 AST_RWLIST_UNLOCK(&formats); 00996 if (!format_found) 00997 ast_log(LOG_WARNING, "No such format '%s'\n", type); 00998 00999 return fs; 01000 }
struct ast_frame* ast_readframe | ( | struct ast_filestream * | s | ) |
Read a frame from a filestream.
s | ast_filestream to act on |
NULL | if read failed. |
Definition at line 689 of file file.c.
References ao2_ref(), AST_FRFLAG_FROM_FILESTREAM, ast_set_flag, f, and s.
Referenced by __ast_play_and_record(), dictate_exec(), gen_readframe(), handle_cli_file_convert(), and moh_files_readframe().
00690 { 00691 struct ast_frame *f = NULL; 00692 int whennext = 0; 00693 if (s && s->fmt) 00694 f = s->fmt->read(s, &whennext); 00695 if (f) { 00696 ast_set_flag(f, AST_FRFLAG_FROM_FILESTREAM); 00697 ao2_ref(s, +1); 00698 } 00699 return f; 00700 }
int ast_seekstream | ( | struct ast_filestream * | fs, | |
off_t | sample_offset, | |||
int | whence | |||
) |
Seeks into stream.
fs | ast_filestream to perform seek on | |
sample_offset | numbers of samples to seek | |
whence | SEEK_SET, SEEK_CUR, SEEK_END |
0 | on success. | |
-1 | on failure. |
Definition at line 845 of file file.c.
References ast_filestream::fmt, and ast_format::seek.
Referenced by __ast_read(), ast_control_streamfile(), ast_stream_fastforward(), ast_stream_rewind(), ast_write(), dictate_exec(), handle_getoption(), handle_recordfile(), handle_streamfile(), and speech_streamfile().
int ast_stopstream | ( | struct ast_channel * | c | ) |
Stops a stream.
c | The channel you wish to stop playback on |
0 | always |
Definition at line 121 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_cz(), 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_ge(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), 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_tw(), background_detect_exec(), builtin_blindtransfer(), conf_exec(), conf_run(), directory_exec(), handle_getoption(), handle_speechrecognize(), handle_streamfile(), ices_exec(), ivr_dispatch(), minivm_greet_exec(), mp3_exec(), NBScat_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_file(), play_mailbox_owner(), playback_exec(), read_exec(), readexten_exec(), recordthread(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), saydigits(), 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().
00122 { 00123 ast_channel_lock(tmp); 00124 00125 /* Stop a running stream if there is one */ 00126 if (tmp->stream) { 00127 ast_closestream(tmp->stream); 00128 tmp->stream = NULL; 00129 if (tmp->oldwriteformat && ast_set_write_format(tmp, tmp->oldwriteformat)) 00130 ast_log(LOG_WARNING, "Unable to restore format back to %d\n", tmp->oldwriteformat); 00131 } 00132 /* Stop the video stream too */ 00133 if (tmp->vstream != NULL) { 00134 ast_closestream(tmp->vstream); 00135 tmp->vstream = NULL; 00136 } 00137 00138 ast_channel_unlock(tmp); 00139 00140 return 0; 00141 }
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.
-1 | if error. | |
digit | if interrupted by a digit. |
Definition at line 1310 of file file.c.
References ast_streamfile(), ast_strlen_zero(), ast_waitstream(), chan, and ast_channel::language.
Referenced by __ast_play_and_record(), app_exec(), ast_record_review(), bridge_playfile(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), builtin_blindtransfer(), directory_exec(), forward_message(), invent_message(), ivr_dispatch(), masq_park_call(), park_exec(), play_mailbox_owner(), play_message_callerid(), play_record_review(), select_item_seq(), and wait_file2().
01311 { 01312 int res = 0; 01313 if (!ast_strlen_zero(file)) { 01314 res = ast_streamfile(chan, file, chan->language); 01315 if (!res) { 01316 res = ast_waitstream(chan, digits); 01317 } 01318 } 01319 return res; 01320 }
int ast_stream_fastforward | ( | struct ast_filestream * | fs, | |
off_t | ms | |||
) |
Fast forward stream ms.
fs | filestream to act on | |
ms | milliseconds to move |
0 | on success. | |
-1 | on failure. |
Definition at line 860 of file file.c.
References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.
Referenced by waitstream_core().
00861 { 00862 return ast_seekstream(fs, ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR); 00863 }
int ast_stream_rewind | ( | struct ast_filestream * | fs, | |
off_t | ms | |||
) |
Rewind stream ms.
fs | filestream to act on | |
ms | milliseconds to move |
0 | on success. | |
-1 | on failure. |
Definition at line 865 of file file.c.
References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.
Referenced by __ast_play_and_record(), handle_recordfile(), and waitstream_core().
00866 { 00867 return ast_seekstream(fs, -ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR); 00868 }
int ast_streamfile | ( | struct ast_channel * | c, | |
const char * | filename, | |||
const char * | preflang | |||
) |
Streams a file.
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. |
0 | on success. | |
-1 | on failure. |
Definition at line 923 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_strdup, ast_test_flag, ast_verb, chan, errno, 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_ge(), ast_say_date_gr(), ast_say_date_he(), ast_say_date_hu(), 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_ge(), ast_say_datetime_from_now_he(), ast_say_datetime_gr(), ast_say_datetime_he(), ast_say_datetime_nl(), ast_say_datetime_pt(), ast_say_datetime_th(), ast_say_datetime_tw(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cz(), 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_ge(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), 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_tw(), ast_say_time_de(), ast_say_time_en(), ast_say_time_fr(), ast_say_time_ge(), ast_say_time_gr(), ast_say_time_hu(), ast_say_time_nl(), ast_say_time_tw(), ast_stream_and_wait(), background_detect_exec(), bridge_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_run(), dial_exec_full(), do_directory(), find_conf_realtime(), forward_message(), gr_say_number_female(), handle_recordfile(), invent_message(), leave_voicemail(), login_exec(), minivm_greet_exec(), page_exec(), park_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_greeting(), play_record_review(), playback_exec(), privacy_exec(), readexten_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), sayfile(), select_item_menu(), setup_privacy_args(), ss_thread(), vm_authenticate(), wait_file(), and wait_for_winner().
00924 { 00925 struct ast_filestream *fs; 00926 struct ast_filestream *vfs=NULL; 00927 char fmt[256]; 00928 00929 fs = ast_openstream(chan, filename, preflang); 00930 if (fs) 00931 vfs = ast_openvstream(chan, filename, preflang); 00932 if (vfs) { 00933 ast_debug(1, "Ooh, found a video stream, too, format %s\n", ast_getformatname(vfs->fmt->format)); 00934 } 00935 if (fs){ 00936 int res; 00937 if (ast_test_flag(chan, AST_FLAG_MASQ_NOSTREAM)) 00938 fs->orig_chan_name = ast_strdup(chan->name); 00939 if (ast_applystream(chan, fs)) 00940 return -1; 00941 if (vfs && ast_applystream(chan, vfs)) 00942 return -1; 00943 res = ast_playstream(fs); 00944 if (!res && vfs) 00945 res = ast_playstream(vfs); 00946 ast_verb(3, "<%s> Playing '%s.%s' (language '%s')\n", chan->name, filename, ast_getformatname(chan->writeformat), preflang ? preflang : "default"); 00947 00948 return res; 00949 } 00950 ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname_multiple(fmt, sizeof(fmt), chan->nativeformats), strerror(errno)); 00951 return -1; 00952 }
off_t ast_tellstream | ( | struct ast_filestream * | fs | ) |
Tell where we are in a stream.
fs | fs to act on |
Definition at line 855 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().
int ast_truncstream | ( | struct ast_filestream * | fs | ) |
Trunc stream at current location.
fs | filestream to act on |
0 | on success. | |
-1 | on failure. |
Definition at line 850 of file file.c.
References ast_filestream::fmt, and ast_format::trunc.
Referenced by __ast_play_and_record(), and handle_recordfile().
int ast_waitstream | ( | struct ast_channel * | c, | |
const char * | breakon | |||
) |
Waits for a stream to stop or digit to be pressed.
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, |
0 | if the stream finishes | |
the | character if it was interrupted, | |
-1 | on error |
Definition at line 1272 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_ge(), ast_say_date_gr(), ast_say_date_he(), ast_say_date_hu(), 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_ge(), ast_say_datetime_from_now_he(), ast_say_datetime_gr(), ast_say_datetime_he(), ast_say_datetime_nl(), ast_say_datetime_pt(), ast_say_datetime_th(), ast_say_datetime_tw(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cz(), 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_ge(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), 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_tw(), ast_say_time_de(), ast_say_time_en(), ast_say_time_ge(), ast_say_time_gr(), ast_say_time_he(), ast_say_time_hu(), ast_say_time_nl(), ast_say_time_tw(), ast_stream_and_wait(), 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(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_greeting(), play_record_review(), playback_exec(), privacy_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), saydigits(), sayfile(), saynum(), select_item_menu(), send_morse(), send_tone_telemetry(), setup_privacy_args(), ss_thread(), vm_authenticate(), and wait_file().
01273 { 01274 return waitstream_core(c, breakon, NULL, NULL, 0, -1, -1, NULL); 01275 }
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.
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, |
0 | if the stream finishes. | |
the | character if it was interrupted. | |
-1 | on error. |
Definition at line 1283 of file file.c.
References ast_channel::context, and waitstream_core().
Referenced by pbx_builtin_background().
01284 { 01285 /* Waitstream, with return in the case of a valid 1 digit extension */ 01286 /* in the current or specified context being pressed */ 01287 01288 if (!context) 01289 context = c->context; 01290 return waitstream_core(c, NULL, NULL, NULL, 0, 01291 -1, -1, context); 01292 }
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.
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, |
0 | if the stream finishes. | |
the | character if it was interrupted. | |
-1 | on error. |
Definition at line 1266 of file file.c.
References waitstream_core().
Referenced by ast_control_streamfile().
01267 { 01268 return waitstream_core(c, breakon, forward, rewind, ms, 01269 -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */); 01270 }
int ast_waitstream_full | ( | struct ast_channel * | c, | |
const char * | breakon, | |||
int | audiofd, | |||
int | monfd | |||
) |
Same as waitstream, but with audio output to fd and monitored fd checking.
Definition at line 1277 of file file.c.
References waitstream_core().
Referenced by ast_readstring_full(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cz(), 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_ge(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), 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_tw(), handle_getoption(), handle_streamfile(), pl_odtworz_plik(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), and say_phonetic_str_full().
01278 { 01279 return waitstream_core(c, breakon, NULL, NULL, 0, 01280 audiofd, cmdfd, NULL /* no context */); 01281 }
struct ast_filestream* ast_writefile | ( | const char * | filename, | |
const char * | type, | |||
const char * | comment, | |||
int | flags, | |||
int | check, | |||
mode_t | mode | |||
) |
Starts writing a file.
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. |
a | struct ast_filestream on success. | |
NULL | on failure. |
Definition at line 1002 of file file.c.
References ast_closestream(), ast_free, ast_log(), 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(), 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, and ast_filestream::vfs.
Referenced by __ast_play_and_record(), ast_monitor_start(), ast_writestream(), dictate_exec(), handle_cli_file_convert(), handle_recordfile(), mixmonitor_thread(), and recordthread().
01003 { 01004 int fd, myflags = 0; 01005 /* compiler claims this variable can be used before initialization... */ 01006 FILE *bfile = NULL; 01007 struct ast_format *f; 01008 struct ast_filestream *fs = NULL; 01009 char *buf = NULL; 01010 size_t size = 0; 01011 int format_found = 0; 01012 01013 AST_RWLIST_RDLOCK(&formats); 01014 01015 /* set the O_TRUNC flag if and only if there is no O_APPEND specified */ 01016 /* We really can't use O_APPEND as it will break WAV header updates */ 01017 if (flags & O_APPEND) { 01018 flags &= ~O_APPEND; 01019 } else { 01020 myflags = O_TRUNC; 01021 } 01022 01023 myflags |= O_WRONLY | O_CREAT; 01024 01025 /* XXX need to fix this - we should just do the fopen, 01026 * not open followed by fdopen() 01027 */ 01028 AST_RWLIST_TRAVERSE(&formats, f, list) { 01029 char *fn, *orig_fn = NULL; 01030 if (fs) 01031 break; 01032 01033 if (!exts_compare(f->exts, type)) 01034 continue; 01035 else 01036 format_found = 1; 01037 01038 fn = build_filename(filename, type); 01039 fd = open(fn, flags | myflags, mode); 01040 if (fd > -1) { 01041 /* fdopen() the resulting file stream */ 01042 bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w"); 01043 if (!bfile) { 01044 ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno)); 01045 close(fd); 01046 fd = -1; 01047 } 01048 } 01049 01050 if (ast_opt_cache_record_files && (fd > -1)) { 01051 char *c; 01052 01053 fclose(bfile); /* this also closes fd */ 01054 /* 01055 We touch orig_fn just as a place-holder so other things (like vmail) see the file is there. 01056 What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place. 01057 */ 01058 orig_fn = ast_strdupa(fn); 01059 for (c = fn; *c; c++) 01060 if (*c == '/') 01061 *c = '_'; 01062 01063 size = strlen(fn) + strlen(record_cache_dir) + 2; 01064 buf = alloca(size); 01065 strcpy(buf, record_cache_dir); 01066 strcat(buf, "/"); 01067 strcat(buf, fn); 01068 ast_free(fn); 01069 fn = buf; 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 (fd > -1) { 01082 errno = 0; 01083 fs = get_filestream(f, bfile); 01084 if (!fs || rewrite_wrapper(fs, comment)) { 01085 ast_log(LOG_WARNING, "Unable to rewrite %s\n", fn); 01086 close(fd); 01087 if (orig_fn) { 01088 unlink(fn); 01089 unlink(orig_fn); 01090 } 01091 if (fs) { 01092 ast_closestream(fs); 01093 fs = NULL; 01094 } 01095 continue; 01096 } 01097 fs->trans = NULL; 01098 fs->fmt = f; 01099 fs->flags = flags; 01100 fs->mode = mode; 01101 if (orig_fn) { 01102 fs->realfilename = ast_strdup(orig_fn); 01103 fs->filename = ast_strdup(fn); 01104 } else { 01105 fs->realfilename = NULL; 01106 fs->filename = ast_strdup(filename); 01107 } 01108 fs->vfs = NULL; 01109 /* If truncated, we'll be at the beginning; if not truncated, then append */ 01110 f->seek(fs, 0, SEEK_END); 01111 } else if (errno != EEXIST) { 01112 ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno)); 01113 if (orig_fn) 01114 unlink(orig_fn); 01115 } 01116 /* if buf != NULL then fn is already free and pointing to it */ 01117 if (!buf) 01118 ast_free(fn); 01119 } 01120 01121 AST_RWLIST_UNLOCK(&formats); 01122 01123 if (!format_found) 01124 ast_log(LOG_WARNING, "No such format '%s'\n", type); 01125 01126 return fs; 01127 }
int ast_writestream | ( | struct ast_filestream * | fs, | |
struct ast_frame * | f | |||
) |
Writes a frame to a stream.
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 |
0 | on success. | |
-1 | on failure. |
Definition at line 143 of file file.c.
References ast_debug, AST_FORMAT_AUDIO_MASK, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_frfree, ast_getformatname(), AST_LIST_NEXT, ast_log(), ast_translate(), ast_translator_build_path(), ast_translator_free_path(), ast_writefile(), ast_writestream(), f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, ast_format::format, ast_frame::frame_list, ast_filestream::lastwriteformat, LOG_WARNING, ast_filestream::mode, ast_format::name, ast_filestream::trans, type, ast_filestream::vfs, and ast_format::write.
Referenced by __ast_play_and_record(), __ast_read(), ast_write(), ast_writestream(), dictate_exec(), handle_cli_file_convert(), handle_recordfile(), mixmonitor_thread(), and recordthread().
00144 { 00145 int res = -1; 00146 int alt = 0; 00147 if (f->frametype == AST_FRAME_VIDEO) { 00148 if (fs->fmt->format & AST_FORMAT_AUDIO_MASK) { 00149 /* This is the audio portion. Call the video one... */ 00150 if (!fs->vfs && fs->filename) { 00151 const char *type = ast_getformatname(f->subclass & ~0x1); 00152 fs->vfs = ast_writefile(fs->filename, type, NULL, fs->flags, 0, fs->mode); 00153 ast_debug(1, "Opened video output file\n"); 00154 } 00155 if (fs->vfs) 00156 return ast_writestream(fs->vfs, f); 00157 /* else ignore */ 00158 return 0; 00159 } else { 00160 /* Might / might not have mark set */ 00161 alt = 1; 00162 } 00163 } else if (f->frametype != AST_FRAME_VOICE) { 00164 ast_log(LOG_WARNING, "Tried to write non-voice frame\n"); 00165 return -1; 00166 } 00167 if (((fs->fmt->format | alt) & f->subclass) == f->subclass) { 00168 res = fs->fmt->write(fs, f); 00169 if (res < 0) 00170 ast_log(LOG_WARNING, "Natural write failed\n"); 00171 else if (res > 0) 00172 ast_log(LOG_WARNING, "Huh??\n"); 00173 } else { 00174 /* XXX If they try to send us a type of frame that isn't the normal frame, and isn't 00175 the one we've setup a translator for, we do the "wrong thing" XXX */ 00176 if (fs->trans && f->subclass != fs->lastwriteformat) { 00177 ast_translator_free_path(fs->trans); 00178 fs->trans = NULL; 00179 } 00180 if (!fs->trans) 00181 fs->trans = ast_translator_build_path(fs->fmt->format, f->subclass); 00182 if (!fs->trans) 00183 ast_log(LOG_WARNING, "Unable to translate to format %s, source format %s\n", 00184 fs->fmt->name, ast_getformatname(f->subclass)); 00185 else { 00186 struct ast_frame *trf; 00187 fs->lastwriteformat = f->subclass; 00188 /* Get the translated frame but don't consume the original in case they're using it on another stream */ 00189 if ((trf = ast_translate(fs->trans, f, 0))) { 00190 struct ast_frame *cur; 00191 00192 /* the translator may have returned multiple frames, so process them */ 00193 for (cur = trf; cur; cur = AST_LIST_NEXT(cur, frame_list)) { 00194 if ((res = fs->fmt->write(fs, trf))) { 00195 ast_log(LOG_WARNING, "Translated frame write failed\n"); 00196 break; 00197 } 00198 } 00199 ast_frfree(trf); 00200 } else { 00201 res = 0; 00202 } 00203 } 00204 } 00205 return res; 00206 }