[asterisk-commits] file: branch group/media_formats r407424 - in /team/group/media_formats: apps...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Feb 5 11:36:44 CST 2014
Author: file
Date: Wed Feb 5 11:36:36 2014
New Revision: 407424
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=407424
Log:
Knock out almost all applications.
Modified:
team/group/media_formats/apps/app_amd.c
team/group/media_formats/apps/app_chanspy.c
team/group/media_formats/apps/app_dahdibarge.c
team/group/media_formats/apps/app_dictate.c
team/group/media_formats/apps/app_festival.c
team/group/media_formats/apps/app_ices.c
team/group/media_formats/apps/app_mixmonitor.c
team/group/media_formats/apps/app_mp3.c
team/group/media_formats/apps/app_nbscat.c
team/group/media_formats/apps/app_originate.c
team/group/media_formats/apps/app_record.c
team/group/media_formats/apps/app_sms.c
team/group/media_formats/apps/app_speech_utils.c
team/group/media_formats/apps/app_talkdetect.c
team/group/media_formats/apps/app_test.c
team/group/media_formats/apps/app_voicemail.c
team/group/media_formats/apps/app_waitforsilence.c
team/group/media_formats/include/asterisk/format_cache.h
team/group/media_formats/include/asterisk/mod_format.h
team/group/media_formats/include/asterisk/rtp_engine.h
team/group/media_formats/main/format_cache.c
Modified: team/group/media_formats/apps/app_amd.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_amd.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_amd.c (original)
+++ team/group/media_formats/apps/app_amd.c Wed Feb 5 11:36:36 2014
@@ -164,7 +164,7 @@
struct ast_frame *f = NULL;
struct ast_dsp *silenceDetector = NULL;
int dspsilence = 0, framelength = 0;
- struct ast_format *readFormat;
+ RAII_VAR(struct ast_format *, readFormat, NULL, ao2_cleanup);
int inInitialSilence = 1;
int inGreeting = 0;
int voiceDuration = 0;
@@ -414,7 +414,6 @@
/* Restore channel read format */
if (readFormat && ast_set_read_format(chan, readFormat))
ast_log(LOG_WARNING, "AMD: Unable to restore read format on '%s'\n", ast_channel_name(chan));
- ao2_cleanup(readFormat);
/* Free the DSP used to detect silence */
ast_dsp_free(silenceDetector);
Modified: team/group/media_formats/apps/app_chanspy.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_chanspy.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_chanspy.c (original)
+++ team/group/media_formats/apps/app_chanspy.c Wed Feb 5 11:36:36 2014
@@ -1120,7 +1120,7 @@
.volume = '#',
.exit = '\0',
};
- struct ast_format *oldwf;
+ RAII_VAR(struct ast_format *, oldwf, NULL, ao2_cleanup);
int volfactor = 0;
int res;
char *mailbox = NULL;
@@ -1219,7 +1219,6 @@
if (oldwf && ast_set_write_format(chan, oldwf) < 0)
ast_log(LOG_ERROR, "Could Not Set Write Format.\n");
- ao2_cleanup(oldwf);
if (ast_test_flag(&flags, OPTION_EXITONHANGUP)) {
ast_verb(3, "Stopped spying due to the spied-on channel hanging up.\n");
@@ -1240,7 +1239,7 @@
.volume = '#',
.exit = '\0',
};
- struct ast_format *oldwf;
+ RAII_VAR(struct ast_format *, oldwf, NULL, ao2_cleanup);
int volfactor = 0;
int res;
char *mailbox = NULL;
@@ -1345,7 +1344,6 @@
if (oldwf && ast_set_write_format(chan, oldwf) < 0)
ast_log(LOG_ERROR, "Could Not Set Write Format.\n");
- ao2_cleanup(oldwf);
return res;
}
@@ -1376,6 +1374,7 @@
oldwf = ast_format_copy(ast_channel_writeformat(chan));
if (ast_set_write_format(chan, ast_format_slin) < 0) {
ast_log(LOG_ERROR, "Could Not Set Write Format.\n");
+ ao2_cleanup(oldwf);
return -1;
}
Modified: team/group/media_formats/apps/app_dahdibarge.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_dahdibarge.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_dahdibarge.c (original)
+++ team/group/media_formats/apps/app_dahdibarge.c Wed Feb 5 11:36:36 2014
@@ -54,6 +54,7 @@
#include "asterisk/cli.h"
#include "asterisk/say.h"
#include "asterisk/utils.h"
+#include "asterisk/format_cache.h"
/*** DOCUMENTATION
<application name="DAHDIBarge" language="en_US">
@@ -116,13 +117,13 @@
char *buf = __buf + AST_FRIENDLY_OFFSET;
/* Set it into U-law mode (write) */
- if (ast_set_write_format_by_id(chan, AST_FORMAT_ULAW) < 0) {
+ if (ast_set_write_format(chan, ast_format_ulaw) < 0) {
ast_log(LOG_WARNING, "Unable to set '%s' to write ulaw mode\n", ast_channel_name(chan));
goto outrun;
}
/* Set it into U-law mode (read) */
- if (ast_set_read_format_by_id(chan, AST_FORMAT_ULAW) < 0) {
+ if (ast_set_read_format(chan, ast_format_ulaw) < 0) {
ast_log(LOG_WARNING, "Unable to set '%s' to read ulaw mode\n", ast_channel_name(chan));
goto outrun;
}
@@ -217,11 +218,11 @@
break;
} else if (fd != ast_channel_fd(chan, 0)) {
if (f->frametype == AST_FRAME_VOICE) {
- if (f->subclass.format.id == AST_FORMAT_ULAW) {
+ if (ast_format_cmp(f->subclass.format, ast_format_ulaw) == AST_FORMAT_CMP_EQUAL) {
/* Carefully write */
careful_write(fd, f->data.ptr, f->datalen);
} else
- ast_log(LOG_WARNING, "Huh? Got a non-ulaw (%s) frame in the conference\n", ast_getformatname(&f->subclass.format));
+ ast_log(LOG_WARNING, "Huh? Got a non-ulaw (%s) frame in the conference\n", f->subclass.format->codec->name);
}
}
ast_frfree(f);
@@ -230,7 +231,7 @@
if (res > 0) {
memset(&fr, 0, sizeof(fr));
fr.frametype = AST_FRAME_VOICE;
- ast_format_set(&fr.subclass.format, AST_FORMAT_ULAW, 0);
+ fr.subclass.format = ast_format_copy(ast_format_ulaw);
fr.datalen = res;
fr.samples = res;
fr.data.ptr = buf;
@@ -239,6 +240,7 @@
ast_log(LOG_WARNING, "Unable to write frame to channel: %s\n", strerror(errno));
/* break; */
}
+ ast_frfree(&fr);
} else
ast_log(LOG_WARNING, "Failed to read frame: %s\n", strerror(errno));
}
Modified: team/group/media_formats/apps/app_dictate.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_dictate.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_dictate.c (original)
+++ team/group/media_formats/apps/app_dictate.c Wed Feb 5 11:36:36 2014
@@ -129,6 +129,7 @@
oldr = ast_format_copy(ast_channel_readformat(chan));
if ((res = ast_set_read_format(chan, ast_format_slin)) < 0) {
ast_log(LOG_WARNING, "Unable to set to linear mode.\n");
+ ao2_cleanup(oldr);
return -1;
}
Modified: team/group/media_formats/apps/app_festival.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_festival.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_festival.c (original)
+++ team/group/media_formats/apps/app_festival.c Wed Feb 5 11:36:36 2014
@@ -203,6 +203,7 @@
res = ast_set_write_format(chan, ast_format_slin);
if (res < 0) {
ast_log(LOG_WARNING, "Unable to set write format to signed linear\n");
+ ao2_cleanup(owriteformat);
return -1;
}
Modified: team/group/media_formats/apps/app_ices.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_ices.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_ices.c (original)
+++ team/group/media_formats/apps/app_ices.c Wed Feb 5 11:36:36 2014
@@ -151,6 +151,7 @@
close(fds[0]);
close(fds[1]);
ast_log(LOG_WARNING, "Unable to set write format to signed linear\n");
+ ao2_cleanup(oreadformat);
return -1;
}
if (((char *)data)[0] == '/')
Modified: team/group/media_formats/apps/app_mixmonitor.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_mixmonitor.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_mixmonitor.c (original)
+++ team/group/media_formats/apps/app_mixmonitor.c Wed Feb 5 11:36:36 2014
@@ -57,6 +57,7 @@
#include "asterisk/linkedlists.h"
#include "asterisk/test.h"
#include "asterisk/mixmonitor.h"
+#include "asterisk/format_cache.h"
/*** DOCUMENTATION
<application name="MixMonitor" language="en_US">
@@ -582,7 +583,7 @@
*errflag = 1;
} else {
struct ast_filestream *tmp = *fs;
- mixmonitor->mixmonitor_ds->samp_rate = MAX(mixmonitor->mixmonitor_ds->samp_rate, ast_format_rate(&tmp->fmt->format));
+ mixmonitor->mixmonitor_ds->samp_rate = MAX(mixmonitor->mixmonitor_ds->samp_rate, tmp->fmt->format->codec->sample_rate);
}
}
}
@@ -601,7 +602,7 @@
unsigned int oflags;
int errflag = 0;
- struct ast_format format_slin;
+ struct ast_format *format_slin;
/* Keep callid association before any log messages */
if (mixmonitor->callid) {
@@ -619,10 +620,9 @@
mixmonitor_save_prep(mixmonitor, mixmonitor->filename_read, fs_read, &oflags, &errflag, &fs_read_ext);
mixmonitor_save_prep(mixmonitor, mixmonitor->filename_write, fs_write, &oflags, &errflag, &fs_write_ext);
- ast_format_set(&format_slin, ast_format_slin_by_rate(mixmonitor->mixmonitor_ds->samp_rate), 0);
+ format_slin = ast_format_cache_get_slin_by_rate(mixmonitor->mixmonitor_ds->samp_rate);
ast_mutex_unlock(&mixmonitor->mixmonitor_ds->lock);
-
/* The audiohook must enter and exit the loop locked */
ast_audiohook_lock(&mixmonitor->audiohook);
@@ -631,7 +631,7 @@
struct ast_frame *fr_read = NULL;
struct ast_frame *fr_write = NULL;
- if (!(fr = ast_audiohook_read_frame_all(&mixmonitor->audiohook, SAMPLES_PER_FRAME, &format_slin,
+ if (!(fr = ast_audiohook_read_frame_all(&mixmonitor->audiohook, SAMPLES_PER_FRAME, format_slin,
&fr_read, &fr_write))) {
ast_audiohook_trigger_wait(&mixmonitor->audiohook);
@@ -711,6 +711,8 @@
ast_cond_wait(&mixmonitor->mixmonitor_ds->destruction_condition, &mixmonitor->mixmonitor_ds->lock);
}
ast_mutex_unlock(&mixmonitor->mixmonitor_ds->lock);
+
+ ao2_ref(format_slin, -1);
/* kill the audiohook */
destroy_monitor_audiohook(mixmonitor);
Modified: team/group/media_formats/apps/app_mp3.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_mp3.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_mp3.c (original)
+++ team/group/media_formats/apps/app_mp3.c Wed Feb 5 11:36:36 2014
@@ -47,6 +47,7 @@
#include "asterisk/module.h"
#include "asterisk/translate.h"
#include "asterisk/app.h"
+#include "asterisk/format_cache.h"
#define LOCAL_MPG_123 "/usr/local/bin/mpg123"
#define MPG_123 "/usr/bin/mpg123"
@@ -143,7 +144,7 @@
int fds[2];
int ms = -1;
int pid = -1;
- struct ast_format owriteformat;
+ RAII_VAR(struct ast_format *, owriteformat, NULL, ao2_cleanup);
int timeout = 2000;
struct timeval next;
struct ast_frame *f;
@@ -155,7 +156,6 @@
.f = { 0, },
};
- ast_format_clear(&owriteformat);
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "MP3 Playback requires an argument (filename)\n");
return -1;
@@ -168,12 +168,21 @@
ast_stopstream(chan);
- ast_format_copy(&owriteformat, ast_channel_writeformat(chan));
- res = ast_set_write_format_by_id(chan, AST_FORMAT_SLINEAR);
+ owriteformat = ast_format_copy(ast_channel_writeformat(chan));
+ res = ast_set_write_format(chan, ast_format_slin);
if (res < 0) {
ast_log(LOG_WARNING, "Unable to set write format to signed linear\n");
return -1;
}
+
+ myf.f.frametype = AST_FRAME_VOICE;
+ myf.f.subclass.format = ast_format_copy(ast_format_slin);
+ myf.f.mallocd = 0;
+ myf.f.offset = AST_FRIENDLY_OFFSET;
+ myf.f.src = __PRETTY_FUNCTION__;
+ myf.f.delivery.tv_sec = 0;
+ myf.f.delivery.tv_usec = 0;
+ myf.f.data.ptr = myf.frdata;
res = mp3play(data, fds[1]);
if (!strncasecmp(data, "http://", 7)) {
@@ -191,16 +200,8 @@
if (ms <= 0) {
res = timed_read(fds[0], myf.frdata, sizeof(myf.frdata), timeout);
if (res > 0) {
- myf.f.frametype = AST_FRAME_VOICE;
- ast_format_set(&myf.f.subclass.format, AST_FORMAT_SLINEAR, 0);
myf.f.datalen = res;
myf.f.samples = res / 2;
- myf.f.mallocd = 0;
- myf.f.offset = AST_FRIENDLY_OFFSET;
- myf.f.src = __PRETTY_FUNCTION__;
- myf.f.delivery.tv_sec = 0;
- myf.f.delivery.tv_usec = 0;
- myf.f.data.ptr = myf.frdata;
if (ast_write(chan, &myf.f) < 0) {
res = -1;
break;
@@ -241,8 +242,10 @@
if (pid > -1)
kill(pid, SIGKILL);
- if (!res && owriteformat.id)
- ast_set_write_format(chan, &owriteformat);
+ if (!res && owriteformat)
+ ast_set_write_format(chan, owriteformat);
+
+ ast_frfree(&myf.f);
return res;
}
Modified: team/group/media_formats/apps/app_nbscat.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_nbscat.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_nbscat.c (original)
+++ team/group/media_formats/apps/app_nbscat.c Wed Feb 5 11:36:36 2014
@@ -46,6 +46,7 @@
#include "asterisk/module.h"
#include "asterisk/translate.h"
#include "asterisk/app.h"
+#include "asterisk/format_cache.h"
/*** DOCUMENTATION
<application name="NBScat" language="en_US">
@@ -115,7 +116,7 @@
int fds[2];
int ms = -1;
int pid = -1;
- struct ast_format owriteformat;
+ struct ast_format *owriteformat;
struct timeval next;
struct ast_frame *f;
struct myframe {
@@ -124,7 +125,6 @@
short frdata[160];
} myf;
- ast_format_clear(&owriteformat);
if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds)) {
ast_log(LOG_WARNING, "Unable to create socketpair\n");
return -1;
@@ -132,12 +132,22 @@
ast_stopstream(chan);
- ast_format_copy(&owriteformat, ast_channel_writeformat(chan));
- res = ast_set_write_format_by_id(chan, AST_FORMAT_SLINEAR);
+ owriteformat = ast_format_copy(ast_channel_writeformat(chan));
+ res = ast_set_write_format(chan, ast_format_slin);
if (res < 0) {
ast_log(LOG_WARNING, "Unable to set write format to signed linear\n");
+ ao2_cleanup(owriteformat);
return -1;
}
+
+ myf.f.frametype = AST_FRAME_VOICE;
+ myf.f.subclass.format = ast_format_copy(ast_format_slin);
+ myf.f.mallocd = 0;
+ myf.f.offset = AST_FRIENDLY_OFFSET;
+ myf.f.src = __PRETTY_FUNCTION__;
+ myf.f.delivery.tv_sec = 0;
+ myf.f.delivery.tv_usec = 0;
+ myf.f.data.ptr = myf.frdata;
res = NBScatplay(fds[1]);
/* Wait 1000 ms first */
@@ -152,16 +162,8 @@
if (ms <= 0) {
res = timed_read(fds[0], myf.frdata, sizeof(myf.frdata));
if (res > 0) {
- myf.f.frametype = AST_FRAME_VOICE;
- ast_format_set(&myf.f.subclass.format, AST_FORMAT_SLINEAR, 0);
myf.f.datalen = res;
myf.f.samples = res / 2;
- myf.f.mallocd = 0;
- myf.f.offset = AST_FRIENDLY_OFFSET;
- myf.f.src = __PRETTY_FUNCTION__;
- myf.f.delivery.tv_sec = 0;
- myf.f.delivery.tv_usec = 0;
- myf.f.data.ptr = myf.frdata;
if (ast_write(chan, &myf.f) < 0) {
res = -1;
break;
@@ -199,11 +201,13 @@
}
close(fds[0]);
close(fds[1]);
+ ast_frfree(&myf.f);
if (pid > -1)
kill(pid, SIGKILL);
- if (!res && owriteformat.id)
- ast_set_write_format(chan, &owriteformat);
+ if (!res && owriteformat)
+ ast_set_write_format(chan, owriteformat);
+ ao2_cleanup(owriteformat);
return res;
}
Modified: team/group/media_formats/apps/app_originate.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_originate.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_originate.c (original)
+++ team/group/media_formats/apps/app_originate.c Wed Feb 5 11:36:36 2014
@@ -45,6 +45,7 @@
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/app.h"
+#include "asterisk/format_cache.h"
static const char app_originate[] = "Originate";
@@ -112,22 +113,22 @@
int outgoing_status = 0;
unsigned int timeout = 30;
static const char default_exten[] = "s";
- struct ast_format tmpfmt;
- struct ast_format_cap *cap_slin = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_NOLOCK);
+ struct ast_format_cap *cap_slin = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
ast_autoservice_start(chan);
if (!cap_slin) {
goto return_cleanup;
}
- ast_format_cap_add(cap_slin, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR, 0));
- ast_format_cap_add(cap_slin, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR12, 0));
- ast_format_cap_add(cap_slin, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR16, 0));
- ast_format_cap_add(cap_slin, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR24, 0));
- ast_format_cap_add(cap_slin, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR32, 0));
- ast_format_cap_add(cap_slin, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR44, 0));
- ast_format_cap_add(cap_slin, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR48, 0));
- ast_format_cap_add(cap_slin, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR96, 0));
- ast_format_cap_add(cap_slin, ast_format_set(&tmpfmt, AST_FORMAT_SLINEAR192, 0));
+
+ ast_format_cap_add(cap_slin, ast_format_slin, 0);
+ ast_format_cap_add(cap_slin, ast_format_slin12, 0);
+ ast_format_cap_add(cap_slin, ast_format_slin16, 0);
+ ast_format_cap_add(cap_slin, ast_format_slin24, 0);
+ ast_format_cap_add(cap_slin, ast_format_slin32, 0);
+ ast_format_cap_add(cap_slin, ast_format_slin44, 0);
+ ast_format_cap_add(cap_slin, ast_format_slin48, 0);
+ ast_format_cap_add(cap_slin, ast_format_slin96, 0);
+ ast_format_cap_add(cap_slin, ast_format_slin192, 0);
if (ast_strlen_zero(data)) {
ast_log(LOG_ERROR, "Originate() requires arguments\n");
@@ -222,7 +223,7 @@
break;
}
}
- cap_slin = ast_format_cap_destroy(cap_slin);
+ ao2_cleanup(cap_slin);
ast_autoservice_stop(chan);
return res;
Modified: team/group/media_formats/apps/app_record.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_record.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_record.c (original)
+++ team/group/media_formats/apps/app_record.c Wed Feb 5 11:36:36 2014
@@ -39,6 +39,7 @@
#include "asterisk/app.h"
#include "asterisk/channel.h"
#include "asterisk/dsp.h" /* use dsp routines for silence detection */
+#include "asterisk/format_cache.h"
/*** DOCUMENTATION
<application name="Record" language="en_US">
@@ -158,7 +159,7 @@
int maxduration = 0; /* max duration of recording in milliseconds */
int gottimeout = 0; /* did we timeout for maxduration exceeded? */
int terminator = '#';
- struct ast_format rfmt;
+ RAII_VAR(struct ast_format *, rfmt, NULL, ao2_cleanup);
int ioflags;
struct ast_silence_generator *silgen = NULL;
struct ast_flags flags = { 0, };
@@ -170,8 +171,6 @@
);
int ms;
struct timeval start;
-
- ast_format_clear(&rfmt);
/* The next few lines of code parse out the filename and header from the input string */
if (ast_strlen_zero(data)) { /* no data implies no filename or anything is present */
@@ -293,8 +292,8 @@
/* The end of beep code. Now the recording starts */
if (silence > 0) {
- ast_format_copy(&rfmt, ast_channel_readformat(chan));
- res = ast_set_read_format_by_id(chan, AST_FORMAT_SLINEAR);
+ rfmt = ast_format_copy(ast_channel_readformat(chan));
+ res = ast_set_read_format(chan, ast_format_slin);
if (res < 0) {
ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n");
pbx_builtin_setvar_helper(chan, "RECORD_STATUS", "ERROR");
@@ -422,8 +421,8 @@
ast_channel_stop_silence_generator(chan, silgen);
out:
- if ((silence > 0) && rfmt.id) {
- res = ast_set_read_format(chan, &rfmt);
+ if ((silence > 0) && rfmt) {
+ res = ast_set_read_format(chan, rfmt);
if (res) {
ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", ast_channel_name(chan));
}
Modified: team/group/media_formats/apps/app_sms.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_sms.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_sms.c (original)
+++ team/group/media_formats/apps/app_sms.c Wed Feb 5 11:36:36 2014
@@ -56,6 +56,7 @@
#include "asterisk/callerid.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
+#include "asterisk/format_cache.h"
/*** DOCUMENTATION
<application name="SMS" language="en_US">
@@ -140,11 +141,11 @@
static unsigned char wavea[80];
typedef unsigned char output_t;
static const output_t *wave_out = wavea; /* outgoing samples */
-#define __OUT_FMT AST_FORMAT_ALAW;
+#define __OUT_FMT ast_format_alaw
#else
typedef signed short output_t;
static const output_t *wave_out = wave; /* outgoing samples */
-#define __OUT_FMT AST_FORMAT_SLINEAR
+#define __OUT_FMT ast_format_slin
#endif
#define OSYNC_BITS 80 /* initial sync bits */
@@ -1597,7 +1598,7 @@
#define MAXSAMPLES (800)
output_t *buf;
sms_t *h = data;
- int i;
+ int i, res;
if (samples > MAXSAMPLES) {
ast_log(LOG_WARNING, "Only doing %d samples (%d requested)\n",
@@ -1608,7 +1609,7 @@
buf = ast_alloca(len);
f.frametype = AST_FRAME_VOICE;
- ast_format_set(&f.subclass.format, __OUT_FMT, 0);
+ f.subclass.format = ast_format_copy(__OUT_FMT);
f.datalen = samples * sizeof(*buf);
f.offset = AST_FRIENDLY_OFFSET;
f.mallocd = 0;
@@ -1658,7 +1659,9 @@
}
}
}
- if (ast_write(chan, &f) < 0) {
+ res = ast_write(chan, &f);
+ ast_frfree(&f);
+ if (res < 0) {
ast_log(LOG_WARNING, "Failed to write frame to '%s': %s\n", ast_channel_name(chan), strerror(errno));
return -1;
}
@@ -2006,9 +2009,9 @@
sms_messagetx(&h);
}
- res = ast_set_write_format_by_id(chan, __OUT_FMT);
+ res = ast_set_write_format(chan, __OUT_FMT);
if (res >= 0) {
- res = ast_set_read_format_by_id(chan, AST_FORMAT_SLINEAR);
+ res = ast_set_read_format(chan, ast_format_slin);
}
if (res < 0) {
ast_log(LOG_ERROR, "Unable to set to linear mode, giving up\n");
Modified: team/group/media_formats/apps/app_speech_utils.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_speech_utils.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_speech_utils.c (original)
+++ team/group/media_formats/apps/app_speech_utils.c Wed Feb 5 11:36:36 2014
@@ -668,7 +668,7 @@
int res = 0, done = 0, started = 0, quieted = 0, max_dtmf_len = 0;
struct ast_speech *speech = find_speech(chan);
struct ast_frame *f = NULL;
- struct ast_format oldreadformat;
+ RAII_VAR(struct ast_format *, oldreadformat, NULL, ao2_cleanup);
char dtmf[AST_MAX_EXTENSION] = "";
struct timeval start = { 0, 0 }, current;
struct ast_datastore *datastore = NULL;
@@ -684,7 +684,6 @@
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
- ast_format_clear(&oldreadformat);
if (speech == NULL)
return -1;
@@ -700,7 +699,7 @@
}
/* Record old read format */
- ast_format_copy(&oldreadformat, ast_channel_readformat(chan));
+ oldreadformat = ast_format_copy(ast_channel_readformat(chan));
/* Change read format to be signed linear */
if (ast_set_read_format(chan, &speech->format))
@@ -908,7 +907,7 @@
ast_channel_datastore_remove(chan, datastore);
} else {
/* Channel is okay so restore read format */
- ast_set_read_format(chan, &oldreadformat);
+ ast_set_read_format(chan, oldreadformat);
}
return 0;
Modified: team/group/media_formats/apps/app_talkdetect.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_talkdetect.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_talkdetect.c (original)
+++ team/group/media_formats/apps/app_talkdetect.c Wed Feb 5 11:36:36 2014
@@ -42,6 +42,8 @@
#include "asterisk/utils.h"
#include "asterisk/dsp.h"
#include "asterisk/app.h"
+#include "asterisk/format.h"
+#include "asterisk/format_cache.h"
/*** DOCUMENTATION
<application name="BackgroundDetect" language="en_US">
@@ -91,7 +93,7 @@
int analysistime = -1;
int continue_analysis = 1;
int x;
- struct ast_format origrformat;
+ RAII_VAR(struct ast_format *, origrformat, NULL, ao2_cleanup);
struct ast_dsp *dsp = NULL;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(filename);
@@ -101,7 +103,6 @@
AST_APP_ARG(analysistime);
);
- ast_format_clear(&origrformat);
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "BackgroundDetect requires an argument (filename)\n");
return -1;
@@ -131,8 +132,8 @@
}
}
- ast_format_copy(&origrformat, ast_channel_readformat(chan));
- if ((ast_set_read_format_by_id(chan, AST_FORMAT_SLINEAR))) {
+ origrformat = ast_format_copy(ast_channel_readformat(chan));
+ if ((ast_set_read_format(chan, ast_format_slin))) {
ast_log(LOG_WARNING, "Unable to set read format to linear!\n");
res = -1;
break;
@@ -187,7 +188,8 @@
ast_frfree(fr);
break;
}
- } else if ((fr->frametype == AST_FRAME_VOICE) && (fr->subclass.format.id == AST_FORMAT_SLINEAR) && continue_analysis) {
+ } else if ((fr->frametype == AST_FRAME_VOICE) &&
+ (ast_format_cmp(fr->subclass.format, ast_format_slin) == AST_FORMAT_CMP_EQUAL) && continue_analysis) {
int totalsilence;
int ms;
res = ast_dsp_silence(dsp, fr, &totalsilence);
@@ -233,9 +235,9 @@
} while (0);
if (res > -1) {
- if (origrformat.id && ast_set_read_format(chan, &origrformat)) {
+ if (origrformat && ast_set_read_format(chan, origrformat)) {
ast_log(LOG_WARNING, "Failed to restore read format for %s to %s\n",
- ast_channel_name(chan), ast_getformatname(&origrformat));
+ ast_channel_name(chan), origrformat->codec->name);
}
}
if (dsp) {
Modified: team/group/media_formats/apps/app_test.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_test.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_test.c (original)
+++ team/group/media_formats/apps/app_test.c Wed Feb 5 11:36:36 2014
@@ -44,6 +44,7 @@
#include "asterisk/app.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
+#include "asterisk/format_cache.h"
/*** DOCUMENTATION
<application name="TestServer" language="en_US">
@@ -91,11 +92,12 @@
short *foo;
struct timeval start;
struct ast_frame *f;
- struct ast_format rformat;
-
- ast_format_copy(&rformat, ast_channel_readformat(chan));
- if (ast_set_read_format_by_id(chan, AST_FORMAT_SLINEAR)) {
+ struct ast_format *rformat;
+
+ rformat = ast_format_copy(ast_channel_readformat(chan));
+ if (ast_set_read_format(chan, ast_format_slin)) {
ast_log(LOG_NOTICE, "Unable to set to linear mode!\n");
+ ao2_cleanup(rformat);
return -1;
}
start = ast_tvnow();
@@ -111,7 +113,8 @@
res = -1;
break;
}
- if ((f->frametype == AST_FRAME_VOICE) && (f->subclass.format.id == AST_FORMAT_SLINEAR)) {
+ if ((f->frametype == AST_FRAME_VOICE) &&
+ (ast_format_cmp(f->subclass.format, ast_format_slin) == AST_FORMAT_CMP_EQUAL)) {
foo = (short *)f->data.ptr;
for (x=0;x<f->samples;x++) {
noise += abs(foo[x]);
@@ -121,11 +124,13 @@
ast_frfree(f);
}
- if (rformat.id) {
- if (ast_set_read_format(chan, &rformat)) {
+ if (rformat) {
+ if (ast_set_read_format(chan, rformat)) {
ast_log(LOG_NOTICE, "Unable to restore original format!\n");
+ ao2_ref(rformat, -1);
return -1;
}
+ ao2_ref(rformat, -1);
}
if (res < 0)
return res;
Modified: team/group/media_formats/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_voicemail.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_voicemail.c (original)
+++ team/group/media_formats/apps/app_voicemail.c Wed Feb 5 11:36:36 2014
@@ -135,6 +135,7 @@
#include "asterisk/astobj2.h"
#include "asterisk/taskprocessor.h"
#include "asterisk/test.h"
+#include "asterisk/format_cache.h"
#ifdef ODBC_STORAGE
#include "asterisk/res_odbc.h"
@@ -6103,13 +6104,16 @@
if ((recording_fs = ast_readfile(recdata->recording_file, recdata->recording_ext, NULL, 0, 0, VOICEMAIL_DIR_MODE))) {
if (!ast_seekstream(recording_fs, 0, SEEK_END)) {
long framelength = ast_tellstream(recording_fs);
- struct ast_format result = {0,};
+ struct ast_format *result;
/* XXX This use of ast_getformatbyname seems incorrect here. The file extension does not necessarily correspond
* to the name of the format. For instance, if "raw" were passed in, I don't think ast_getformatbyname would
* find the slinear format
*/
- ast_getformatbyname(recdata->recording_ext, &result);
- duration = (int) (framelength / ast_format_rate(&result));
+ result = ast_format_cache_get(recdata->recording_ext);
+ if (result) {
+ duration = (int) (framelength / result->codec->sample_rate);
+ ao2_ref(result, -1);
+ }
}
}
@@ -13760,7 +13764,7 @@
struct ast_channel *test_channel1 = NULL;
int res = -1;
- struct ast_format_cap *nativeformats;
+ struct ast_format_cap *capabilities;
static const struct ast_channel_tech fake_tech = {
.write = fake_write,
@@ -13785,12 +13789,17 @@
}
/* normally this is done in the channel driver */
- ast_format_set(ast_channel_writeformat(test_channel1), AST_FORMAT_GSM, 0);
- nativeformats = ast_channel_nativeformats(test_channel1);
- ast_format_cap_add(nativeformats, ast_channel_writeformat(test_channel1));
- ast_format_set(ast_channel_rawwriteformat(test_channel1), AST_FORMAT_GSM, 0);
- ast_format_set(ast_channel_readformat(test_channel1), AST_FORMAT_GSM, 0);
- ast_format_set(ast_channel_rawreadformat(test_channel1), AST_FORMAT_GSM, 0);
+ capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
+ if (!capabilities) {
+ goto exit_vmsayname_test;
+ }
+ ast_format_cap_add(capabilities, ast_format_gsm, 0);
+ ast_channel_nativeformats_set(test_channel1, capabilities);
+ ao2_ref(capabilities, -1);
+ ast_channel_set_writeformat(test_channel1, ast_format_gsm);
+ ast_channel_set_rawwriteformat(test_channel1, ast_format_gsm);
+ ast_channel_set_readformat(test_channel1, ast_format_gsm);
+ ast_channel_set_rawreadformat(test_channel1, ast_format_gsm);
ast_channel_tech_set(test_channel1, &fake_tech);
ast_channel_unlock(test_channel1);
Modified: team/group/media_formats/apps/app_waitforsilence.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/apps/app_waitforsilence.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/apps/app_waitforsilence.c (original)
+++ team/group/media_formats/apps/app_waitforsilence.c Wed Feb 5 11:36:36 2014
@@ -51,6 +51,7 @@
#include "asterisk/pbx.h"
#include "asterisk/dsp.h"
#include "asterisk/module.h"
+#include "asterisk/format_cache.h"
/*** DOCUMENTATION
<application name="WaitForSilence" language="en_US">
@@ -129,7 +130,7 @@
static int do_waiting(struct ast_channel *chan, int timereqd, time_t waitstart, int timeout, int wait_for_silence) {
struct ast_frame *f = NULL;
int dsptime = 0;
- struct ast_format rfmt;
+ RAII_VAR(struct ast_format *, rfmt, NULL, ao2_cleanup);
int res = 0;
struct ast_dsp *sildet; /* silence detector dsp */
time_t now;
@@ -138,8 +139,8 @@
int (*ast_dsp_func)(struct ast_dsp*, struct ast_frame*, int*) =
wait_for_silence ? ast_dsp_silence : ast_dsp_noise;
- ast_format_copy(&rfmt, ast_channel_readformat(chan)); /* Set to linear mode */
- if ((res = ast_set_read_format_by_id(chan, AST_FORMAT_SLINEAR)) < 0) {
+ rfmt = ast_format_copy(ast_channel_readformat(chan));
+ if ((res = ast_set_read_format(chan, ast_format_slin)) < 0) {
ast_log(LOG_WARNING, "Unable to set channel to linear mode, giving up\n");
return -1;
}
@@ -199,8 +200,8 @@
}
- if (rfmt.id && ast_set_read_format(chan, &rfmt)) {
- ast_log(LOG_WARNING, "Unable to restore format %s to channel '%s'\n", ast_getformatname(&rfmt), ast_channel_name(chan));
+ if (rfmt && ast_set_read_format(chan, rfmt)) {
+ ast_log(LOG_WARNING, "Unable to restore format %s to channel '%s'\n", rfmt->codec->name, ast_channel_name(chan));
}
ast_dsp_free(sildet);
return res;
Modified: team/group/media_formats/include/asterisk/format_cache.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/include/asterisk/format_cache.h?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/include/asterisk/format_cache.h (original)
+++ team/group/media_formats/include/asterisk/format_cache.h Wed Feb 5 11:36:36 2014
@@ -29,9 +29,49 @@
struct ast_format;
/*!
- * \brief Built-in cached signed linear format.
+ * \brief Built-in cached signed linear 8kHz format.
*/
extern struct ast_format *ast_format_slin;
+
+/*!
+ * \brief Built-in cached signed linear 12kHz format.
+ */
+extern struct ast_format *ast_format_slin12;
+
+/*!
+ * \brief Built-in cached signed linear 16kHz format.
+ */
+extern struct ast_format *ast_format_slin16;
+
+/*!
+ * \brief Built-in cached signed linear 24kHz format.
+ */
+extern struct ast_format *ast_format_slin24;
+
+/*!
+ * \brief Built-in cached signed linear 32kHz format.
+ */
+extern struct ast_format *ast_format_slin32;
+
+/*!
+ * \brief Built-in cached signed linear 44kHz format.
+ */
+extern struct ast_format *ast_format_slin44;
+
+/*!
+ * \brief Built-in cached signed linear 48kHz format.
+ */
+extern struct ast_format *ast_format_slin48;
+
+/*!
+ * \brief Built-in cached signed linear 96kHz format.
+ */
+extern struct ast_format *ast_format_slin96;
+
+/*!
+ * \brief Built-in cached signed linear 192kHz format.
+ */
+extern struct ast_format *ast_format_slin192;
/*!
* \brief Built-in cached ulaw format.
@@ -39,9 +79,14 @@
extern struct ast_format *ast_format_ulaw;
/*!
- * \brief Builtin- cached alaw format.
+ * \brief Built-in cached alaw format.
*/
extern struct ast_format *ast_format_alaw;
+
+/*!
+ * \brief Built-in cached gsm format.
+ */
+extern struct ast_format *ast_format_gsm;
/*!
* \brief Initialize format cache support within the core.
@@ -75,4 +120,16 @@
*/
struct ast_format *ast_format_cache_get(const char *name);
+/*!
+ * \brief Retrieve the best signed linear format given a sample rate.
+ *
+ * \param rate The sample rate
+ *
+ * \return pointer to the signed linear format
+ *
+ * \note The returned format has its reference count incremented. It must be
+ * dropped using ao2_ref or ao2_cleanup.
+ */
+struct ast_format *ast_format_cache_get_slin_by_rate(unsigned int rate);
+
#endif /* _AST_FORMAT_CACHE_H */
Modified: team/group/media_formats/include/asterisk/mod_format.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/include/asterisk/mod_format.h?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/include/asterisk/mod_format.h (original)
+++ team/group/media_formats/include/asterisk/mod_format.h Wed Feb 5 11:36:36 2014
@@ -44,7 +44,7 @@
char name[80]; /*!< Name of format */
char exts[80]; /*!< Extensions (separated by | if more than one)
this format can read. First is assumed for writing (e.g. .mp3) */
- struct ast_format format; /*!< Format of frames it uses/provides (one only) */
+ struct ast_format *format; /*!< Format of frames it uses/provides (one only) */
/*!
* \brief Prepare an input stream for playback.
* \return 0 on success, -1 on error.
Modified: team/group/media_formats/include/asterisk/rtp_engine.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/include/asterisk/rtp_engine.h?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/include/asterisk/rtp_engine.h (original)
+++ team/group/media_formats/include/asterisk/rtp_engine.h Wed Feb 5 11:36:36 2014
@@ -504,8 +504,6 @@
void (*prop_set)(struct ast_rtp_instance *instance, enum ast_rtp_property property, int value);
/*! Callback for setting a payload. If asterisk is to be used, asterisk_format will be set, otherwise value in code is used. */
void (*payload_set)(struct ast_rtp_instance *instance, int payload, int asterisk_format, struct ast_format *format, int code);
- /*! Callback for setting packetization preferences */
- void (*packetization_set)(struct ast_rtp_instance *instance, struct ast_codec_pref *pref);
/*! Callback for setting the remote address that RTP is to be sent to */
void (*remote_address_set)(struct ast_rtp_instance *instance, struct ast_sockaddr *sa);
/*! Callback for changing DTMF mode */
@@ -554,8 +552,6 @@
struct ast_rtp_codecs {
/*! Payloads present */
struct ao2_container *payloads;
- /*! Codec packetization preferences */
- struct ast_codec_pref pref;
};
/*! Structure that represents the glue that binds an RTP instance to a channel */
@@ -1400,7 +1396,7 @@
*
* \since 1.8
*/
-void ast_rtp_codecs_packetization_set(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance, struct ast_codec_pref *prefs);
+void ast_rtp_codecs_packetization_set(struct ast_rtp_codecs *codecs, struct ast_rtp_instance *instance);
/*!
* \brief Begin sending a DTMF digit
Modified: team/group/media_formats/main/format_cache.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/main/format_cache.c?view=diff&rev=407424&r1=407423&r2=407424
==============================================================================
--- team/group/media_formats/main/format_cache.c (original)
+++ team/group/media_formats/main/format_cache.c Wed Feb 5 11:36:36 2014
@@ -178,4 +178,26 @@
ao2_ref(cached_format, -1);
return format;
+}
+
+struct ast_format *ast_format_cache_get_slin_by_rate(unsigned int rate)
+{
+ if (rate >= 192000) {
+ return ao2_bump(ast_format_slin192);
+ } else if (rate >= 96000) {
+ return ao2_bump(ast_format_slin96);
+ } else if (rate >= 48000) {
+ return ao2_bump(ast_format_slin48);
+ } else if (rate >= 44100) {
+ return ao2_bump(ast_format_slin44);
+ } else if (rate >= 32000) {
+ return ao2_bump(ast_format_slin32);
+ } else if (rate >= 24000) {
+ return ao2_bump(ast_format_slin24);
+ } else if (rate >= 16000) {
+ return ao2_bump(ast_format_slin16);
+ } else if (rate >= 12000) {
+ return ao2_bump(ast_format_slin12);
+ }
+ return ao2_bump(ast_format_slin);
}
More information about the asterisk-commits
mailing list