Generic File Format Support. Should be included by clients of the file handling routines. File service providers should instead include mod_format.h. More...
#include <fcntl.h>#include <sys/mman.h>
Go to the source code of this file.
Defines | |
| #define | AST_DIGIT_ANY "0123456789#*ABCD" |
| #define | AST_DIGIT_ANYNUM "0123456789" |
| #define | AST_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. | |
| void | ast_filestream_frame_freed (struct ast_frame *fr) |
| destroy a filestream using an ast_frame as input | |
| struct ast_filestream * | ast_openstream (struct ast_channel *chan, const char *filename, const char *preflang) |
| Opens stream for use in seeking, playing. | |
| 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. | |
| struct 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. | |
| 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. | |
| struct 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) |
| 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. | |
| int | ast_writestream (struct ast_filestream *fs, struct ast_frame *f) |
| Writes a frame to a stream. | |
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 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(), sayname(), sayunixtime_exec(), select_item_menu(), select_item_seq(), try_calling(), vm_intro_gr(), vm_intro_he(), vm_intro_multilang(), vm_intro_pt(), vm_intro_pt_BR(), and wait_file2().
| #define AST_DIGIT_ANYNUM "0123456789" |
Definition at line 45 of file file.h.
Referenced by initreqprep().
| #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.
References ast_filestream::owner.
Referenced by ast_streamfile(), handle_getoption(), handle_recordfile(), handle_streamfile(), and speech_streamfile().
00828 { 00829 s->owner = chan; 00830 return 0; 00831 }
| 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 ast_filestream::fr.
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().
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_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 1385 of file file.c.
References ast_cli_register_multiple().
Referenced by main().
01386 { 01387 ast_cli_register_multiple(cli_file, sizeof(cli_file) / sizeof(struct ast_cli_entry)); 01388 return 0; 01389 }
| 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 ACTION_COPY, and 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_record_review(), record_exec(), 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(), 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().
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(), leave_voicemail(), 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 1317 of file file.c.
References ao2_ref, ast_clear_flag, and AST_FRFLAG_FROM_FILESTREAM.
Referenced by __frame_free().
01318 { 01319 struct ast_filestream *fs; 01320 01321 ast_clear_flag(fr, AST_FRFLAG_FROM_FILESTREAM); 01322 01323 fs = (struct ast_filestream *) (((char *) fr) - offsetof(struct ast_filestream, fr)); 01324 01325 ao2_ref(fs, -1); 01326 }
| struct ast_filestream* ast_openstream | ( | struct ast_channel * | chan, | |
| const char * | filename, | |||
| const char * | preflang | |||
| ) | [read] |
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 619 of file file.c.
References ast_openstream_full().
Referenced by ast_streamfile(), dictate_exec(), handle_getoption(), handle_streamfile(), and speech_streamfile().
00620 { 00621 return ast_openstream_full(chan, filename, preflang, 0); 00622 }
| struct ast_filestream* ast_openstream_full | ( | struct ast_channel * | chan, | |
| const char * | filename, | |||
| const char * | preflang, | |||
| int | asis | |||
| ) | [read] |
Opens stream for use in seeking, playing.
| 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 624 of file file.c.
References ACTION_OPEN, ast_deactivate_generator(), ast_filehelper(), AST_FORMAT_AUDIO_MASK, ast_log(), ast_set_write_format(), ast_stopstream(), buf, fileexists_core(), ast_channel::generator, LOG_WARNING, ast_channel::oldwriteformat, ast_channel::stream, and ast_channel::writeformat.
Referenced by ast_moh_files_next(), ast_openstream(), and gen_nextfile().
00625 { 00626 /* 00627 * Use fileexists_core() to find a file in a compatible 00628 * language and format, set up a suitable translator, 00629 * and open the stream. 00630 */ 00631 int fmts, res, buflen; 00632 char *buf; 00633 00634 if (!asis) { 00635 /* do this first, otherwise we detect the wrong writeformat */ 00636 ast_stopstream(chan); 00637 if (chan->generator) 00638 ast_deactivate_generator(chan); 00639 } 00640 if (preflang == NULL) 00641 preflang = ""; 00642 buflen = strlen(preflang) + strlen(filename) + 4; 00643 buf = alloca(buflen); 00644 if (buf == NULL) 00645 return NULL; 00646 fmts = fileexists_core(filename, NULL, preflang, buf, buflen); 00647 if (fmts > 0) 00648 fmts &= AST_FORMAT_AUDIO_MASK; 00649 if (fmts < 1) { 00650 ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename); 00651 return NULL; 00652 } 00653 chan->oldwriteformat = chan->writeformat; 00654 /* Set the channel to a format we can work with */ 00655 res = ast_set_write_format(chan, fmts); 00656 res = ast_filehelper(buf, chan, NULL, ACTION_OPEN); 00657 if (res >= 0) 00658 return chan->stream; 00659 return NULL; 00660 }
| struct ast_filestream* ast_openvstream | ( | struct ast_channel * | chan, | |
| const char * | filename, | |||
| const char * | preflang | |||
| ) | [read] |
Opens stream for use in seeking, playing.
| 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 662 of file file.c.
References ACTION_OPEN, ast_filehelper(), AST_FORMAT_AUDIO_MASK, AST_FORMAT_VIDEO_MASK, ast_getformatname(), ast_log(), buf, fileexists_core(), ast_filestream::fmt, format, LOG_WARNING, ast_channel::nativeformats, and ast_channel::vstream.
Referenced by ast_streamfile(), handle_getoption(), and handle_streamfile().
00663 { 00664 /* As above, but for video. But here we don't have translators 00665 * so we must enforce a format. 00666 */ 00667 unsigned int format; 00668 char *buf; 00669 int buflen; 00670 00671 if (preflang == NULL) 00672 preflang = ""; 00673 buflen = strlen(preflang) + strlen(filename) + 4; 00674 buf = alloca(buflen); 00675 if (buf == NULL) 00676 return NULL; 00677 00678 for (format = AST_FORMAT_AUDIO_MASK + 1; format <= AST_FORMAT_VIDEO_MASK; format = format << 1) { 00679 int fd; 00680 const char *fmt; 00681 00682 if (!(chan->nativeformats & format)) 00683 continue; 00684 fmt = ast_getformatname(format); 00685 if ( fileexists_core(filename, fmt, preflang, buf, buflen) < 1) /* no valid format */ 00686 continue; 00687 fd = ast_filehelper(buf, chan, fmt, ACTION_OPEN); 00688 if (fd >= 0) 00689 return chan->vstream; 00690 ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename); 00691 } 00692 return NULL; 00693 }
| int ast_playstream | ( | struct ast_filestream * | s | ) |
Play a open stream on a channel.
| 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(), ast_filestream::fmt, ast_format::format, and FSREAD_FAILURE.
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 | |||
| ) | [read] |
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 965 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().
00966 { 00967 FILE *bfile; 00968 struct ast_format *f; 00969 struct ast_filestream *fs = NULL; 00970 char *fn; 00971 int format_found = 0; 00972 00973 AST_RWLIST_RDLOCK(&formats); 00974 00975 AST_RWLIST_TRAVERSE(&formats, f, list) { 00976 fs = NULL; 00977 if (!exts_compare(f->exts, type)) 00978 continue; 00979 else 00980 format_found = 1; 00981 00982 fn = build_filename(filename, type); 00983 errno = 0; 00984 bfile = fopen(fn, "r"); 00985 00986 if (!bfile || (fs = get_filestream(f, bfile)) == NULL || open_wrapper(fs) ) { 00987 ast_log(LOG_WARNING, "Unable to open %s\n", fn); 00988 if (fs) { 00989 ast_closestream(fs); 00990 } 00991 fs = NULL; 00992 bfile = NULL; 00993 ast_free(fn); 00994 break; 00995 } 00996 /* found it */ 00997 fs->trans = NULL; 00998 fs->fmt = f; 00999 fs->flags = flags; 01000 fs->mode = mode; 01001 fs->filename = ast_strdup(filename); 01002 fs->vfs = NULL; 01003 break; 01004 } 01005 01006 AST_RWLIST_UNLOCK(&formats); 01007 if (!format_found) 01008 ast_log(LOG_WARNING, "No such format '%s'\n", type); 01009 01010 return fs; 01011 }
| struct ast_frame* ast_readframe | ( | struct ast_filestream * | s | ) | [read] |
Read a frame from a filestream.
| s | ast_filestream to act on |
| NULL | if read failed. |
Definition at line 695 of file file.c.
References ao2_ref, AST_FRFLAG_FROM_FILESTREAM, ast_set_flag, f, ast_filestream::fmt, and ast_format::read.
Referenced by __ast_play_and_record(), dictate_exec(), gen_readframe(), handle_cli_file_convert(), and moh_files_readframe().
00696 { 00697 struct ast_frame *f = NULL; 00698 int whennext = 0; 00699 if (s && s->fmt) 00700 f = s->fmt->read(s, &whennext); 00701 if (f) { 00702 ast_set_flag(f, AST_FRFLAG_FROM_FILESTREAM); 00703 ao2_ref(s, +1); 00704 } 00705 return f; 00706 }
| 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_moh_files_next(), ast_stream_fastforward(), ast_stream_rewind(), ast_streamfile(), 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 |
Stop playback of a stream
| 0 | always |
Definition at line 122 of file file.c.
References ast_channel_lock, ast_channel_unlock, ast_closestream(), ast_log(), ast_set_write_format(), LOG_WARNING, ast_channel::oldwriteformat, ast_channel::stream, and ast_channel::vstream.
Referenced by _ast_adsi_transmit_message_full(), ast_control_streamfile(), ast_openstream_full(), ast_play_and_wait(), ast_readstring_full(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cs(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_en(), ast_say_number_full_en_GB(), ast_say_number_full_es(), ast_say_number_full_fr(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), ast_say_number_full_ka(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_th(), ast_say_number_full_zh(), background_detect_exec(), builtin_blindtransfer(), conf_exec(), conf_run(), directory_exec(), handle_getoption(), handle_speechrecognize(), handle_streamfile(), ices_exec(), ivr_dispatch(), leave_voicemail(), minivm_greet_exec(), mp3_exec(), NBScat_exec(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_file(), play_mailbox_owner(), playback_exec(), queue_exec(), read_exec(), readexten_exec(), record_exec(), recordthread(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), sayfile(), saynum(), select_item_seq(), send_morse(), send_tone_telemetry(), send_waveform_to_channel(), speech_background(), vm_authenticate(), vm_execmain(), wait_for_winner(), waitstream_core(), and zapateller_exec().
00123 { 00124 ast_channel_lock(tmp); 00125 00126 /* Stop a running stream if there is one */ 00127 if (tmp->stream) { 00128 ast_closestream(tmp->stream); 00129 tmp->stream = NULL; 00130 if (tmp->oldwriteformat && ast_set_write_format(tmp, tmp->oldwriteformat)) 00131 ast_log(LOG_WARNING, "Unable to restore format back to %d\n", tmp->oldwriteformat); 00132 } 00133 /* Stop the video stream too */ 00134 if (tmp->vstream != NULL) { 00135 ast_closestream(tmp->vstream); 00136 tmp->vstream = NULL; 00137 } 00138 00139 ast_channel_unlock(tmp); 00140 00141 return 0; 00142 }
| int ast_stream_and_wait | ( | struct ast_channel * | chan, | |
| const char * | file, | |||
| const char * | digits | |||
| ) |
stream file until digit If the file name is non-empty, try to play it.
| -1 | if error. | |
| digit | if interrupted by a digit. |
Definition at line 1333 of file file.c.
References ast_streamfile(), ast_strlen_zero(), and ast_waitstream().
Referenced by __ast_play_and_record(), app_exec(), ast_record_review(), bridge_playfile(), builtin_atxfer(), builtin_automixmonitor(), builtin_blindtransfer(), directory_exec(), forward_message(), invent_message(), ivr_dispatch(), leave_voicemail(), masq_park_call(), park_exec_full(), play_mailbox_owner(), play_message_callerid(), play_message_in_bridged_call(), play_record_review(), sayname(), select_item_seq(), and wait_file2().
01334 { 01335 int res = 0; 01336 if (!ast_strlen_zero(file)) { 01337 res = ast_streamfile(chan, file, chan->language); 01338 if (!res) { 01339 res = ast_waitstream(chan, digits); 01340 } 01341 } 01342 return res; 01343 }
| 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(), record_exec(), 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_seekstream(), ast_strdup, ast_test_flag, ast_verb, errno, ast_filestream::f, ast_filestream::fmt, ast_format::format, LOG_WARNING, ast_channel::nativeformats, ast_filestream::orig_chan_name, ast_filestream::vfs, and ast_channel::writeformat.
Referenced by action_bridge(), agent_call(), announce_thread(), app_exec(), ast_app_getdata(), ast_app_getdata_full(), ast_control_streamfile(), ast_play_and_wait(), ast_say_date_da(), ast_say_date_de(), ast_say_date_en(), ast_say_date_fr(), ast_say_date_gr(), ast_say_date_he(), ast_say_date_hu(), ast_say_date_ka(), ast_say_date_nl(), ast_say_date_th(), ast_say_date_with_format_gr(), ast_say_datetime_en(), ast_say_datetime_fr(), ast_say_datetime_from_now_en(), ast_say_datetime_from_now_fr(), ast_say_datetime_from_now_he(), ast_say_datetime_from_now_ka(), ast_say_datetime_gr(), ast_say_datetime_he(), ast_say_datetime_nl(), ast_say_datetime_pt(), ast_say_datetime_th(), ast_say_datetime_zh(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cs(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_en(), ast_say_number_full_en_GB(), ast_say_number_full_es(), ast_say_number_full_fr(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), ast_say_number_full_ka(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_th(), ast_say_number_full_zh(), ast_say_time_de(), ast_say_time_en(), ast_say_time_fr(), ast_say_time_gr(), ast_say_time_hu(), ast_say_time_ka(), ast_say_time_nl(), ast_say_time_zh(), ast_stream_and_wait(), auth_exec(), background_detect_exec(), bridge_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_run(), dial_exec_full(), do_directory(), find_conf_realtime(), forward_message(), gr_say_number_female(), handle_recordfile(), invent_message(), leave_voicemail(), login_exec(), minivm_greet_exec(), page_exec(), park_exec_full(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_record_review(), playback_exec(), privacy_exec(), readexten_exec(), record_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), sayfile(), select_item_menu(), setup_privacy_args(), ss_thread(), vm_authenticate(), wait_file(), and wait_for_winner().
00924 { 00925 struct ast_filestream *fs; 00926 struct ast_filestream *vfs=NULL; 00927 char fmt[256]; 00928 int seekattempt; 00929 int res; 00930 00931 fs = ast_openstream(chan, filename, preflang); 00932 if (!fs) { 00933 ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname_multiple(fmt, sizeof(fmt), chan->nativeformats), strerror(errno)); 00934 return -1; 00935 } 00936 00937 /* check to see if there is any data present (not a zero length file), 00938 * done this way because there is no where for ast_openstream_full to 00939 * return the file had no data. */ 00940 seekattempt = fseek(fs->f, -1, SEEK_END); 00941 if (!seekattempt) 00942 ast_seekstream(fs, 0, SEEK_SET); 00943 else 00944 return 0; 00945 00946 vfs = ast_openvstream(chan, filename, preflang); 00947 if (vfs) { 00948 ast_debug(1, "Ooh, found a video stream, too, format %s\n", ast_getformatname(vfs->fmt->format)); 00949 } 00950 00951 if (ast_test_flag(chan, AST_FLAG_MASQ_NOSTREAM)) 00952 fs->orig_chan_name = ast_strdup(chan->name); 00953 if (ast_applystream(chan, fs)) 00954 return -1; 00955 if (vfs && ast_applystream(chan, vfs)) 00956 return -1; 00957 res = ast_playstream(fs); 00958 if (!res && vfs) 00959 res = ast_playstream(vfs); 00960 ast_verb(3, "<%s> Playing '%s.%s' (language '%s')\n", chan->name, filename, ast_getformatname(chan->writeformat), preflang ? preflang : "default"); 00961 00962 return res; 00963 }
| 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(), handle_recordfile(), and record_exec().
| 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 1295 of file file.c.
References waitstream_core().
Referenced by action_bridge(), agent_call(), announce_thread(), app_exec(), ast_play_and_wait(), ast_say_date_da(), ast_say_date_de(), ast_say_date_en(), ast_say_date_fr(), ast_say_date_gr(), ast_say_date_he(), ast_say_date_hu(), ast_say_date_ka(), ast_say_date_nl(), ast_say_date_th(), ast_say_date_with_format_gr(), ast_say_datetime_en(), ast_say_datetime_fr(), ast_say_datetime_from_now_en(), ast_say_datetime_from_now_fr(), ast_say_datetime_from_now_he(), ast_say_datetime_from_now_ka(), ast_say_datetime_gr(), ast_say_datetime_he(), ast_say_datetime_nl(), ast_say_datetime_pt(), ast_say_datetime_th(), ast_say_datetime_zh(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_number_full_cs(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_en(), ast_say_number_full_en_GB(), ast_say_number_full_es(), ast_say_number_full_fr(), ast_say_number_full_gr(), ast_say_number_full_he(), ast_say_number_full_hu(), ast_say_number_full_it(), ast_say_number_full_ka(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_th(), ast_say_number_full_zh(), ast_say_time_de(), ast_say_time_en(), ast_say_time_gr(), ast_say_time_he(), ast_say_time_hu(), ast_say_time_ka(), ast_say_time_nl(), ast_say_time_zh(), ast_stream_and_wait(), auth_exec(), bridge_exec(), check_availability(), check_beep(), common_exec(), conf_exec(), conf_run(), dial_exec_full(), directory_exec(), find_conf_realtime(), gr_say_number_female(), handle_recordfile(), invent_message(), leave_voicemail(), login_exec(), minivm_greet_exec(), page_exec(), park_exec_full(), parkandannounce_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_record_review(), playback_exec(), privacy_exec(), record_exec(), retrydial_exec(), rpt_tele_thread(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), say_phonetic_str_full(), saycharstr(), sayfile(), saynum(), select_item_menu(), send_morse(), send_tone_telemetry(), setup_privacy_args(), ss_thread(), vm_authenticate(), and wait_file().
01296 { 01297 return waitstream_core(c, breakon, NULL, NULL, 0, -1, -1, NULL); 01298 }
| 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 1306 of file file.c.
References ast_channel::context, and waitstream_core().
Referenced by pbx_builtin_background().
01307 { 01308 /* Waitstream, with return in the case of a valid 1 digit extension */ 01309 /* in the current or specified context being pressed */ 01310 01311 if (!context) 01312 context = c->context; 01313 return waitstream_core(c, NULL, NULL, NULL, 0, 01314 -1, -1, context); 01315 }
| 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 1289 of file file.c.
References waitstream_core().
Referenced by ast_control_streamfile().
01290 { 01291 return waitstream_core(c, breakon, forward, reverse, ms, 01292 -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */); 01293 }
| 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 1300 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_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(), handle_getoption(), handle_streamfile(), pl_odtworz_plik(), s_streamwait3(), say_character_str_full(), say_digit_str_full(), and say_phonetic_str_full().
01301 { 01302 return waitstream_core(c, breakon, NULL, NULL, 0, 01303 audiofd, cmdfd, NULL /* no context */); 01304 }
| 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.
| 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 1013 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().
01014 { 01015 int fd, myflags = 0; 01016 /* compiler claims this variable can be used before initialization... */ 01017 FILE *bfile = NULL; 01018 struct ast_format *f; 01019 struct ast_filestream *fs = NULL; 01020 char *buf = NULL; 01021 size_t size = 0; 01022 int format_found = 0; 01023 01024 AST_RWLIST_RDLOCK(&formats); 01025 01026 /* set the O_TRUNC flag if and only if there is no O_APPEND specified */ 01027 /* We really can't use O_APPEND as it will break WAV header updates */ 01028 if (flags & O_APPEND) { 01029 flags &= ~O_APPEND; 01030 } else { 01031 myflags = O_TRUNC; 01032 } 01033 01034 myflags |= O_WRONLY | O_CREAT; 01035 01036 /* XXX need to fix this - we should just do the fopen, 01037 * not open followed by fdopen() 01038 */ 01039 AST_RWLIST_TRAVERSE(&formats, f, list) { 01040 char *fn, *orig_fn = NULL; 01041 if (fs) 01042 break; 01043 01044 if (!exts_compare(f->exts, type)) 01045 continue; 01046 else 01047 format_found = 1; 01048 01049 fn = build_filename(filename, type); 01050 fd = open(fn, flags | myflags, mode); 01051 if (fd > -1) { 01052 /* fdopen() the resulting file stream */ 01053 bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w"); 01054 if (!bfile) { 01055 ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno)); 01056 close(fd); 01057 fd = -1; 01058 } 01059 } 01060 01061 if (ast_opt_cache_record_files && (fd > -1)) { 01062 char *c; 01063 01064 fclose(bfile); /* this also closes fd */ 01065 /* 01066 We touch orig_fn just as a place-holder so other things (like vmail) see the file is there. 01067 What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place. 01068 */ 01069 orig_fn = ast_strdupa(fn); 01070 for (c = fn; *c; c++) 01071 if (*c == '/') 01072 *c = '_'; 01073 01074 size = strlen(fn) + strlen(record_cache_dir) + 2; 01075 buf = alloca(size); 01076 strcpy(buf, record_cache_dir); 01077 strcat(buf, "/"); 01078 strcat(buf, fn); 01079 ast_free(fn); 01080 fn = buf; 01081 fd = open(fn, flags | myflags, mode); 01082 if (fd > -1) { 01083 /* fdopen() the resulting file stream */ 01084 bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w"); 01085 if (!bfile) { 01086 ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno)); 01087 close(fd); 01088 fd = -1; 01089 } 01090 } 01091 } 01092 if (fd > -1) { 01093 errno = 0; 01094 fs = get_filestream(f, bfile); 01095 if (!fs || rewrite_wrapper(fs, comment)) { 01096 ast_log(LOG_WARNING, "Unable to rewrite %s\n", fn); 01097 close(fd); 01098 if (orig_fn) { 01099 unlink(fn); 01100 unlink(orig_fn); 01101 } 01102 if (fs) { 01103 ast_closestream(fs); 01104 fs = NULL; 01105 } 01106 continue; 01107 } 01108 fs->trans = NULL; 01109 fs->fmt = f; 01110 fs->flags = flags; 01111 fs->mode = mode; 01112 if (orig_fn) { 01113 fs->realfilename = ast_strdup(orig_fn); 01114 fs->filename = ast_strdup(fn); 01115 } else { 01116 fs->realfilename = NULL; 01117 fs->filename = ast_strdup(filename); 01118 } 01119 fs->vfs = NULL; 01120 /* If truncated, we'll be at the beginning; if not truncated, then append */ 01121 01122 if ((fs->write_buffer = ast_malloc(32768))){ 01123 setvbuf(fs->f, fs->write_buffer, _IOFBF, 32768); 01124 } 01125 01126 f->seek(fs, 0, SEEK_END); 01127 } else if (errno != EEXIST) { 01128 ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno)); 01129 if (orig_fn) 01130 unlink(orig_fn); 01131 } 01132 /* if buf != NULL then fn is already free and pointing to it */ 01133 if (!buf) 01134 ast_free(fn); 01135 } 01136 01137 AST_RWLIST_UNLOCK(&formats); 01138 01139 if (!format_found) 01140 ast_log(LOG_WARNING, "No such format '%s'\n", type); 01141 01142 return fs; 01143 }
| 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 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().
00145 { 00146 int res = -1; 00147 int alt = 0; 00148 if (f->frametype == AST_FRAME_VIDEO) { 00149 if (fs->fmt->format & AST_FORMAT_AUDIO_MASK) { 00150 /* This is the audio portion. Call the video one... */ 00151 if (!fs->vfs && fs->filename) { 00152 const char *type = ast_getformatname(f->subclass & ~0x1); 00153 fs->vfs = ast_writefile(fs->filename, type, NULL, fs->flags, 0, fs->mode); 00154 ast_debug(1, "Opened video output file\n"); 00155 } 00156 if (fs->vfs) 00157 return ast_writestream(fs->vfs, f); 00158 /* else ignore */ 00159 return 0; 00160 } else { 00161 /* Might / might not have mark set */ 00162 alt = 1; 00163 } 00164 } else if (f->frametype != AST_FRAME_VOICE) { 00165 ast_log(LOG_WARNING, "Tried to write non-voice frame\n"); 00166 return -1; 00167 } 00168 if (((fs->fmt->format | alt) & f->subclass) == f->subclass) { 00169 res = fs->fmt->write(fs, f); 00170 if (res < 0) 00171 ast_log(LOG_WARNING, "Natural write failed\n"); 00172 else if (res > 0) 00173 ast_log(LOG_WARNING, "Huh??\n"); 00174 } else { 00175 /* XXX If they try to send us a type of frame that isn't the normal frame, and isn't 00176 the one we've setup a translator for, we do the "wrong thing" XXX */ 00177 if (fs->trans && f->subclass != fs->lastwriteformat) { 00178 ast_translator_free_path(fs->trans); 00179 fs->trans = NULL; 00180 } 00181 if (!fs->trans) 00182 fs->trans = ast_translator_build_path(fs->fmt->format, f->subclass); 00183 if (!fs->trans) 00184 ast_log(LOG_WARNING, "Unable to translate to format %s, source format %s\n", 00185 fs->fmt->name, ast_getformatname(f->subclass)); 00186 else { 00187 struct ast_frame *trf; 00188 fs->lastwriteformat = f->subclass; 00189 /* Get the translated frame but don't consume the original in case they're using it on another stream */ 00190 if ((trf = ast_translate(fs->trans, f, 0))) { 00191 struct ast_frame *cur; 00192 00193 /* the translator may have returned multiple frames, so process them */ 00194 for (cur = trf; cur; cur = AST_LIST_NEXT(cur, frame_list)) { 00195 if ((res = fs->fmt->write(fs, trf))) { 00196 ast_log(LOG_WARNING, "Translated frame write failed\n"); 00197 break; 00198 } 00199 } 00200 ast_frfree(trf); 00201 } else { 00202 res = 0; 00203 } 00204 } 00205 } 00206 return res; 00207 }
1.6.1