Asterisk - The Open Source Telephony Project GIT-master-57e2743
Loading...
Searching...
No Matches
Macros | Typedefs | Enumerations | 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...

Go to the source code of this file.

Macros

#define AST_DIGIT_ANY   "0123456789#*ABCD"
 
#define AST_DIGIT_ANYNUM   "0123456789"
 
#define AST_DIGIT_NONE   ""
 
#define ast_file_read_dir(dir_name, on_file, obj)   ast_file_read_dirs(dir_name, on_file, obj, 1)
 Iterate over each file in a given directory.
 
#define AST_MAX_FORMATS   10
 
#define AST_RESERVED_POINTERS   20
 
#define SEEK_FORCECUR   10
 

Typedefs

typedef int(* ast_file_on_file) (const char *dir_name, const char *filename, void *obj)
 Callback called for each file found when reading directories.
 
typedef void() ast_waitstream_fr_cb(struct ast_channel *chan, long ms, enum ast_waitstream_fr_cb_values val)
 callback used during dtmf controlled file playback to indicate location of playback in a file after rewinding or fastforwarding a file.
 

Enumerations

enum  ast_waitstream_fr_cb_values { AST_WAITSTREAM_CB_REWIND = 1 , AST_WAITSTREAM_CB_FASTFORWARD , AST_WAITSTREAM_CB_START }
 

Functions

int ast_applystream (struct ast_channel *chan, struct ast_filestream *s)
 Applies a open stream to a channel.
 
int ast_closestream (struct ast_filestream *f)
 Closes a stream.
 
int ast_file_fdtemp (const char *path, char **filename, const char *template_name)
 Create a temporary file located at path.
 
int ast_file_init (void)
 
FILE * ast_file_mkftemp (char *template_name, mode_t mode)
 same as mkstemp, but return a FILE
 
int ast_file_read_dirs (const char *dir_name, ast_file_on_file on_file, void *obj, int max_depth)
 Recursively iterate through files and directories up to max_depth.
 
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)
 
int ast_get_extension_for_mime_type (const char *mime_type, char *buffer, size_t capacity)
 Get a suitable filename extension for the given MIME type.
 
struct ast_format * ast_get_format_for_file_ext (const char *file_ext)
 Get the ast_format associated with the given file extension.
 
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.
 
int ast_ratestream (struct ast_filestream *fs)
 Return the sample rate of the stream's format.
 
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_fr_w_cb (struct ast_channel *c, const char *breakon, const char *forward, const char *rewind, int ms, ast_waitstream_fr_cb cb)
 Same as waitstream_fr but allows a callback to be alerted when a user fastforwards or rewinds the file.
 
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.
 

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.

Macro Definition Documentation

◆ AST_DIGIT_ANY

#define AST_DIGIT_ANY   "0123456789#*ABCD"

Definition at line 48 of file file.h.

◆ AST_DIGIT_ANYNUM

#define AST_DIGIT_ANYNUM   "0123456789"

Definition at line 49 of file file.h.

◆ AST_DIGIT_NONE

#define AST_DIGIT_NONE   ""

Convenient for waiting

Definition at line 47 of file file.h.

◆ ast_file_read_dir

#define ast_file_read_dir (   dir_name,
  on_file,
  obj 
)    ast_file_read_dirs(dir_name, on_file, obj, 1)

Iterate over each file in a given directory.

Parameters
dir_namethe name of the directory to search
on_filecallback called on each file
objuser data object
Returns
-1
Return values
errnoon failure
0otherwise

Definition at line 203 of file file.h.

◆ AST_MAX_FORMATS

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

◆ AST_RESERVED_POINTERS

#define AST_RESERVED_POINTERS   20

Definition at line 441 of file file.h.

◆ SEEK_FORCECUR

#define SEEK_FORCECUR   10

Definition at line 51 of file file.h.

Typedef Documentation

◆ ast_file_on_file

typedef int(* ast_file_on_file) (const char *dir_name, const char *filename, void *obj)

Callback called for each file found when reading directories.

Parameters
dir_namethe name of the directory
filenamethe name of the file
objuser data object
Return values
non-zeroto stop reading, otherwise zero to continue
Note
dir_name is not processed by realpath or other functions, symbolic links are not resolved. This ensures dir_name always starts with the exact string originally passed to ast_file_read_dir or ast_file_read_dirs.

Definition at line 180 of file file.h.

◆ ast_waitstream_fr_cb

typedef void() ast_waitstream_fr_cb(struct ast_channel *chan, long ms, enum ast_waitstream_fr_cb_values val)

callback used during dtmf controlled file playback to indicate location of playback in a file after rewinding or fastforwarding a file.

Definition at line 65 of file file.h.

Enumeration Type Documentation

◆ ast_waitstream_fr_cb_values

The type of event associated with a ast_waitstream_fr_cb invocation

Enumerator
AST_WAITSTREAM_CB_REWIND 
AST_WAITSTREAM_CB_FASTFORWARD 
AST_WAITSTREAM_CB_START 

Definition at line 54 of file file.h.

54 {
58};
@ AST_WAITSTREAM_CB_FASTFORWARD
Definition file.h:56
@ AST_WAITSTREAM_CB_REWIND
Definition file.h:55
@ AST_WAITSTREAM_CB_START
Definition file.h:57

Function Documentation

◆ ast_applystream()

int ast_applystream ( struct ast_channel *  chan,
struct ast_filestream *  s 
)

Applies a open stream to a channel.

Parameters
chanchannel to work
sast_filestream to apply
Return values
0on success.
-1on failure.

Definition at line 1146 of file file.c.

1147{
1148 s->owner = chan;
1149 return 0;
1150}
struct ast_channel * owner
Definition mod_format.h:116

References ast_filestream::owner.

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

◆ ast_closestream()

int ast_closestream ( struct ast_filestream *  f)

Closes a stream.

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

Definition at line 1200 of file file.c.

1201{
1202 /* This used to destroy the filestream, but it now just decrements a refcount.
1203 * We close the stream in order to quit queuing frames now, because we might
1204 * change the writeformat, which could result in a subsequent write error, if
1205 * the format is different. */
1206 if (f == NULL) {
1207 return 0;
1208 }
1210 ao2_ref(f, -1);
1211 return 0;
1212}
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
static void filestream_close(struct ast_filestream *f)
Definition file.c:460
#define NULL
Definition resample.c:96

References ao2_ref, ast_filestream::f, filestream_close(), and NULL.

Referenced by __ast_play_and_record(), ast_hangup(), ast_readfile(), ast_stopstream(), ast_writefile(), dictate_exec(), filehelper(), filestream_destructor(), gen_closestream(), handle_cli_file_convert(), handle_recordfile(), local_ast_moh_stop(), mixmonitor_ds_close_fs(), moh_files_next(), moh_files_release(), msg_create_from_file(), record_exec(), and recordthread().

◆ ast_file_fdtemp()

int ast_file_fdtemp ( const char *  path,
char **  filename,
const char *  template_name 
)

Create a temporary file located at path.

Note
The directory containing path will be created if it does not exist
This function assumes path does not end with a '/'
Parameters
pathThe directory path to create the file in
filenameFunction allocates memory and stores full filename (including path) here
template_namemkstemp template to use. Must end with XXXXXX.
Note
filename will need to be freed with ast_free if this function succeeds
Return values
-1on failure
Returns
file descriptor on success

Definition at line 213 of file file.c.

214{
215 int fd;
216
217 if (ast_asprintf(filename, "%s/%s", path, template_name) < 0) {
218 ast_log(LOG_ERROR, "Failed to set up temporary file path\n");
219 return -1;
220 }
221
222 ast_mkdir(path, 0644);
223
224 if ((fd = mkstemp(*filename)) < 0) {
225 ast_log(LOG_NOTICE, "Failed to create temporary file\n");
226 ast_free(*filename);
227 return -1;
228 }
229
230 return fd;
231}
#define ast_free(a)
Definition astmm.h:180
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition astmm.h:267
#define ast_log
Definition astobj2.c:42
#define LOG_ERROR
#define LOG_NOTICE
int ast_mkdir(const char *path, int mode)
Recursively create directory path.
Definition utils.c:2513

References ast_asprintf, ast_free, ast_log, ast_mkdir(), LOG_ERROR, and LOG_NOTICE.

◆ ast_file_init()

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

2156{
2161 return 0;
2162}
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition clicompat.c:19
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition cli.h:265
static void file_shutdown(void)
Definition file.c:2148
static struct ast_cli_entry cli_file[]
Definition file.c:2144
struct stasis_message_type * ast_format_unregister_type(void)
Get the message type used for signaling a format unregistration.
struct stasis_message_type * ast_format_register_type(void)
Get the message type used for signaling a format registration.
#define STASIS_MESSAGE_TYPE_INIT(name)
Boiler-plate messaging macro for initializing message types.
Definition stasis.h:1524
#define ARRAY_LEN(a)
Definition utils.h:706

◆ ast_file_mkftemp()

FILE * ast_file_mkftemp ( char *  template_name,
mode_t  mode 
)

same as mkstemp, but return a FILE

Parameters
template_nameThe template for the unique file name to generate. Modified in place to return the file name.
modeThe mode for file permissions
Returns
FILE handle to the temporary file on success or NULL if creation failed

Definition at line 198 of file file.c.

199{
200 FILE *p = NULL;
201 int pfd = mkstemp(template_name);
202 chmod(template_name, mode);
203 if (pfd > -1) {
204 p = fdopen(pfd, "w+");
205 if (!p) {
206 close(pfd);
207 pfd = -1;
208 }
209 }
210 return p;
211}

References ast_format_def::close, and NULL.

Referenced by AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), sendmail(), and sendpage().

◆ ast_file_read_dirs()

int ast_file_read_dirs ( const char *  dir_name,
ast_file_on_file  on_file,
void *  obj,
int  max_depth 
)

Recursively iterate through files and directories up to max_depth.

Parameters
dir_namethe name of the directory to search
on_filecallback called on each file
objuser data object
max_depthre-curse into sub-directories up to a given maximum (-1 = infinite)
Return values
-1on failure
errnoon failure
0otherwise

Definition at line 1363 of file file.c.

1364{
1365 int res;
1366
1367 errno = 0;
1368
1369#if !defined(__GLIBC__)
1371#endif
1372
1373 res = __ast_file_read_dirs(dir_name, on_file, obj, max_depth);
1374
1375#if !defined(__GLIBC__)
1377#endif
1378
1379 return res;
1380}
static ast_mutex_t read_dirs_lock
Lock to hold when iterating over directories.
Definition file.c:1360
static int __ast_file_read_dirs(const char *path, ast_file_on_file on_file, void *obj, int max_depth)
Definition file.c:1245
#define ast_mutex_unlock(a)
Definition lock.h:197
#define ast_mutex_lock(a)
Definition lock.h:196
int errno

References __ast_file_read_dirs(), ast_mutex_lock, ast_mutex_unlock, errno, and read_dirs_lock.

Referenced by _crypto_load_cert_store(), _crypto_load_crl_store(), ast_media_index_update_for_file(), AST_TEST_DEFINE(), crypto_load(), module_load_helper(), and stasis_app_stored_recording_find_all().

◆ ast_filecopy()

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

Copies a file.

Parameters
oldnamename of the file you wish to copy (minus extension)
newnamename you wish the file to be copied to (minus extension)
fmtthe format of the file Copy a given file in a given format, or if fmt is NULL, then do so for all

Definition at line 1240 of file file.c.

1241{
1242 return filehelper(filename, filename2, fmt, ACTION_COPY);
1243}
static int filehelper(const char *filename, const void *arg2, const char *fmt, const enum file_action action)
Definition file.c:618
@ ACTION_COPY
Definition file.c:604

References ACTION_COPY, filehelper(), ast_filestream::filename, and ast_filestream::fmt.

Referenced by copy_plain_file(), msg_create_from_file(), stasis_app_stored_recording_copy(), and vm_forwardoptions().

◆ ast_filedelete()

int ast_filedelete ( const char *  filename,
const char *  fmt 
)

Deletes a file.

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

Definition at line 1230 of file file.c.

1231{
1232 return filehelper(filename, NULL, fmt, ACTION_DELETE);
1233}
@ ACTION_DELETE
Definition file.c:601

References ACTION_DELETE, filehelper(), ast_filestream::filename, ast_filestream::fmt, and NULL.

Referenced by __ast_play_and_record(), announce_thread(), async_delete_name_rec(), async_delete_name_rec_task(), conf_free(), conf_rec_name(), conf_run(), confbridge_exec(), dial_exec_full(), handle_cli_file_convert(), leave_voicemail(), leave_voicemail(), mixmonitor_thread(), msg_create_from_file(), play_record_review(), record_exec(), recording_cancel(), setup_privacy_args(), vm_delete(), and vm_delete().

◆ ast_fileexists()

int ast_fileexists ( const char *  filename,
const char *  fmt,
const char *  preflang 
)

Checks for the existence of a given file.

Parameters
filenamename of the file you wish to check, minus the extension
fmtthe format you wish to check (the extension)
preflang(the preferred language you wisht to find the file in) See if a given file exists in a given format. If fmt is NULL, any format is accepted.
Return values
0The file does not exist
1The file does exist.

Definition at line 1218 of file file.c.

1219{
1220 char *buf;
1221 int buflen;
1222
1223 if (preflang == NULL)
1224 preflang = "";
1225 buflen = strlen(preflang) + strlen(filename) + 4; /* room for everything */
1226 buf = ast_alloca(buflen);
1227 return fileexists_core(filename, fmt, preflang, buf, buflen, NULL) ? 1 : 0;
1228}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition astmm.h:288
char buf[BUFSIZE]
Definition eagi_proxy.c:66
static int fileexists_core(const char *filename, const char *fmt, const char *preflang, char *buf, int buflen, struct ast_format_cap *result_cap)
helper routine to locate a file with a given format and language preference.
Definition file.c:822

References ast_alloca, buf, fileexists_core(), ast_filestream::filename, ast_filestream::fmt, and NULL.

Referenced by announce_thread(), app_exec(), ast_get_character_str(), ast_get_digit_str(), ast_get_phonetic_str(), common_exec(), conf_run(), dial_exec_full(), eivr_comm(), find_first_and(), forward_message(), get_folder(), invent_message(), invent_message(), leave_voicemail(), leave_voicemail(), meetme_menu_admin_extended(), minivm_delete_exec(), moh_files_next(), msg_create_from_file(), page_exec(), play_file(), play_message(), play_message_by_id_helper(), play_message_callerid(), readexten_exec(), record_exec(), retrydial_exec(), sayname(), setup_privacy_args(), sound_file_exists(), stasis_app_control_record(), vm_intro(), vm_msg_play(), vm_newuser_setup(), vm_options(), and vm_tempgreeting().

◆ ast_filerename()

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

Renames a file.

Parameters
oldnamethe name of the file you wish to act upon (minus the extension)
newnamethe name you wish to rename the file to (minus the extension)
fmtthe format of the file Rename a given file in a given format, or if fmt is NULL, then do so for all
Return values
-1on failure

Definition at line 1235 of file file.c.

1236{
1237 return filehelper(filename, filename2, fmt, ACTION_RENAME);
1238}
@ ACTION_RENAME
Definition file.c:602

References ACTION_RENAME, filehelper(), ast_filestream::filename, and ast_filestream::fmt.

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

◆ ast_format_str_reduce()

char * ast_format_str_reduce ( char *  fmts)

Remove duplicate formats from a format string.

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

Definition at line 1998 of file file.c.

1999{
2000 struct ast_format_def *f;
2001 struct ast_format_def *fmts_ptr[AST_MAX_FORMATS];
2002 char *fmts_str[AST_MAX_FORMATS];
2003 char *stringp, *type;
2004 char *orig = fmts;
2005 int i, j, x, first, found = 0;
2006 int len = strlen(fmts) + 1;
2007 int res;
2008
2009 if (AST_RWLIST_RDLOCK(&formats)) {
2010 ast_log(LOG_WARNING, "Unable to lock format list\n");
2011 return NULL;
2012 }
2013
2014 stringp = ast_strdupa(fmts);
2015
2016 for (x = 0; (type = strsep(&stringp, "|")) && x < AST_MAX_FORMATS; x++) {
2018 if (exts_compare(f->exts, type)) {
2019 found = 1;
2020 break;
2021 }
2022 }
2023
2024 fmts_str[x] = type;
2025 if (found) {
2026 fmts_ptr[x] = f;
2027 } else {
2028 fmts_ptr[x] = NULL;
2029 }
2030 }
2032
2033 first = 1;
2034 for (i = 0; i < x; i++) {
2035 /* ignore invalid entries */
2036 if (!fmts_ptr[i]) {
2037 ast_log(LOG_WARNING, "ignoring unknown format '%s'\n", fmts_str[i]);
2038 continue;
2039 }
2040
2041 /* special handling for the first entry */
2042 if (first) {
2043 res = snprintf(fmts, len, "%s", fmts_str[i]);
2044 fmts += res;
2045 len -= res;
2046 first = 0;
2047 continue;
2048 }
2049
2050 found = 0;
2051 for (j = 0; j < i; j++) {
2052 /* this is a duplicate */
2053 if (fmts_ptr[j] == fmts_ptr[i]) {
2054 found = 1;
2055 break;
2056 }
2057 }
2058
2059 if (!found) {
2060 res = snprintf(fmts, len, "|%s", fmts_str[i]);
2061 fmts += res;
2062 len -= res;
2063 }
2064 }
2065
2066 if (first) {
2067 ast_log(LOG_WARNING, "no known formats found in format list (%s)\n", orig);
2068 return NULL;
2069 }
2070
2071 return orig;
2072}
struct sla_ringing_trunk * first
Definition app_sla.c:338
char * strsep(char **str, const char *delims)
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
static const char type[]
#define exts_compare(list, type)
Definition file.c:454
#define AST_MAX_FORMATS
Definition file.h:44
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define LOG_WARNING
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition linkedlists.h:78
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
#define AST_RWLIST_TRAVERSE
Each supported file format is described by the following structure.
Definition mod_format.h:43
struct ast_format_def::@252 list
char exts[80]
Definition mod_format.h:45
Definition file.c:58

References ast_log, AST_MAX_FORMATS, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdupa, ast_format_def::exts, exts_compare, first, len(), ast_format_def::list, LOG_WARNING, NULL, strsep(), and type.

Referenced by actual_load_config(), and AST_TEST_DEFINE().

◆ ast_get_extension_for_mime_type()

int ast_get_extension_for_mime_type ( const char *  mime_type,
char *  buffer,
size_t  capacity 
)

Get a suitable filename extension for the given MIME type.

Parameters
mime_typeThe MIME type for which to find extensions
bufferA pointer to a buffer to receive the extension
capacityThe size of 'buffer' in bytes
Return values
1if an extension was found for the provided MIME type
0if the MIME type was not found

Definition at line 2123 of file file.c.

2124{
2125 struct ast_format_def *f;
2127
2128 ast_assert(buffer && capacity);
2129
2131 if (type_in_list(f->mime_types, mime_type, strcasecmp)) {
2132 size_t item_len = strcspn(f->exts, "|");
2133 size_t bytes_written = snprintf(buffer, capacity, ".%.*s", (int) item_len, f->exts);
2134 if (bytes_written < capacity) {
2135 /* Only return success if we didn't truncate */
2136 return 1;
2137 }
2138 }
2139 }
2140
2141 return 0;
2142}
ast_mutex_t lock
Definition app_sla.c:337
static int type_in_list(const char *list, const char *type, int(*cmp)(const char *s1, const char *s2))
Definition file.c:441
#define SCOPED_RDLOCK(varname, lock)
scoped lock specialization for read locks
Definition lock.h:601
char mime_types[80]
Definition mod_format.h:47
ast_rwlock_t lock
Definition file.c:58
#define ast_assert(a)
Definition utils.h:779

References ast_assert, AST_RWLIST_TRAVERSE, ast_format_def::exts, ast_format_def::list, lock, formats::lock, ast_format_def::mime_types, SCOPED_RDLOCK, and type_in_list().

Referenced by derive_extension_from_mime_type().

◆ ast_get_format_for_file_ext()

struct ast_format * ast_get_format_for_file_ext ( const char *  file_ext)

Get the ast_format associated with the given file extension.

Since
12
Parameters
file_extThe file extension for which to find the format
Return values
NULLif not found
Returns
A pointer to the ast_format associated with this file extension

Definition at line 2110 of file file.c.

2111{
2112 struct ast_format_def *f;
2115 if (exts_compare(f->exts, file_ext)) {
2116 return f->format;
2117 }
2118 }
2119
2120 return NULL;
2121}
struct ast_format * format
Definition mod_format.h:48

References AST_RWLIST_TRAVERSE, ast_format_def::exts, exts_compare, ast_format_def::format, ast_format_def::list, lock, formats::lock, NULL, and SCOPED_RDLOCK.

Referenced by ast_ari_bridges_record(), ast_ari_channels_record(), ast_ari_recordings_get_stored_file(), file_extension_from_string(), is_recording(), and process_media_file().

◆ ast_openstream()

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

Opens stream for use in seeking, playing.

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

Definition at line 926 of file file.c.

927{
928 return openstream_internal(chan, filename, preflang, 0, 0);
929}
static struct ast_filestream * openstream_internal(struct ast_channel *chan, const char *filename, const char *preflang, int asis, int quiet)
Definition file.c:871

References ast_filestream::filename, and openstream_internal().

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

◆ ast_openstream_full()

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.

Parameters
chanchannel to work with
filenameto use
preflangprefered language to use
asisif set, don't clear generators
Return values
aast_filestream pointer if it opens the file.
NULLon error.

Definition at line 931 of file file.c.

933{
934 return openstream_internal(chan, filename, preflang, asis, 0);
935}

References ast_filestream::filename, and openstream_internal().

Referenced by gen_nextfile(), and moh_files_next().

◆ ast_openvstream()

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

Opens stream for use in seeking, playing.

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

Definition at line 937 of file file.c.

939{
940 /* As above, but for video. But here we don't have translators
941 * so we must enforce a format.
942 */
943 struct ast_format_cap *nativeformats, *tmp_cap;
944 char *buf;
945 int buflen;
946 int i, fd;
947
948 if (preflang == NULL) {
949 preflang = "";
950 }
951 buflen = strlen(preflang) + strlen(filename) + 4;
952 buf = ast_alloca(buflen);
953
954 ast_channel_lock(chan);
955 nativeformats = ao2_bump(ast_channel_nativeformats(chan));
956 ast_channel_unlock(chan);
957
958 /* is the channel capable of video without translation ?*/
959 if (!ast_format_cap_has_type(nativeformats, AST_MEDIA_TYPE_VIDEO)) {
960 ao2_cleanup(nativeformats);
961 return NULL;
962 }
964 ao2_cleanup(nativeformats);
965 return NULL;
966 }
967 /* Video is supported, so see what video formats exist for this file */
968 if (!fileexists_core(filename, NULL, preflang, buf, buflen, tmp_cap)) {
969 ao2_ref(tmp_cap, -1);
970 ao2_cleanup(nativeformats);
971 return NULL;
972 }
973
974 /* iterate over file formats and pick the first one compatible with the channel's native formats */
975 for (i = 0; i < ast_format_cap_count(tmp_cap); ++i) {
976 struct ast_format *format = ast_format_cap_get_format(tmp_cap, i);
977
978 if ((ast_format_get_type(format) != AST_MEDIA_TYPE_VIDEO) ||
979 !ast_format_cap_iscompatible(nativeformats, tmp_cap)) {
980 ao2_ref(format, -1);
981 continue;
982 }
983
984 fd = filehelper(buf, chan, ast_format_get_name(format), ACTION_OPEN);
985 if (fd >= 0) {
986 ao2_ref(format, -1);
987 ao2_ref(tmp_cap, -1);
988 ao2_cleanup(nativeformats);
989 return ast_channel_vstream(chan);
990 }
991 ast_log(LOG_WARNING, "File %s has video but couldn't be opened\n", filename);
992 ao2_ref(format, -1);
993 }
994 ao2_ref(tmp_cap, -1);
995 ao2_cleanup(nativeformats);
996
997 return NULL;
998}
#define ao2_cleanup(obj)
Definition astobj2.h:1934
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition astobj2.h:480
#define ast_channel_lock(chan)
Definition channel.h:2983
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
struct ast_filestream * ast_channel_vstream(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition channel.h:2984
@ AST_MEDIA_TYPE_VIDEO
Definition codec.h:33
@ ACTION_OPEN
Definition file.c:603
enum ast_media_type ast_format_get_type(const struct ast_format *format)
Get the media type of a format.
Definition format.c:354
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition format.c:334
struct ast_format * ast_format_cap_get_format(const struct ast_format_cap *cap, int position)
Get the format at a specific index.
Definition format_cap.c:408
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition format_cap.h:38
int ast_format_cap_has_type(const struct ast_format_cap *cap, enum ast_media_type type)
Find out if the capabilities structure has any formats of a specific type.
Definition format_cap.c:621
int ast_format_cap_iscompatible(const struct ast_format_cap *cap1, const struct ast_format_cap *cap2)
Determine if any joint capabilities exist between two capabilities structures.
Definition format_cap.c:661
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition format_cap.h:49
size_t ast_format_cap_count(const struct ast_format_cap *cap)
Get the number of formats present within the capabilities structure.
Definition format_cap.c:403
Format capabilities structure, holds formats + preference order + etc.
Definition format_cap.c:54
Definition of a media format.
Definition format.c:43

References ACTION_OPEN, ao2_bump, ao2_cleanup, ao2_ref, ast_alloca, ast_channel_lock, ast_channel_nativeformats(), ast_channel_unlock, ast_channel_vstream(), ast_format_cap_alloc, ast_format_cap_count(), AST_FORMAT_CAP_FLAG_DEFAULT, ast_format_cap_get_format(), ast_format_cap_has_type(), ast_format_cap_iscompatible(), ast_format_get_name(), ast_format_get_type(), ast_log, AST_MEDIA_TYPE_VIDEO, buf, fileexists_core(), filehelper(), LOG_WARNING, and NULL.

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

◆ ast_playstream()

int ast_playstream ( struct ast_filestream *  s)

Play a open stream on a channel.

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

Definition at line 1152 of file file.c.

1153{
1154 enum fsread_res res;
1155
1157 res = ast_readaudio_callback(s);
1158 else
1159 res = ast_readvideo_callback(s);
1160
1161 return (res == FSREAD_FAILURE) ? -1 : 0;
1162}
@ AST_MEDIA_TYPE_AUDIO
Definition codec.h:32
fsread_res
Definition file.c:1032
@ FSREAD_FAILURE
Definition file.c:1033
static enum fsread_res ast_readaudio_callback(struct ast_filestream *s)
Definition file.c:1040
static enum fsread_res ast_readvideo_callback(struct ast_filestream *s)
Definition file.c:1103
struct ast_format_def * fmt
Definition mod_format.h:103

References ast_format_get_type(), AST_MEDIA_TYPE_AUDIO, ast_readaudio_callback(), ast_readvideo_callback(), ast_filestream::fmt, ast_format_def::format, and FSREAD_FAILURE.

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

◆ ast_ratestream()

int ast_ratestream ( struct ast_filestream *  fs)

Return the sample rate of the stream's format.

Parameters
fsfs to act on
Returns
sample rate in Hz

Definition at line 1179 of file file.c.

1180{
1182}
unsigned int ast_format_get_sample_rate(const struct ast_format *format)
Get the sample rate of a media format.
Definition format.c:379

References ast_format_get_sample_rate(), ast_filestream::fmt, and ast_format_def::format.

Referenced by msg_create_from_file().

◆ ast_readfile()

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.

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

Definition at line 1475 of file file.c.

1476{
1477 FILE *bfile;
1478 struct ast_format_def *f;
1479 struct ast_filestream *fs = NULL;
1480 char *fn;
1481 int format_found = 0;
1482
1484
1485 AST_RWLIST_TRAVERSE(&formats, f, list) {
1486 fs = NULL;
1487 if (!exts_compare(f->exts, type))
1488 continue;
1489 else
1490 format_found = 1;
1491
1493 if (!fn) {
1494 continue;
1495 }
1496 errno = 0;
1497 bfile = fopen(fn, "r");
1498
1499 if (!bfile || (fs = get_filestream(f, bfile)) == NULL || open_wrapper(fs) ) {
1500 ast_log(LOG_WARNING, "Unable to open %s\n", fn);
1501 if (fs) {
1502 ast_closestream(fs);
1503 }
1504 fs = NULL;
1505 bfile = NULL;
1506 ast_free(fn);
1507 break;
1508 }
1509 /* found it */
1510 fs->trans = NULL;
1511 fs->fmt = f;
1512 fs->flags = flags;
1513 fs->mode = mode;
1515 fs->vfs = NULL;
1516 ast_free(fn);
1517 break;
1518 }
1519
1521 if (!format_found)
1522 ast_log(LOG_WARNING, "No such format '%s'\n", type);
1523
1524 return fs;
1525}
#define ast_strdup(str)
A wrapper for strdup()
Definition astmm.h:241
static char * build_filename(const char *filename, const char *ext)
construct a filename. Absolute pathnames are preserved, relative names are prefixed by the sounds/ di...
Definition file.c:422
int ast_closestream(struct ast_filestream *f)
Closes a stream.
Definition file.c:1200
static int open_wrapper(struct ast_filestream *s)
Definition file.c:594
static struct ast_filestream * get_filestream(struct ast_format_def *fmt, FILE *bfile)
Definition file.c:532
This structure is allocated by file.c in one chunk, together with buf_size and desc_size bytes of mem...
Definition mod_format.h:101
struct ast_filestream * vfs
Definition mod_format.h:110
struct ast_trans_pvt * trans
Definition mod_format.h:112

References ast_closestream(), ast_free, ast_log, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdup, build_filename(), errno, exts_compare, ast_filestream::f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, get_filestream(), LOG_WARNING, ast_filestream::mode, NULL, open_wrapper(), ast_filestream::trans, type, and ast_filestream::vfs.

Referenced by __ast_play_and_record(), handle_cli_file_convert(), and msg_create_from_file().

◆ ast_readframe()

struct ast_frame * ast_readframe ( struct ast_filestream *  s)

Read a frame from a filestream.

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

Definition at line 1025 of file file.c.

1026{
1027 int whennext = 0;
1028
1029 return read_frame(s, &whennext);
1030}
static struct ast_frame * read_frame(struct ast_filestream *s, int *whennext)
Definition file.c:1000

References read_frame().

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

◆ ast_seekstream()

int ast_seekstream ( struct ast_filestream *  fs,
off_t  sample_offset,
int  whence 
)

Seeks into stream.

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

Definition at line 1164 of file file.c.

1165{
1166 return fs->fmt->seek(fs, sample_offset, whence);
1167}
int(* seek)(struct ast_filestream *, off_t, int)
Definition mod_format.h:68

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

Referenced by ast_stream_fastforward(), ast_stream_rewind(), ast_streamfile(), control_streamfile(), dictate_exec(), handle_getoption(), handle_recordfile(), handle_streamfile(), moh_files_next(), msg_create_from_file(), and speech_streamfile().

◆ ast_stopstream()

int ast_stopstream ( struct ast_channel *  c)

Stops a stream.

Parameters
cThe channel you wish to stop playback on

Stop playback of a stream

Return values
0always
Note
The channel does not need to be locked before calling this function.
Examples
app_skel.c.

Definition at line 233 of file file.c.

234{
235 struct ast_json * cel_event = NULL;
236
237 ast_channel_lock(tmp);
238
239 /* Stop a running stream if there is one */
240 if (ast_channel_stream(tmp)) {
243
244 cel_event = ast_json_pack("{ s: s }", "event", "FILE_STREAM_END");
245 if (cel_event) {
247 }
248
250 ast_log(LOG_WARNING, "Unable to restore format back to %s\n", ast_format_get_name(ast_channel_oldwriteformat(tmp)));
251 }
252 ast_json_unref(cel_event);
253
254 /* Stop the video stream too */
255 if (ast_channel_vstream(tmp) != NULL) {
258 }
259
261
262 return 0;
263}
void ast_cel_publish_event(struct ast_channel *chan, enum ast_cel_event_type event_type, struct ast_json *blob)
Publish a CEL event.
Definition cel.c:1762
@ AST_CEL_STREAM_END
A stream ended.
Definition cel.h:84
void ast_channel_stream_set(struct ast_channel *chan, struct ast_filestream *value)
struct ast_format * ast_channel_oldwriteformat(struct ast_channel *chan)
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition channel.c:5826
struct ast_filestream * ast_channel_stream(const struct ast_channel *chan)
void ast_channel_vstream_set(struct ast_channel *chan, struct ast_filestream *value)
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition json.c:73
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition json.c:612
Abstract JSON element (object, array, string, int, ...).

References ast_cel_publish_event(), AST_CEL_STREAM_END, ast_channel_lock, ast_channel_oldwriteformat(), ast_channel_stream(), ast_channel_stream_set(), ast_channel_unlock, ast_channel_vstream(), ast_channel_vstream_set(), ast_closestream(), ast_format_get_name(), ast_json_pack(), ast_json_unref(), ast_log, ast_set_write_format(), LOG_WARNING, and NULL.

Referenced by action_playback_and_continue(), adsi_transmit_message_full(), agent_alert(), announce_to_dial(), ast_play_and_wait(), ast_readstring_full(), ast_say_enumeration_full_da(), ast_say_enumeration_full_de(), ast_say_enumeration_full_dr(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_enumeration_full_is(), ast_say_enumeration_full_ps(), ast_say_enumeration_full_vi(), ast_say_number_full_cs(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_dr(), 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_is(), ast_say_number_full_it(), ast_say_number_full_ja(), ast_say_number_full_ka(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_ps(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_th(), ast_say_number_full_ur(), ast_say_number_full_vi(), ast_say_number_full_zh(), ast_stream_and_wait(), background_detect_exec(), conf_exec(), conf_run(), control_streamfile(), dial_exec_full(), directory_exec(), grab_transfer(), handle_getoption(), handle_speechrecognize(), handle_streamfile(), isAnsweringMachine(), ivr_dispatch(), leave_voicemail(), meetme_menu_admin(), meetme_menu_admin_extended(), minivm_greet_exec(), mp3_exec(), openstream_internal(), pbx_builtin_background(), pl_odtworz_plik(), play_file(), play_file(), play_files_helper(), play_mailbox_owner(), playback_exec(), queue_exec(), read_exec(), readexten_exec(), recordthread(), s_streamwait3(), say_filenames(), select_item_seq(), send_waveform_to_channel(), speech_background(), vm_authenticate(), vm_execmain(), wait_for_winner(), waitstream_core(), and zapateller_exec().

◆ ast_stream_and_wait()

int ast_stream_and_wait ( struct ast_channel *  chan,
const char *  file,
const char *  digits 
)

stream file until digit If the file name is non-empty, try to play it.

Note
If digits == "" then we can simply check for non-zero.
If a failure is encountered, the stream will be closed before returning.
Return values
0if success.
-1if error.
digitif interrupted by a digit.
Examples
app_skel.c.

Definition at line 1982 of file file.c.

1983{
1984 int res = 0;
1985 if (!ast_strlen_zero(file)) {
1986 res = ast_streamfile(chan, file, ast_channel_language(chan));
1987 if (!res) {
1988 res = ast_waitstream(chan, digits);
1989 }
1990 }
1991 if (res == -1) {
1992 ast_stopstream(chan);
1993 }
1994
1995 return res;
1996}
const char * ast_channel_language(const struct ast_channel *chan)
int ast_streamfile(struct ast_channel *chan, const char *filename, const char *preflang)
Streams a file.
Definition file.c:1382
int ast_stopstream(struct ast_channel *tmp)
Stops a stream.
Definition file.c:233
int ast_waitstream(struct ast_channel *c, const char *breakon)
Waits for a stream to stop or digit to be pressed.
Definition file.c:1944
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65

References ast_channel_language(), ast_stopstream(), ast_streamfile(), ast_strlen_zero(), and ast_waitstream().

Referenced by __ast_play_and_record(), action_playback(), action_toggle_mute_participants(), agent_alert(), agent_login_exec(), announce_user_count(), app_exec(), ast_bridge_channel_playfile(), ast_pickup_call(), ast_record_review(), bridge_features_duration_callback(), confbridge_exec(), directory_exec(), forward_message(), grab_transfer(), invent_message(), ivr_dispatch(), join_conference_bridge(), leave_voicemail(), limits_interval_playback(), mixmonitor_thread(), park_app_exec(), parked_call_app_exec(), play_file(), play_files_helper(), play_mailbox_owner(), play_message_callerid(), play_prompt_to_user(), play_record_review(), play_record_review(), playback_common(), record_exec(), sayname(), select_item_seq(), setup_mixmonitor_ds(), stream_failsound(), vm_forwardoptions(), vmsayname_exec(), and wait_file2().

◆ ast_stream_fastforward()

int ast_stream_fastforward ( struct ast_filestream *  fs,
off_t  ms 
)

Fast forward stream ms.

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

Definition at line 1184 of file file.c.

1185{
1186 return ast_seekstream(fs, ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
1187}
#define DEFAULT_SAMPLES_PER_MS
Definition asterisk.h:49
int ast_seekstream(struct ast_filestream *fs, off_t sample_offset, int whence)
Seeks into stream.
Definition file.c:1164

References ast_seekstream(), and DEFAULT_SAMPLES_PER_MS.

Referenced by waitstream_control().

◆ ast_stream_rewind()

int ast_stream_rewind ( struct ast_filestream *  fs,
off_t  ms 
)

Rewind stream ms.

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

Definition at line 1189 of file file.c.

1190{
1191 off_t offset = ast_tellstream(fs);
1192 if (ms * DEFAULT_SAMPLES_PER_MS > offset) {
1193 /* Don't even bother asking the file format to seek to a negative offset... */
1194 ast_debug(1, "Restarting, rather than seeking to negative offset %ld\n", (long) (offset - (ms * DEFAULT_SAMPLES_PER_MS)));
1195 return ast_seekstream(fs, 0, SEEK_SET);
1196 }
1197 return ast_seekstream(fs, -ms * DEFAULT_SAMPLES_PER_MS, SEEK_CUR);
1198}
off_t ast_tellstream(struct ast_filestream *fs)
Tell where we are in a stream.
Definition file.c:1174
#define ast_debug(level,...)
Log a DEBUG message.

References ast_debug, ast_seekstream(), ast_tellstream(), and DEFAULT_SAMPLES_PER_MS.

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

◆ ast_streamfile()

int ast_streamfile ( struct ast_channel *  c,
const char *  filename,
const char *  preflang 
)

Streams a file.

Parameters
cchannel to stream the file to
filenamethe name of the file you wish to stream, minus the extension
preflangthe preferred language you wish to have the file streamed to you in Prepares a channel for the streaming of a file. To start the stream, afterward do a ast_waitstream() on the channel Also, it will stop any existing streams on the channel.
Return values
0on success.
-1on failure.

Definition at line 1382 of file file.c.

1384{
1385 struct ast_json * cel_event = NULL;
1386 struct ast_filestream *fs = NULL;
1387 struct ast_filestream *vfs = NULL;
1388 off_t pos;
1389 int seekattempt;
1390 int res;
1391 char custom_filename[256];
1392 char *tmp_filename;
1393
1394 /* If file with the same name exists in /var/lib/asterisk/sounds/custom directory, use that file.
1395 * Otherwise, use the original file*/
1396
1398 memset(custom_filename, 0, sizeof(custom_filename));
1399 snprintf(custom_filename, sizeof(custom_filename), "custom/%s", filename);
1400 fs = openstream_internal(chan, custom_filename, preflang, 0, 1); /* open stream, do not warn for missing files */
1401 if (fs) {
1402 tmp_filename = custom_filename;
1403 ast_debug(3, "Found file %s in custom directory\n", filename);
1404 }
1405 }
1406
1407 if (!fs) {
1408 fs = ast_openstream(chan, filename, preflang);
1409 if (!fs) {
1410 struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
1411 ast_channel_lock(chan);
1412 ast_log(LOG_WARNING, "Unable to open %s (format %s)\n",
1413 filename, ast_format_cap_get_names(ast_channel_nativeformats(chan), &codec_buf));
1414 ast_channel_unlock(chan);
1415 return -1;
1416 }
1417 tmp_filename = (char *)filename;
1418 }
1419
1420 /* check to see if there is any data present (not a zero length file),
1421 * done this way because there is no where for ast_openstream_full to
1422 * return the file had no data. */
1423 pos = ftello(fs->f);
1424 seekattempt = fseeko(fs->f, -1, SEEK_END);
1425 if (seekattempt) {
1426 if (errno == EINVAL) {
1427 /* Zero-length file, as opposed to a pipe */
1428 return 0;
1429 } else {
1430 ast_seekstream(fs, 0, SEEK_SET);
1431 }
1432 } else {
1433 fseeko(fs->f, pos, SEEK_SET);
1434 }
1435
1436 vfs = ast_openvstream(chan, tmp_filename, preflang);
1437 if (vfs) {
1438 ast_debug(1, "Ooh, found a video stream, too, format %s\n", ast_format_get_name(vfs->fmt->format));
1439 }
1440
1443 if (ast_applystream(chan, fs))
1444 return -1;
1445 if (vfs && ast_applystream(chan, vfs))
1446 return -1;
1447 ast_test_suite_event_notify("PLAYBACK", "Message: %s\r\nChannel: %s", tmp_filename, ast_channel_name(chan));
1448 res = ast_playstream(fs);
1449 if (!res && vfs)
1450 res = ast_playstream(vfs);
1451
1452 cel_event = ast_json_pack("{ s: s, s: {s: s, s: s, s: s}}",
1453 "event", "FILE_STREAM_BEGIN",
1454 "extra",
1455 "sound", tmp_filename,
1457 "language", preflang ? preflang : "default"
1458 );
1459 if (cel_event) {
1461 } else {
1462 ast_log(LOG_WARNING, "Unable to build extradata for sound file STREAM_BEGIN event on channel %s", ast_channel_name(chan));
1463 }
1464 ast_json_unref(cel_event);
1465
1466 if (VERBOSITY_ATLEAST(3)) {
1467 ast_channel_lock(chan);
1468 ast_verb(3, "<%s> Playing '%s' (format '%s', language '%s')\n", ast_channel_name(chan), tmp_filename, S_OR(fs->open_extension, "unknown"), preflang ? preflang : "default");
1469 ast_channel_unlock(chan);
1470 }
1471
1472 return res;
1473}
@ AST_CEL_STREAM_BEGIN
A stream started.
Definition cel.h:82
const char * ast_channel_name(const struct ast_channel *chan)
@ AST_FLAG_MASQ_NOSTREAM
Definition channel.h:1034
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
struct ast_filestream * ast_openstream(struct ast_channel *chan, const char *filename, const char *preflang)
Opens stream for use in seeking, playing.
Definition file.c:926
int ast_applystream(struct ast_channel *chan, struct ast_filestream *s)
Applies a open stream to a channel.
Definition file.c:1146
struct ast_filestream * ast_openvstream(struct ast_channel *chan, const char *filename, const char *preflang)
Opens stream for use in seeking, playing.
Definition file.c:937
static int is_absolute_path(const char *filename)
Definition file.c:756
int ast_playstream(struct ast_filestream *s)
Play a open stream on a channel.
Definition file.c:1152
#define AST_FORMAT_CAP_NAMES_LEN
Definition format_cap.h:324
const char * ast_format_cap_get_names(const struct ast_format_cap *cap, struct ast_str **buf)
Get the names of codecs of a set of formats.
Definition format_cap.c:742
#define VERBOSITY_ATLEAST(level)
#define ast_verb(level,...)
#define ast_opt_sounds_search_custom
Definition options.h:148
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition strings.h:80
#define ast_str_alloca(init_len)
Definition strings.h:848
char * open_extension
Definition mod_format.h:106
const char * orig_chan_name
Definition mod_format.h:125
Support for dynamic strings.
Definition strings.h:623
#define ast_test_suite_event_notify(s, f,...)
Definition test.h:189
#define ast_test_flag(p, flag)
Definition utils.h:64

References ast_applystream(), ast_cel_publish_event(), AST_CEL_STREAM_BEGIN, ast_channel_flags(), ast_channel_lock, ast_channel_name(), ast_channel_nativeformats(), ast_channel_unlock, ast_channel_writeformat(), ast_debug, AST_FLAG_MASQ_NOSTREAM, ast_format_cap_get_names(), AST_FORMAT_CAP_NAMES_LEN, ast_format_get_name(), ast_json_pack(), ast_json_unref(), ast_log, ast_openstream(), ast_openvstream(), ast_opt_sounds_search_custom, ast_playstream(), ast_seekstream(), ast_str_alloca, ast_strdup, ast_test_flag, ast_test_suite_event_notify, ast_verb, errno, ast_filestream::f, ast_filestream::filename, ast_filestream::fmt, ast_format_def::format, is_absolute_path(), LOG_WARNING, NULL, ast_filestream::open_extension, openstream_internal(), ast_filestream::orig_chan_name, S_OR, VERBOSITY_ATLEAST, and ast_filestream::vfs.

Referenced by __analog_ss_thread(), action_playback_and_continue(), analog_ss_thread(), announce_thread(), announce_to_dial(), app_exec(), ast_app_getdata_full(), ast_app_getdata_terminator(), 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_is(), ast_say_date_ja(), 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_ja(), 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_dr(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_enumeration_full_is(), ast_say_enumeration_full_ps(), ast_say_enumeration_full_vi(), ast_say_number_full_cs(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_dr(), 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_is(), ast_say_number_full_it(), ast_say_number_full_ja(), ast_say_number_full_ka(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_ps(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_th(), ast_say_number_full_ur(), ast_say_number_full_vi(), 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_ja(), ast_say_time_ka(), ast_say_time_nl(), ast_say_time_zh(), ast_stream_and_wait(), auth_exec(), background_detect_exec(), common_exec(), conf_exec(), conf_get_pin(), conf_run(), control_streamfile(), dial_exec_full(), do_directory(), find_conf_realtime(), forward_message(), gr_say_number_female(), handle_recordfile(), invent_message(), isAnsweringMachine(), leave_voicemail(), leave_voicemail(), meetme_menu_admin(), meetme_menu_admin_extended(), meetme_menu_normal(), minivm_greet_exec(), page_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_record_review(), playback_exec(), privacy_exec(), readexten_exec(), retrydial_exec(), s_streamwait3(), say_filenames(), select_item_menu(), setup_privacy_args(), vm_authenticate(), wait_file(), wait_for_answer(), and wait_for_winner().

◆ ast_tellstream()

off_t ast_tellstream ( struct ast_filestream *  fs)

Tell where we are in a stream.

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

Definition at line 1174 of file file.c.

1175{
1176 return fs->fmt->tell(fs);
1177}
off_t(* tell)(struct ast_filestream *fs)
Definition mod_format.h:70

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

Referenced by __ast_play_and_record(), ast_stream_rewind(), control_streamfile(), handle_getoption(), handle_recordfile(), handle_speechrecognize(), handle_streamfile(), moh_files_next(), msg_create_from_file(), waitstream_control(), and waitstream_core().

◆ ast_truncstream()

int ast_truncstream ( struct ast_filestream *  fs)

Trunc stream at current location.

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

Definition at line 1169 of file file.c.

1170{
1171 return fs->fmt->trunc(fs);
1172}
int(* trunc)(struct ast_filestream *fs)
Definition mod_format.h:69

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

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

◆ ast_waitstream()

int ast_waitstream ( struct ast_channel *  c,
const char *  breakon 
)

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

Parameters
cchannel to waitstream on
breakonstring of DTMF digits to break upon Begins playback of a stream... Wait for a stream to stop or for any one of a given digit to arrive,
Return values
0if the stream finishes
characterif it was interrupted by the channel.
-1on error

Definition at line 1944 of file file.c.

1945{
1946 int res;
1947
1948 res = waitstream_core(c, breakon, NULL, NULL, 0, -1, -1, NULL, NULL /* no callback */);
1949
1950 return sanitize_waitstream_return(res);
1951}
static int sanitize_waitstream_return(int return_value)
Definition file.c:1927
static int waitstream_core(struct ast_channel *c, const char *breakon, const char *forward, const char *reverse, int skip_ms, int audiofd, int cmdfd, const char *context, ast_waitstream_fr_cb cb)
the core of all waitstream() functions
Definition file.c:1717
static struct test_val c

References c, NULL, sanitize_waitstream_return(), and waitstream_core().

Referenced by __analog_ss_thread(), action_playback_and_continue(), analog_ss_thread(), announce_thread(), announce_to_dial(), 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_is(), ast_say_date_ja(), 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_ja(), 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_dr(), ast_say_enumeration_full_en(), ast_say_enumeration_full_he(), ast_say_enumeration_full_is(), ast_say_enumeration_full_ps(), ast_say_enumeration_full_vi(), ast_say_number_full_cs(), ast_say_number_full_da(), ast_say_number_full_de(), ast_say_number_full_dr(), 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_is(), ast_say_number_full_it(), ast_say_number_full_ja(), ast_say_number_full_ka(), ast_say_number_full_nl(), ast_say_number_full_no(), ast_say_number_full_ps(), ast_say_number_full_pt(), ast_say_number_full_ru(), ast_say_number_full_se(), ast_say_number_full_th(), ast_say_number_full_ur(), ast_say_number_full_vi(), ast_say_number_full_zh(), ast_say_time_de(), ast_say_time_en(), ast_say_time_fr(), ast_say_time_gr(), ast_say_time_he(), ast_say_time_hu(), ast_say_time_ja(), ast_say_time_ka(), ast_say_time_nl(), ast_say_time_zh(), ast_stream_and_wait(), auth_exec(), common_exec(), conf_exec(), conf_get_pin(), conf_run(), directory_exec(), find_conf_realtime(), gr_say_number_female(), handle_recordfile(), invent_message(), leave_voicemail(), leave_voicemail(), meetme_menu_admin(), meetme_menu_admin_extended(), meetme_menu_normal(), minivm_greet_exec(), page_exec(), pbx_builtin_background(), pl_odtworz_plik(), play_and_wait(), play_file(), play_record_review(), playback_exec(), privacy_exec(), retrydial_exec(), s_streamwait3(), say_filenames(), select_item_menu(), setup_privacy_args(), vm_authenticate(), and wait_file().

◆ ast_waitstream_exten()

int ast_waitstream_exten ( struct ast_channel *  c,
const char *  context 
)

Waits for a stream to stop or digit matching a valid one digit exten to be pressed.

Parameters
cchannel to waitstream on
contextstring of context to match digits to break upon Begins playback of a stream... Wait for a stream to stop or for any one of a valid extension digit to arrive,
Return values
0if the stream finishes.
characterif it was interrupted.
-1on error.

Definition at line 1963 of file file.c.

1964{
1965 int res;
1966
1967 /* Waitstream, with return in the case of a valid 1 digit extension */
1968 /* in the current or specified context being pressed */
1969 if (!context)
1971 res = waitstream_core(c, NULL, NULL, NULL, 0,
1972 -1, -1, context, NULL /* no callback */);
1973
1974 return sanitize_waitstream_return(res);
1975}
const char * ast_channel_context(const struct ast_channel *chan)

References ast_channel_context(), c, NULL, sanitize_waitstream_return(), and waitstream_core().

Referenced by pbx_builtin_background().

◆ ast_waitstream_fr()

int ast_waitstream_fr ( struct ast_channel *  c,
const char *  breakon,
const char *  forward,
const char *  rewind,
int  ms 
)

Same as waitstream but allows stream to be forwarded or rewound.

Parameters
cchannel to waitstream on
breakonstring of DTMF digits to break upon
forwardDTMF digit to fast forward upon
rewindDTMF digit to rewind upon
msHow many miliseconds to skip forward/back Begins playback of a stream... Wait for a stream to stop or for any one of a given digit to arrive,
Return values
0if the stream finishes.
characterif it was interrupted,
Returns
the value of the control frame if it was interrupted by some other party,
Return values
-1on error.

Definition at line 1913 of file file.c.

1914{
1915 return waitstream_core(c, breakon, forward, reverse, ms,
1916 -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */, NULL /* no callback */);
1917}

References c, NULL, and waitstream_core().

Referenced by control_streamfile().

◆ ast_waitstream_fr_w_cb()

int ast_waitstream_fr_w_cb ( struct ast_channel *  c,
const char *  breakon,
const char *  forward,
const char *  rewind,
int  ms,
ast_waitstream_fr_cb  cb 
)

Same as waitstream_fr but allows a callback to be alerted when a user fastforwards or rewinds the file.

Parameters
cchannel to waitstream on
breakonstring of DTMF digits to break upon
forwardDTMF digit to fast forward upon
rewindDTMF digit to rewind upon
msHow many milliseconds to skip forward/back
cbto call when rewind or fastforward occurs. Begins playback of a stream... Wait for a stream to stop or for any one of a given digit to arrive,
Return values
0if the stream finishes.
characterif it was interrupted,
Returns
the value of the control frame if it was interrupted by some other party,
Return values
-1on error.

Definition at line 1902 of file file.c.

1908{
1909 return waitstream_core(c, breakon, forward, reverse, ms,
1910 -1 /* no audiofd */, -1 /* no cmdfd */, NULL /* no context */, cb);
1911}

References c, NULL, and waitstream_core().

Referenced by control_streamfile().

◆ ast_waitstream_full()

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

◆ ast_writefile()

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.

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

Definition at line 1527 of file file.c.

1528{
1529 int fd, myflags = 0;
1530 /* compiler claims this variable can be used before initialization... */
1531 FILE *bfile = NULL;
1532 struct ast_format_def *f;
1533 struct ast_filestream *fs = NULL;
1534 char *buf = NULL;
1535 size_t size = 0;
1536 int format_found = 0;
1537
1539
1540 /* set the O_TRUNC flag if and only if there is no O_APPEND specified */
1541 /* We really can't use O_APPEND as it will break WAV header updates */
1542 if (flags & O_APPEND) {
1543 flags &= ~O_APPEND;
1544 } else {
1545 myflags = O_TRUNC;
1546 }
1547
1548 myflags |= O_WRONLY | O_CREAT;
1549
1550 /* XXX need to fix this - we should just do the fopen,
1551 * not open followed by fdopen()
1552 */
1553 AST_RWLIST_TRAVERSE(&formats, f, list) {
1554 char *fn, *orig_fn = NULL;
1555 if (fs)
1556 break;
1557
1558 if (!exts_compare(f->exts, type))
1559 continue;
1560 else
1561 format_found = 1;
1562
1564 if (!fn) {
1565 continue;
1566 }
1567 fd = open(fn, flags | myflags, mode);
1568 if (fd > -1) {
1569 /* fdopen() the resulting file stream */
1570 bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w");
1571 if (!bfile) {
1572 ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno));
1573 close(fd);
1574 fd = -1;
1575 }
1576 }
1577
1578 if (ast_opt_cache_record_files && (fd > -1)) {
1579 char *c;
1580
1581 fclose(bfile); /* this also closes fd */
1582 /*
1583 We touch orig_fn just as a place-holder so other things (like vmail) see the file is there.
1584 What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place.
1585 */
1586 orig_fn = ast_strdup(fn);
1587 for (c = fn; *c; c++)
1588 if (*c == '/')
1589 *c = '_';
1590
1591 size = strlen(fn) + strlen(record_cache_dir) + 2;
1592 buf = ast_malloc(size);
1593 strcpy(buf, record_cache_dir);
1594 strcat(buf, "/");
1595 strcat(buf, fn);
1596 ast_free(fn);
1597 fn = buf;
1598 fd = open(fn, flags | myflags, mode);
1599 if (fd > -1) {
1600 /* fdopen() the resulting file stream */
1601 bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w");
1602 if (!bfile) {
1603 ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno));
1604 close(fd);
1605 fd = -1;
1606 }
1607 }
1608 }
1609 if (fd > -1) {
1610 errno = 0;
1611 fs = get_filestream(f, bfile);
1612 if (fs) {
1613 if ((fs->write_buffer = ast_malloc(32768))) {
1614 setvbuf(fs->f, fs->write_buffer, _IOFBF, 32768);
1615 }
1616 }
1617 if (!fs || rewrite_wrapper(fs, comment)) {
1618 ast_log(LOG_WARNING, "Unable to rewrite %s\n", fn);
1619 close(fd);
1620 if (orig_fn) {
1621 unlink(fn);
1622 unlink(orig_fn);
1623 ast_free(orig_fn);
1624 }
1625 if (fs) {
1626 ast_closestream(fs);
1627 fs = NULL;
1628 }
1629 /*
1630 * 'fn' was has either been allocated from build_filename, or that was freed
1631 * and now 'fn' points to memory allocated for 'buf'. Either way the memory
1632 * now needs to be released.
1633 */
1634 ast_free(fn);
1635 continue;
1636 }
1637 fs->trans = NULL;
1638 fs->fmt = f;
1639 fs->flags = flags;
1640 fs->mode = mode;
1641 if (orig_fn) {
1642 fs->realfilename = orig_fn;
1643 fs->filename = fn;
1644 /*
1645 * The above now manages the memory allocated for 'orig_fn' and 'fn', so
1646 * set them to NULL, so they don't get released at the end of the loop.
1647 */
1648 orig_fn = NULL;
1649 fn = NULL;
1650 } else {
1651 fs->realfilename = NULL;
1653 }
1654 fs->vfs = NULL;
1655 /* If truncated, we'll be at the beginning; if not truncated, then append */
1656 f->seek(fs, 0, SEEK_END);
1657 } else if (errno != EEXIST) {
1658 ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno));
1659 if (orig_fn)
1660 unlink(orig_fn);
1661 }
1662 /* Free 'fn', or if 'fn' points to 'buf' then free 'buf' */
1663 ast_free(fn);
1664 ast_free(orig_fn);
1665 }
1666
1668
1669 if (!format_found)
1670 ast_log(LOG_WARNING, "No such format '%s'\n", type);
1671
1672 return fs;
1673}
#define comment
Definition ael_lex.c:965
#define ast_malloc(len)
A wrapper for malloc()
Definition astmm.h:191
static int rewrite_wrapper(struct ast_filestream *s, const char *comment)
Definition file.c:589
char record_cache_dir[AST_CACHE_DIR_LEN]
Definition options.c:97
#define ast_opt_cache_record_files
Definition options.h:130
char * realfilename
Definition mod_format.h:108
char * write_buffer
Definition mod_format.h:126

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, buf, build_filename(), c, comment, errno, exts_compare, ast_filestream::f, ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, get_filestream(), LOG_WARNING, ast_filestream::mode, NULL, ast_filestream::realfilename, record_cache_dir, rewrite_wrapper(), ast_filestream::trans, type, ast_filestream::vfs, and ast_filestream::write_buffer.

Referenced by __ast_play_and_record(), ast_writestream(), dictate_exec(), handle_cli_file_convert(), handle_recordfile(), mixmonitor_save_prep(), record_exec(), and recordthread().

◆ ast_writestream()

int ast_writestream ( struct ast_filestream *  fs,
struct ast_frame *  f 
)

Writes a frame to a stream.

Parameters
fsfilestream to write to
fframe to write to the filestream Send a frame to a filestream – note: does NOT free the frame, call ast_frfree manually
Return values
0on success.
-1on failure.

Definition at line 265 of file file.c.

266{
267 int res = -1;
268 if (f->frametype == AST_FRAME_VIDEO) {
270 /* This is the audio portion. Call the video one... */
271 if (!fs->vfs && fs->filename) {
272 const char *type = ast_format_get_name(f->subclass.format);
273 fs->vfs = ast_writefile(fs->filename, type, NULL, fs->flags, 0, fs->mode);
274 ast_debug(1, "Opened video output file\n");
275 }
276 if (fs->vfs)
277 return ast_writestream(fs->vfs, f);
278 /* else ignore */
279 return 0;
280 }
281 } else if (f->frametype != AST_FRAME_VOICE) {
282 ast_log(LOG_WARNING, "Tried to write non-voice frame\n");
283 return -1;
284 }
286 res = fs->fmt->write(fs, f);
287 if (res < 0)
288 ast_log(LOG_WARNING, "Natural write failed\n");
289 else if (res > 0)
290 ast_log(LOG_WARNING, "Huh??\n");
291 } else {
292 /* XXX If they try to send us a type of frame that isn't the normal frame, and isn't
293 the one we've setup a translator for, we do the "wrong thing" XXX */
296 fs->trans = NULL;
297 }
298 if (!fs->trans) {
300 }
301 if (!fs->trans) {
302 ast_log(LOG_WARNING, "Unable to translate to format %s, source format %s\n",
304 } else {
305 struct ast_frame *trf;
307 /* Get the translated frame but don't consume the original in case they're using it on another stream */
308 if ((trf = ast_translate(fs->trans, f, 0))) {
309 struct ast_frame *cur;
310
311 /* the translator may have returned multiple frames, so process them */
312 for (cur = trf; cur; cur = AST_LIST_NEXT(cur, frame_list)) {
313 if ((res = fs->fmt->write(fs, cur))) {
314 ast_log(LOG_WARNING, "Translated frame write failed\n");
315 break;
316 }
317 }
318 ast_frfree(trf);
319 } else {
320 res = 0;
321 }
322 }
323 }
324 return res;
325}
#define ao2_replace(dst, src)
Replace one object reference with another cleaning up the original.
Definition astobj2.h:501
int ast_writestream(struct ast_filestream *fs, struct ast_frame *f)
Writes a frame to a stream.
Definition file.c:265
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.
Definition file.c:1527
enum ast_format_cmp_res ast_format_cmp(const struct ast_format *format1, const struct ast_format *format2)
Compare two formats.
Definition format.c:201
@ AST_FORMAT_CMP_EQUAL
Definition format.h:36
@ AST_FORMAT_CMP_NOT_EQUAL
Definition format.h:38
#define ast_frfree(fr)
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
struct ast_format * lastwriteformat
Definition mod_format.h:114
int(* write)(struct ast_filestream *, struct ast_frame *)
Definition mod_format.h:66
char name[80]
Definition mod_format.h:44
struct ast_format * format
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
enum ast_frame_type frametype
struct ast_frame * ast_translate(struct ast_trans_pvt *tr, struct ast_frame *f, int consume)
translates one or more frames Apply an input frame into the translator and receive zero or one output...
Definition translate.c:623
void ast_translator_free_path(struct ast_trans_pvt *tr)
Frees a translator path Frees the given translator path structure.
Definition translate.c:533
struct ast_trans_pvt * ast_translator_build_path(struct ast_format *dest, struct ast_format *source)
Builds a translator path Build a path (possibly NULL) from source to dest.
Definition translate.c:543

References ao2_replace, ast_debug, ast_format_cmp(), AST_FORMAT_CMP_EQUAL, AST_FORMAT_CMP_NOT_EQUAL, ast_format_get_name(), ast_format_get_type(), AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_frfree, AST_LIST_NEXT, ast_log, AST_MEDIA_TYPE_AUDIO, ast_translate(), ast_translator_build_path(), ast_translator_free_path(), ast_writefile(), ast_writestream(), ast_filestream::filename, ast_filestream::flags, ast_filestream::fmt, ast_frame_subclass::format, ast_format_def::format, ast_frame::frametype, ast_filestream::lastwriteformat, LOG_WARNING, ast_filestream::mode, ast_format_def::name, NULL, ast_frame::subclass, ast_filestream::trans, type, ast_filestream::vfs, and ast_format_def::write.

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