app_mixmonitor: Set MIXMONITOR_FILENAME to correct value when wav49 is used
When opening a file for writing, Asterisk silently converts filenames ending with 'wav49' to 'WAV.' We aren't taking that in to account when setting the MIXMONITOR_FILENAME variable in MixMonitor. * If the user wants to write to a wav49 file, make sure that it is reflected properly in MIXMONITOR_FILENAME. * Add a note to the documentation describing this behavior. * Add a note in main/file.c indicating that app_mixmonitor needs to be changed if the logic in build_filename was changed. ASTERISK-24798 #close Reported by: xrobau Change-Id: I384691ce624eb55c80a125b9ca206d2d691c574c
This commit is contained in:
parent
0d0f2b4569
commit
cd8b27dcc2
|
@ -154,6 +154,11 @@
|
|||
<para>This application does not automatically answer and should be preceeded by
|
||||
an application such as Answer or Progress().</para>
|
||||
<note><para>MixMonitor runs as an audiohook.</para></note>
|
||||
<note><para>If a filename passed to MixMonitor ends with
|
||||
<literal>.wav49</literal>, Asterisk will silently convert the extension to
|
||||
<literal>.WAV</literal> for legacy reasons. <variable>MIXMONITOR_FILENAME</variable>
|
||||
will contain the actual filename that Asterisk is writing to, not necessarily the
|
||||
value that was passed in.</para></note>
|
||||
<variablelist>
|
||||
<variable name="MIXMONITOR_FILENAME">
|
||||
<para>Will contain the filename used to record.</para>
|
||||
|
@ -998,17 +1003,35 @@ static int launch_monitor_thread(struct ast_channel *chan, const char *filename,
|
|||
static char *filename_parse(char *filename, char *buffer, size_t len)
|
||||
{
|
||||
char *slash;
|
||||
char *ext;
|
||||
|
||||
ast_assert(len > 0);
|
||||
|
||||
if (ast_strlen_zero(filename)) {
|
||||
ast_log(LOG_WARNING, "No file name was provided for a file save option.\n");
|
||||
} else if (filename[0] != '/') {
|
||||
char *build;
|
||||
build = ast_alloca(strlen(ast_config_AST_MONITOR_DIR) + strlen(filename) + 3);
|
||||
buffer[0] = 0;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/* If we don't have an absolute path, make one */
|
||||
if (*filename != '/') {
|
||||
char *build = ast_alloca(strlen(ast_config_AST_MONITOR_DIR) + strlen(filename) + 3);
|
||||
sprintf(build, "%s/%s", ast_config_AST_MONITOR_DIR, filename);
|
||||
filename = build;
|
||||
}
|
||||
|
||||
ast_copy_string(buffer, filename, len);
|
||||
|
||||
/* If the provided filename has a .wav49 extension, we need to convert it to .WAV to
|
||||
match the behavior of build_filename in main/file.c. Otherwise MIXMONITOR_FILENAME
|
||||
ends up referring to a file that does not/will not exist */
|
||||
ext = strrchr(buffer, '.');
|
||||
if (ext && !strcmp(ext, ".wav49")) {
|
||||
/* Change to WAV - we know we have at least 6 writeable bytes where 'ext' points,
|
||||
* so this is safe */
|
||||
memcpy(ext, ".WAV", sizeof(".WAV"));
|
||||
}
|
||||
|
||||
if ((slash = strrchr(filename, '/'))) {
|
||||
*slash = '\0';
|
||||
}
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
Subject: app_mixmonitor
|
||||
|
||||
If the 'filename' argument to MixMonitor() ended with '.wav49,'
|
||||
Asterisk would silently convert the extension to '.WAV' when opening
|
||||
the file for writing. This caused the MIXMONITOR_FILENAME variable to
|
||||
reference the wrong file. The MIXMONITOR_FILENAME variable will now
|
||||
reflect the name of the file that Asterisk actually used instead of
|
||||
the filename that was passed to the application.
|
|
@ -315,6 +315,8 @@ static char *build_filename(const char *filename, const char *ext)
|
|||
{
|
||||
char *fn = NULL;
|
||||
|
||||
/* The wav49 -> WAV translation is duplicated in apps/app_mixmonitor.c, so
|
||||
if you change it here you need to change it there as well */
|
||||
if (!strcmp(ext, "wav49"))
|
||||
ext = "WAV";
|
||||
|
||||
|
|
Loading…
Reference in New Issue