diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-10-20 22:09:07 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-10-20 22:09:07 +0000 |
commit | 38f43cba1be34203172d6f91be83968bb51c18fe (patch) | |
tree | 83526bb72e59a3a34f3de1aad8dbe0d8ced6dc73 /funcs | |
parent | f7822860b4ee84f99ef058bf21caba0b2eb0a028 (diff) |
Merged revisions 224855 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r224855 | tilghman | 2009-10-20 17:07:11 -0500 (Tue, 20 Oct 2009) | 5 lines
Pay attention to the return value of the manipulate function.
While this looks like an optimization, it prevents a crash from occurring
when used with certain audiohook callbacks (diagnosed with SVN trunk,
backported to 1.4 to keep the source consistent across versions).
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@224856 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'funcs')
-rw-r--r-- | funcs/func_speex.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/funcs/func_speex.c b/funcs/func_speex.c index d5246b0bd..699d4fd92 100644 --- a/funcs/func_speex.c +++ b/funcs/func_speex.c @@ -142,25 +142,24 @@ static int speex_callback(struct ast_audiohook *audiohook, struct ast_channel *c struct ast_datastore *datastore = NULL; struct speex_direction_info *sdi = NULL; struct speex_info *si = NULL; + char source[80]; /* If the audiohook is stopping it means the channel is shutting down.... but we let the datastore destroy take care of it */ if (audiohook->status == AST_AUDIOHOOK_STATUS_DONE || frame->frametype != AST_FRAME_VOICE) { - return 0; + return -1; } - - ast_channel_lock(chan); + + /* We are called with chan already locked */ if (!(datastore = ast_channel_datastore_find(chan, &speex_datastore, NULL))) { - ast_channel_unlock(chan); - return 0; + return -1; } - ast_channel_unlock(chan); si = datastore->data; sdi = (direction == AST_AUDIOHOOK_DIRECTION_READ) ? si->rx : si->tx; if (!sdi) { - return 0; + return -1; } if (sdi->samples != frame->samples) { @@ -171,7 +170,7 @@ static int speex_callback(struct ast_audiohook *audiohook, struct ast_channel *c if (!(sdi->state = speex_preprocess_state_init((sdi->samples = frame->samples), 8000))) { return -1; } - + speex_preprocess_ctl(sdi->state, SPEEX_PREPROCESS_SET_AGC, &sdi->agc); if (sdi->agc) { @@ -182,6 +181,12 @@ static int speex_callback(struct ast_audiohook *audiohook, struct ast_channel *c } speex_preprocess(sdi->state, frame->data.ptr, NULL); + snprintf(source, sizeof(source), "%s/speex", frame->src); + if (frame->mallocd & AST_MALLOCD_SRC) { + ast_free((char *) frame->src); + } + frame->src = ast_strdup(source); + frame->mallocd |= AST_MALLOCD_SRC; return 0; } |