FS-5401 --resolve whitespace only
This commit is contained in:
parent
e75497c98d
commit
7ebb663ce6
|
@ -98,28 +98,28 @@ SWITCH_STANDARD_APP(avmd_start_function);
|
|||
|
||||
/*! Status of the beep detection */
|
||||
typedef enum {
|
||||
BEEP_DETECTED,
|
||||
BEEP_NOTDETECTED
|
||||
BEEP_DETECTED,
|
||||
BEEP_NOTDETECTED
|
||||
} avmd_beep_state_t;
|
||||
|
||||
/*! Data related to the current status of the beep */
|
||||
typedef struct {
|
||||
avmd_beep_state_t beep_state;
|
||||
size_t last_beep;
|
||||
avmd_beep_state_t beep_state;
|
||||
size_t last_beep;
|
||||
} avmd_state_t;
|
||||
|
||||
/*! Type that holds session information pertinent to the avmd module. */
|
||||
typedef struct {
|
||||
/*! Internal FreeSWITCH session. */
|
||||
switch_core_session_t *session;
|
||||
uint32_t rate;
|
||||
circ_buffer_t b;
|
||||
sma_buffer_t sma_b;
|
||||
sma_buffer_t sqa_b;
|
||||
size_t pos;
|
||||
double f;
|
||||
/* freq_table_t ft; */
|
||||
avmd_state_t state;
|
||||
/*! Internal FreeSWITCH session. */
|
||||
switch_core_session_t *session;
|
||||
uint32_t rate;
|
||||
circ_buffer_t b;
|
||||
sma_buffer_t sma_b;
|
||||
sma_buffer_t sqa_b;
|
||||
size_t pos;
|
||||
double f;
|
||||
/* freq_table_t ft; */
|
||||
avmd_state_t state;
|
||||
} avmd_session_t;
|
||||
|
||||
static void avmd_process(avmd_session_t *session, switch_frame_t *frame);
|
||||
|
@ -135,26 +135,26 @@ static void init_avmd_session_data(avmd_session_t *avmd_session, switch_core_se
|
|||
static void init_avmd_session_data(avmd_session_t *avmd_session, switch_core_session_t *fs_session)
|
||||
{
|
||||
/*! This is a worst case sample rate estimate */
|
||||
avmd_session->rate = 48000;
|
||||
INIT_CIRC_BUFFER(&avmd_session->b, BEEP_LEN(avmd_session->rate), FRAME_LEN(avmd_session->rate), fs_session);
|
||||
avmd_session->rate = 48000;
|
||||
INIT_CIRC_BUFFER(&avmd_session->b, BEEP_LEN(avmd_session->rate), FRAME_LEN(avmd_session->rate), fs_session);
|
||||
|
||||
avmd_session->session = fs_session;
|
||||
avmd_session->pos = 0;
|
||||
avmd_session->f = 0.0;
|
||||
avmd_session->state.last_beep = 0;
|
||||
avmd_session->state.beep_state = BEEP_NOTDETECTED;
|
||||
avmd_session->session = fs_session;
|
||||
avmd_session->pos = 0;
|
||||
avmd_session->f = 0.0;
|
||||
avmd_session->state.last_beep = 0;
|
||||
avmd_session->state.beep_state = BEEP_NOTDETECTED;
|
||||
|
||||
INIT_SMA_BUFFER(
|
||||
&avmd_session->sma_b,
|
||||
BEEP_LEN(avmd_session->rate) / SINE_LEN(avmd_session->rate),
|
||||
fs_session
|
||||
);
|
||||
INIT_SMA_BUFFER(
|
||||
&avmd_session->sma_b,
|
||||
BEEP_LEN(avmd_session->rate) / SINE_LEN(avmd_session->rate),
|
||||
fs_session
|
||||
);
|
||||
|
||||
INIT_SMA_BUFFER(
|
||||
&avmd_session->sqa_b,
|
||||
BEEP_LEN(avmd_session->rate) / SINE_LEN(avmd_session->rate),
|
||||
fs_session
|
||||
);
|
||||
INIT_SMA_BUFFER(
|
||||
&avmd_session->sqa_b,
|
||||
BEEP_LEN(avmd_session->rate) / SINE_LEN(avmd_session->rate),
|
||||
fs_session
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
@ -168,42 +168,42 @@ static void init_avmd_session_data(avmd_session_t *avmd_session, switch_core_se
|
|||
*/
|
||||
static switch_bool_t avmd_callback(switch_media_bug_t * bug, void *user_data, switch_abc_type_t type)
|
||||
{
|
||||
avmd_session_t *avmd_session;
|
||||
switch_codec_t *read_codec;
|
||||
switch_frame_t *frame;
|
||||
avmd_session_t *avmd_session;
|
||||
switch_codec_t *read_codec;
|
||||
switch_frame_t *frame;
|
||||
|
||||
|
||||
avmd_session = (avmd_session_t *) user_data;
|
||||
if (avmd_session == NULL) {
|
||||
return SWITCH_FALSE;
|
||||
}
|
||||
avmd_session = (avmd_session_t *) user_data;
|
||||
if (avmd_session == NULL) {
|
||||
return SWITCH_FALSE;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
switch (type) {
|
||||
|
||||
case SWITCH_ABC_TYPE_INIT:
|
||||
read_codec = switch_core_session_get_read_codec(avmd_session->session);
|
||||
avmd_session->rate = read_codec->implementation->samples_per_second;
|
||||
/* avmd_session->vmd_codec.channels = read_codec->implementation->number_of_channels; */
|
||||
break;
|
||||
case SWITCH_ABC_TYPE_INIT:
|
||||
read_codec = switch_core_session_get_read_codec(avmd_session->session);
|
||||
avmd_session->rate = read_codec->implementation->samples_per_second;
|
||||
/* avmd_session->vmd_codec.channels = read_codec->implementation->number_of_channels; */
|
||||
break;
|
||||
|
||||
case SWITCH_ABC_TYPE_READ_PING:
|
||||
case SWITCH_ABC_TYPE_CLOSE:
|
||||
case SWITCH_ABC_TYPE_READ:
|
||||
case SWITCH_ABC_TYPE_WRITE:
|
||||
case SWITCH_ABC_TYPE_TAP_NATIVE_READ:
|
||||
case SWITCH_ABC_TYPE_TAP_NATIVE_WRITE:
|
||||
break;
|
||||
case SWITCH_ABC_TYPE_READ_PING:
|
||||
case SWITCH_ABC_TYPE_CLOSE:
|
||||
case SWITCH_ABC_TYPE_READ:
|
||||
case SWITCH_ABC_TYPE_WRITE:
|
||||
case SWITCH_ABC_TYPE_TAP_NATIVE_READ:
|
||||
case SWITCH_ABC_TYPE_TAP_NATIVE_WRITE:
|
||||
break;
|
||||
|
||||
case SWITCH_ABC_TYPE_READ_REPLACE:
|
||||
frame = switch_core_media_bug_get_read_replace_frame(bug);
|
||||
avmd_process(avmd_session, frame);
|
||||
return SWITCH_TRUE;
|
||||
case SWITCH_ABC_TYPE_READ_REPLACE:
|
||||
frame = switch_core_media_bug_get_read_replace_frame(bug);
|
||||
avmd_process(avmd_session, frame);
|
||||
return SWITCH_TRUE;
|
||||
|
||||
case SWITCH_ABC_TYPE_WRITE_REPLACE:
|
||||
break;
|
||||
}
|
||||
case SWITCH_ABC_TYPE_WRITE_REPLACE:
|
||||
break;
|
||||
}
|
||||
|
||||
return SWITCH_TRUE;
|
||||
return SWITCH_TRUE;
|
||||
}
|
||||
|
||||
/*! \brief FreeSWITCH module loading function
|
||||
|
@ -214,40 +214,40 @@ static switch_bool_t avmd_callback(switch_media_bug_t * bug, void *user_data, sw
|
|||
SWITCH_MODULE_LOAD_FUNCTION(mod_avmd_load)
|
||||
{
|
||||
|
||||
switch_application_interface_t *app_interface;
|
||||
switch_api_interface_t *api_interface;
|
||||
/* connect my internal structure to the blank pointer passed to me */
|
||||
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
|
||||
switch_application_interface_t *app_interface;
|
||||
switch_api_interface_t *api_interface;
|
||||
/* connect my internal structure to the blank pointer passed to me */
|
||||
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
|
||||
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_LOG,
|
||||
SWITCH_LOG_NOTICE,
|
||||
"Advanced Voicemail detection enabled\n"
|
||||
);
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_LOG,
|
||||
SWITCH_LOG_NOTICE,
|
||||
"Advanced Voicemail detection enabled\n"
|
||||
);
|
||||
|
||||
#ifdef FASTMATH
|
||||
init_fast_acosf();
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_LOG,
|
||||
SWITCH_LOG_NOTICE,
|
||||
"Advanced Voicemail detection: fast math enabled\n"
|
||||
);
|
||||
init_fast_acosf();
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_LOG,
|
||||
SWITCH_LOG_NOTICE,
|
||||
"Advanced Voicemail detection: fast math enabled\n"
|
||||
);
|
||||
#endif
|
||||
|
||||
SWITCH_ADD_APP(
|
||||
app_interface,
|
||||
"avmd",
|
||||
"Beep detection",
|
||||
"Advanced detection of voicemail beeps",
|
||||
avmd_start_function,
|
||||
"[start] [stop]",
|
||||
SAF_NONE
|
||||
);
|
||||
SWITCH_ADD_APP(
|
||||
app_interface,
|
||||
"avmd",
|
||||
"Beep detection",
|
||||
"Advanced detection of voicemail beeps",
|
||||
avmd_start_function,
|
||||
"[start] [stop]",
|
||||
SAF_NONE
|
||||
);
|
||||
|
||||
SWITCH_ADD_API(api_interface, "avmd", "Voicemail beep detection", avmd_api_main, AVMD_SYNTAX);
|
||||
SWITCH_ADD_API(api_interface, "avmd", "Voicemail beep detection", avmd_api_main, AVMD_SYNTAX);
|
||||
|
||||
/* indicate that the module should continue to be loaded */
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
/* indicate that the module should continue to be loaded */
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*! \brief FreeSWITCH application handler function.
|
||||
|
@ -258,63 +258,63 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_avmd_load)
|
|||
*/
|
||||
SWITCH_STANDARD_APP(avmd_start_function)
|
||||
{
|
||||
switch_media_bug_t *bug;
|
||||
switch_status_t status;
|
||||
switch_channel_t *channel;
|
||||
avmd_session_t *avmd_session;
|
||||
switch_media_bug_t *bug;
|
||||
switch_status_t status;
|
||||
switch_channel_t *channel;
|
||||
avmd_session_t *avmd_session;
|
||||
|
||||
if (session == NULL)
|
||||
return;
|
||||
if (session == NULL)
|
||||
return;
|
||||
|
||||
channel = switch_core_session_get_channel(session);
|
||||
channel = switch_core_session_get_channel(session);
|
||||
|
||||
/* Is this channel already using avmd ? */
|
||||
bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_avmd_");
|
||||
/* If it is using avmd */
|
||||
if (bug != NULL) {
|
||||
/* If we have a stop remove audio bug */
|
||||
if (strcasecmp(data, "stop") == 0) {
|
||||
switch_channel_set_private(channel, "_avmd_", NULL);
|
||||
switch_core_media_bug_remove(session, &bug);
|
||||
return;
|
||||
}
|
||||
/* Is this channel already using avmd ? */
|
||||
bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_avmd_");
|
||||
/* If it is using avmd */
|
||||
if (bug != NULL) {
|
||||
/* If we have a stop remove audio bug */
|
||||
if (strcasecmp(data, "stop") == 0) {
|
||||
switch_channel_set_private(channel, "_avmd_", NULL);
|
||||
switch_core_media_bug_remove(session, &bug);
|
||||
return;
|
||||
}
|
||||
|
||||
/* We have already started */
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_SESSION_LOG(session),
|
||||
SWITCH_LOG_WARNING,
|
||||
"Cannot run 2 at once on the same channel!\n"
|
||||
);
|
||||
/* We have already started */
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_SESSION_LOG(session),
|
||||
SWITCH_LOG_WARNING,
|
||||
"Cannot run 2 at once on the same channel!\n"
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
avmd_session = (avmd_session_t *)switch_core_session_alloc(session, sizeof(avmd_session_t));
|
||||
avmd_session = (avmd_session_t *)switch_core_session_alloc(session, sizeof(avmd_session_t));
|
||||
|
||||
init_avmd_session_data(avmd_session, session);
|
||||
init_avmd_session_data(avmd_session, session);
|
||||
|
||||
status = switch_core_media_bug_add(
|
||||
session,
|
||||
"avmd",
|
||||
NULL,
|
||||
avmd_callback,
|
||||
avmd_session,
|
||||
0,
|
||||
SMBF_READ_REPLACE,
|
||||
&bug
|
||||
);
|
||||
status = switch_core_media_bug_add(
|
||||
session,
|
||||
"avmd",
|
||||
NULL,
|
||||
avmd_callback,
|
||||
avmd_session,
|
||||
0,
|
||||
SMBF_READ_REPLACE,
|
||||
&bug
|
||||
);
|
||||
|
||||
if (status != SWITCH_STATUS_SUCCESS) {
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_SESSION_LOG(session),
|
||||
SWITCH_LOG_ERROR,
|
||||
"Failure hooking to stream\n"
|
||||
);
|
||||
if (status != SWITCH_STATUS_SUCCESS) {
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_SESSION_LOG(session),
|
||||
SWITCH_LOG_ERROR,
|
||||
"Failure hooking to stream\n"
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
switch_channel_set_private(channel, "_avmd_", bug);
|
||||
switch_channel_set_private(channel, "_avmd_", bug);
|
||||
}
|
||||
|
||||
/*! \brief Called when the module shuts down
|
||||
|
@ -326,16 +326,16 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_avmd_shutdown)
|
|||
{
|
||||
|
||||
#ifdef FASTMATH
|
||||
destroy_fast_acosf();
|
||||
destroy_fast_acosf();
|
||||
#endif
|
||||
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_LOG,
|
||||
SWITCH_LOG_NOTICE,
|
||||
"Advanced Voicemail detection disabled\n"
|
||||
);
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_LOG,
|
||||
SWITCH_LOG_NOTICE,
|
||||
"Advanced Voicemail detection disabled\n"
|
||||
);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*! \brief FreeSWITCH API handler function.
|
||||
|
@ -347,127 +347,127 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_avmd_shutdown)
|
|||
*/
|
||||
SWITCH_STANDARD_API(avmd_api_main)
|
||||
{
|
||||
switch_core_session_t *fs_session = NULL;
|
||||
switch_media_bug_t *bug;
|
||||
avmd_session_t *avmd_session;
|
||||
switch_channel_t *channel;
|
||||
switch_status_t status;
|
||||
int argc;
|
||||
char *argv[AVMD_PARAMS];
|
||||
char *ccmd = NULL;
|
||||
char *uuid;
|
||||
char *command;
|
||||
switch_core_session_t *fs_session = NULL;
|
||||
switch_media_bug_t *bug;
|
||||
avmd_session_t *avmd_session;
|
||||
switch_channel_t *channel;
|
||||
switch_status_t status;
|
||||
int argc;
|
||||
char *argv[AVMD_PARAMS];
|
||||
char *ccmd = NULL;
|
||||
char *uuid;
|
||||
char *command;
|
||||
|
||||
/* No command? Display usage */
|
||||
if (zstr(cmd)) {
|
||||
stream->write_function(stream, "-USAGE: %s\n", AVMD_SYNTAX);
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
/* No command? Display usage */
|
||||
if (zstr(cmd)) {
|
||||
stream->write_function(stream, "-USAGE: %s\n", AVMD_SYNTAX);
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* Duplicated contents of original string */
|
||||
ccmd = strdup(cmd);
|
||||
/* Separate the arguments */
|
||||
argc = switch_separate_string(ccmd, ' ', argv, AVMD_PARAMS);
|
||||
/* Duplicated contents of original string */
|
||||
ccmd = strdup(cmd);
|
||||
/* Separate the arguments */
|
||||
argc = switch_separate_string(ccmd, ' ', argv, AVMD_PARAMS);
|
||||
|
||||
/* If we don't have the expected number of parameters
|
||||
* display usage */
|
||||
if (argc != AVMD_PARAMS) {
|
||||
stream->write_function(stream, "-USAGE: %s\n", AVMD_SYNTAX);
|
||||
goto end;
|
||||
}
|
||||
/* If we don't have the expected number of parameters
|
||||
* display usage */
|
||||
if (argc != AVMD_PARAMS) {
|
||||
stream->write_function(stream, "-USAGE: %s\n", AVMD_SYNTAX);
|
||||
goto end;
|
||||
}
|
||||
|
||||
uuid = argv[0];
|
||||
command = argv[1];
|
||||
uuid = argv[0];
|
||||
command = argv[1];
|
||||
|
||||
/* using uuid locate a reference to the FreeSWITCH session */
|
||||
fs_session = switch_core_session_locate(uuid);
|
||||
/* using uuid locate a reference to the FreeSWITCH session */
|
||||
fs_session = switch_core_session_locate(uuid);
|
||||
|
||||
/* If the session was not found exit */
|
||||
if (fs_session == NULL) {
|
||||
stream->write_function(stream, "-USAGE: %s\n", AVMD_SYNTAX);
|
||||
goto end;
|
||||
}
|
||||
/* If the session was not found exit */
|
||||
if (fs_session == NULL) {
|
||||
stream->write_function(stream, "-USAGE: %s\n", AVMD_SYNTAX);
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Get current channel of the session to tag the session
|
||||
* This indicates that our module is present */
|
||||
channel = switch_core_session_get_channel(fs_session);
|
||||
/* Get current channel of the session to tag the session
|
||||
* This indicates that our module is present */
|
||||
channel = switch_core_session_get_channel(fs_session);
|
||||
|
||||
/* Is this channel already set? */
|
||||
bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_avmd_");
|
||||
/* If yes */
|
||||
if (bug != NULL) {
|
||||
/* If we have a stop remove audio bug */
|
||||
if (strcasecmp(command, "stop") == 0) {
|
||||
switch_channel_set_private(channel, "_avmd_", NULL);
|
||||
switch_core_media_bug_remove(fs_session, &bug);
|
||||
switch_safe_free(ccmd);
|
||||
stream->write_function(stream, "+OK\n");
|
||||
goto end;
|
||||
}
|
||||
/* Is this channel already set? */
|
||||
bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_avmd_");
|
||||
/* If yes */
|
||||
if (bug != NULL) {
|
||||
/* If we have a stop remove audio bug */
|
||||
if (strcasecmp(command, "stop") == 0) {
|
||||
switch_channel_set_private(channel, "_avmd_", NULL);
|
||||
switch_core_media_bug_remove(fs_session, &bug);
|
||||
switch_safe_free(ccmd);
|
||||
stream->write_function(stream, "+OK\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* We have already started */
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_SESSION_LOG(session),
|
||||
SWITCH_LOG_WARNING,
|
||||
"Cannot run 2 at once on the same channel!\n"
|
||||
);
|
||||
/* We have already started */
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_SESSION_LOG(session),
|
||||
SWITCH_LOG_WARNING,
|
||||
"Cannot run 2 at once on the same channel!\n"
|
||||
);
|
||||
|
||||
goto end;
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* If we don't see the expected start exit */
|
||||
if (strcasecmp(command, "start") != 0) {
|
||||
stream->write_function(stream, "-USAGE: %s\n", AVMD_SYNTAX);
|
||||
goto end;
|
||||
}
|
||||
/* If we don't see the expected start exit */
|
||||
if (strcasecmp(command, "start") != 0) {
|
||||
stream->write_function(stream, "-USAGE: %s\n", AVMD_SYNTAX);
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Allocate memory attached to this FreeSWITCH session for
|
||||
* use in the callback routine and to store state information */
|
||||
avmd_session = (avmd_session_t *) switch_core_session_alloc(fs_session, sizeof(avmd_session_t));
|
||||
/* Allocate memory attached to this FreeSWITCH session for
|
||||
* use in the callback routine and to store state information */
|
||||
avmd_session = (avmd_session_t *) switch_core_session_alloc(fs_session, sizeof(avmd_session_t));
|
||||
|
||||
init_avmd_session_data(avmd_session, fs_session);
|
||||
init_avmd_session_data(avmd_session, fs_session);
|
||||
|
||||
/* Add a media bug that allows me to intercept the
|
||||
* reading leg of the audio stream */
|
||||
status = switch_core_media_bug_add(
|
||||
fs_session,
|
||||
"avmd",
|
||||
NULL,
|
||||
avmd_callback,
|
||||
avmd_session,
|
||||
0,
|
||||
SMBF_READ_REPLACE,
|
||||
&bug
|
||||
);
|
||||
/* Add a media bug that allows me to intercept the
|
||||
* reading leg of the audio stream */
|
||||
status = switch_core_media_bug_add(
|
||||
fs_session,
|
||||
"avmd",
|
||||
NULL,
|
||||
avmd_callback,
|
||||
avmd_session,
|
||||
0,
|
||||
SMBF_READ_REPLACE,
|
||||
&bug
|
||||
);
|
||||
|
||||
/* If adding a media bug fails exit */
|
||||
if (status != SWITCH_STATUS_SUCCESS) {
|
||||
/* If adding a media bug fails exit */
|
||||
if (status != SWITCH_STATUS_SUCCESS) {
|
||||
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_SESSION_LOG(session),
|
||||
SWITCH_LOG_ERROR,
|
||||
"Failure hooking to stream\n"
|
||||
);
|
||||
switch_log_printf(
|
||||
SWITCH_CHANNEL_SESSION_LOG(session),
|
||||
SWITCH_LOG_ERROR,
|
||||
"Failure hooking to stream\n"
|
||||
);
|
||||
|
||||
goto end;
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Set the vmd tag to detect an existing vmd media bug */
|
||||
switch_channel_set_private(channel, "_avmd_", bug);
|
||||
/* Set the vmd tag to detect an existing vmd media bug */
|
||||
switch_channel_set_private(channel, "_avmd_", bug);
|
||||
|
||||
/* Everything went according to plan! Notify the user */
|
||||
stream->write_function(stream, "+OK\n");
|
||||
/* Everything went according to plan! Notify the user */
|
||||
stream->write_function(stream, "+OK\n");
|
||||
|
||||
|
||||
end:
|
||||
|
||||
if (fs_session) {
|
||||
switch_core_session_rwunlock(fs_session);
|
||||
}
|
||||
if (fs_session) {
|
||||
switch_core_session_rwunlock(fs_session);
|
||||
}
|
||||
|
||||
switch_safe_free(ccmd);
|
||||
switch_safe_free(ccmd);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*! \brief Process one frame of data with avmd algorithm
|
||||
|
@ -477,102 +477,102 @@ end:
|
|||
*/
|
||||
static void avmd_process(avmd_session_t *session, switch_frame_t *frame)
|
||||
{
|
||||
switch_event_t *event;
|
||||
switch_status_t status;
|
||||
switch_event_t *event_copy;
|
||||
switch_channel_t *channel;
|
||||
switch_event_t *event;
|
||||
switch_status_t status;
|
||||
switch_event_t *event_copy;
|
||||
switch_channel_t *channel;
|
||||
|
||||
circ_buffer_t *b;
|
||||
size_t pos;
|
||||
double f;
|
||||
double v;
|
||||
// double error = 0.0;
|
||||
// double success = 0.0;
|
||||
// double amp = 0.0;
|
||||
// double s_rate;
|
||||
// double e_rate;
|
||||
// double avg_a;
|
||||
//double sine_len;
|
||||
uint32_t sine_len_i;
|
||||
//uint32_t beep_len_i;
|
||||
// int valid;
|
||||
circ_buffer_t *b;
|
||||
size_t pos;
|
||||
double f;
|
||||
double v;
|
||||
// double error = 0.0;
|
||||
// double success = 0.0;
|
||||
// double amp = 0.0;
|
||||
// double s_rate;
|
||||
// double e_rate;
|
||||
// double avg_a;
|
||||
//double sine_len;
|
||||
uint32_t sine_len_i;
|
||||
//uint32_t beep_len_i;
|
||||
// int valid;
|
||||
|
||||
b = &session->b;
|
||||
|
||||
/*! If beep has already been detected skip the CPU heavy stuff */
|
||||
if(session->state.beep_state == BEEP_DETECTED){
|
||||
return;
|
||||
}
|
||||
if(session->state.beep_state == BEEP_DETECTED){
|
||||
return;
|
||||
}
|
||||
|
||||
/*! Precompute values used heavily in the inner loop */
|
||||
sine_len_i = SINE_LEN(session->rate);
|
||||
//sine_len = (double)sine_len_i;
|
||||
//beep_len_i = BEEP_LEN(session->rate);
|
||||
|
||||
channel = switch_core_session_get_channel(session->session);
|
||||
sine_len_i = SINE_LEN(session->rate);
|
||||
//sine_len = (double)sine_len_i;
|
||||
//beep_len_i = BEEP_LEN(session->rate);
|
||||
|
||||
channel = switch_core_session_get_channel(session->session);
|
||||
|
||||
/*! Insert frame of 16 bit samples into buffer */
|
||||
INSERT_INT16_FRAME(b, (int16_t *)(frame->data), frame->samples);
|
||||
INSERT_INT16_FRAME(b, (int16_t *)(frame->data), frame->samples);
|
||||
|
||||
//switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session->session), SWITCH_LOG_INFO, "<<< AVMD sine_len_i=%d >>>\n", sine_len_i);
|
||||
//switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session->session), SWITCH_LOG_INFO, "<<< AVMD sine_len_i=%d >>>\n", sine_len_i);
|
||||
|
||||
/*! INNER LOOP -- OPTIMIZATION TARGET */
|
||||
for(pos = session->pos; pos < (GET_CURRENT_POS(b) - P); pos++){
|
||||
if ((pos % sine_len_i) == 0) {
|
||||
/*! Get a desa2 frequency estimate every sine len */
|
||||
f = desa2(b, pos);
|
||||
/*! INNER LOOP -- OPTIMIZATION TARGET */
|
||||
for(pos = session->pos; pos < (GET_CURRENT_POS(b) - P); pos++){
|
||||
if ((pos % sine_len_i) == 0) {
|
||||
/*! Get a desa2 frequency estimate every sine len */
|
||||
f = desa2(b, pos);
|
||||
|
||||
if(f < MIN_FREQUENCY_R(session->rate) || f > MAX_FREQUENCY_R(session->rate)) {
|
||||
v = 99999.0;
|
||||
RESET_SMA_BUFFER(&session->sma_b);
|
||||
RESET_SMA_BUFFER(&session->sqa_b);
|
||||
} else {
|
||||
APPEND_SMA_VAL(&session->sma_b, f);
|
||||
APPEND_SMA_VAL(&session->sqa_b, f * f);
|
||||
|
||||
/* calculate variance */
|
||||
v = session->sqa_b.sma - (session->sma_b.sma * session->sma_b.sma);
|
||||
if(f < MIN_FREQUENCY_R(session->rate) || f > MAX_FREQUENCY_R(session->rate)) {
|
||||
v = 99999.0;
|
||||
RESET_SMA_BUFFER(&session->sma_b);
|
||||
RESET_SMA_BUFFER(&session->sqa_b);
|
||||
} else {
|
||||
APPEND_SMA_VAL(&session->sma_b, f);
|
||||
APPEND_SMA_VAL(&session->sqa_b, f * f);
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session->session), SWITCH_LOG_DEBUG, "<<< AVMD v=%f f=%f %fHz sma=%f sqa=%f >>>\n", v, f, TO_HZ(session->rate, f), session->sma_b.sma, session->sqa_b.sma);
|
||||
}
|
||||
/* calculate variance */
|
||||
v = session->sqa_b.sma - (session->sma_b.sma * session->sma_b.sma);
|
||||
|
||||
/*! If variance is less than threshold then we have detection */
|
||||
if(v < VARIANCE_THRESHOLD){
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session->session), SWITCH_LOG_DEBUG, "<<< AVMD v=%f f=%f %fHz sma=%f sqa=%f >>>\n", v, f, TO_HZ(session->rate, f), session->sma_b.sma, session->sqa_b.sma);
|
||||
}
|
||||
|
||||
/*! If variance is less than threshold then we have detection */
|
||||
if(v < VARIANCE_THRESHOLD){
|
||||
|
||||
switch_channel_execute_on(switch_core_session_get_channel(session->session), "execute_on_avmd_beep");
|
||||
|
||||
/*! Throw an event to FreeSWITCH */
|
||||
status = switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, AVMD_EVENT_BEEP);
|
||||
if(status != SWITCH_STATUS_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
status = switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, AVMD_EVENT_BEEP);
|
||||
if(status != SWITCH_STATUS_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Beep-Status", "stop");
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Unique-ID", switch_core_session_get_uuid(session->session));
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-command", "avmd");
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Beep-Status", "stop");
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Unique-ID", switch_core_session_get_uuid(session->session));
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-command", "avmd");
|
||||
|
||||
if ((switch_event_dup(&event_copy, event)) != SWITCH_STATUS_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
if ((switch_event_dup(&event_copy, event)) != SWITCH_STATUS_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch_core_session_queue_event(session->session, &event);
|
||||
switch_event_fire(&event_copy);
|
||||
switch_core_session_queue_event(session->session, &event);
|
||||
switch_event_fire(&event_copy);
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session->session), SWITCH_LOG_DEBUG, "<<< AVMD - Beep Detected >>>\n");
|
||||
switch_channel_set_variable(channel, "avmd_detect", "TRUE");
|
||||
RESET_SMA_BUFFER(&session->sma_b);
|
||||
RESET_SMA_BUFFER(&session->sqa_b);
|
||||
session->state.beep_state = BEEP_DETECTED;
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session->session), SWITCH_LOG_DEBUG, "<<< AVMD - Beep Detected >>>\n");
|
||||
switch_channel_set_variable(channel, "avmd_detect", "TRUE");
|
||||
RESET_SMA_BUFFER(&session->sma_b);
|
||||
RESET_SMA_BUFFER(&session->sqa_b);
|
||||
session->state.beep_state = BEEP_DETECTED;
|
||||
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//amp = 0.0;
|
||||
//success = 0.0;
|
||||
//error = 0.0;
|
||||
}
|
||||
}
|
||||
session->pos = pos;
|
||||
//amp = 0.0;
|
||||
//success = 0.0;
|
||||
//error = 0.0;
|
||||
}
|
||||
}
|
||||
session->pos = pos;
|
||||
}
|
||||
|
||||
/* For Emacs:
|
||||
|
|
Loading…
Reference in New Issue