summaryrefslogtreecommitdiff
path: root/main/audiohook.c
diff options
context:
space:
mode:
authorBrett Bryant <bbryant@digium.com>2008-05-01 16:57:19 +0000
committerBrett Bryant <bbryant@digium.com>2008-05-01 16:57:19 +0000
commit5634048c98a47620bce614f0377e24a62e2ddffc (patch)
tree27c35a3350c9aae81be9a3d569d1551d4c0e4a59 /main/audiohook.c
parentc48c37909c28936ee34850c2e5b1d3019cc42743 (diff)
Add two new dialplan functions from libspeex for applying audio gain control
and denoising to a channel, AGC() and DENOISE(). Also included, is a change to the audiohook API to add a new function (ast_audiohook_remove) that can remove an audiohook from a channel before it is detached. This code is based on a contribution from Switchvox. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@114926 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/audiohook.c')
-rw-r--r--main/audiohook.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/main/audiohook.c b/main/audiohook.c
index 1f5bcff4f..37970174e 100644
--- a/main/audiohook.c
+++ b/main/audiohook.c
@@ -455,6 +455,42 @@ int ast_audiohook_detach_source(struct ast_channel *chan, const char *source)
return (audiohook ? 0 : -1);
}
+/*!
+ * \brief Remove an audiohook from a specified channel
+ *
+ * \param chan Channel to remove from
+ * \param audiohook Audiohook to remove
+ *
+ * \return Returns 0 on success, -1 on failure
+ *
+ * \note The channel does not need to be locked before calling this function
+ */
+int ast_audiohook_remove(struct ast_channel *chan, struct ast_audiohook *audiohook)
+{
+ ast_channel_lock(chan);
+
+ if (!chan->audiohooks) {
+ ast_channel_unlock(chan);
+ return -1;
+ }
+
+ if (audiohook->type == AST_AUDIOHOOK_TYPE_SPY)
+ AST_LIST_REMOVE(&chan->audiohooks->spy_list, audiohook, list);
+ else if (audiohook->type == AST_AUDIOHOOK_TYPE_WHISPER)
+ AST_LIST_REMOVE(&chan->audiohooks->whisper_list, audiohook, list);
+ else if (audiohook->type == AST_AUDIOHOOK_TYPE_MANIPULATE)
+ AST_LIST_REMOVE(&chan->audiohooks->manipulate_list, audiohook, list);
+
+ ast_audiohook_lock(audiohook);
+ audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
+ ast_cond_signal(&audiohook->trigger);
+ ast_audiohook_unlock(audiohook);
+
+ ast_channel_unlock(chan);
+
+ return 0;
+}
+
/*! \brief Pass a DTMF frame off to be handled by the audiohook core
* \param chan Channel that the list is coming off of
* \param audiohook_list List of audiohooks