[asterisk-commits] rmudgett: branch rmudgett/bridge_phase r389336 - in /team/rmudgett/bridge_pha...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon May 20 19:21:18 CDT 2013
Author: rmudgett
Date: Mon May 20 19:21:14 2013
New Revision: 389336
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=389336
Log:
Extract ConfBridge recorder and announcer channel technologies to their respective new files.
Added:
team/rmudgett/bridge_phase/apps/confbridge/conf_chan_announce.c (with props)
team/rmudgett/bridge_phase/apps/confbridge/conf_chan_record.c (with props)
Modified:
team/rmudgett/bridge_phase/apps/app_confbridge.c
team/rmudgett/bridge_phase/apps/confbridge/include/confbridge.h
Modified: team/rmudgett/bridge_phase/apps/app_confbridge.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/apps/app_confbridge.c?view=diff&rev=389336&r1=389335&r2=389336
==============================================================================
--- team/rmudgett/bridge_phase/apps/app_confbridge.c (original)
+++ team/rmudgett/bridge_phase/apps/app_confbridge.c Mon May 20 19:21:14 2013
@@ -70,7 +70,6 @@
#include "asterisk/stasis.h"
#include "asterisk/stasis_bridging.h"
#include "asterisk/json.h"
-#include "asterisk/core_unreal.h"
/*** DOCUMENTATION
<application name="ConfBridge" language="en_US">
@@ -307,7 +306,7 @@
};
/*! \brief Container to hold all conference bridges in progress */
-static struct ao2_container *conference_bridges;
+struct ao2_container *conference_bridges;
static void leave_conference(struct confbridge_user *user);
static int play_sound_number(struct confbridge_conference *conference, int say_number);
@@ -489,243 +488,6 @@
send_conf_stasis(conference, chan, "confbridge_unmute", NULL, 1);
}
-static int rec_call(struct ast_channel *chan, const char *addr, int timeout)
-{
- /* Make sure anyone calling ast_call() for this channel driver is going to fail. */
- return -1;
-}
-
-static struct ast_frame *rec_read(struct ast_channel *ast)
-{
- return &ast_null_frame;
-}
-
-static int rec_write(struct ast_channel *ast, struct ast_frame *f)
-{
- return 0;
-}
-
-static struct ast_channel *rec_request(const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor, const char *data, int *cause);
-
-static struct ast_channel_tech record_tech = {
- .type = "CBRec",
- .description = "Conference Bridge Recording Channel",
- .requester = rec_request,
- .call = rec_call,
- .read = rec_read,
- .write = rec_write,
-};
-
-static struct ast_channel *rec_request(const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor, const char *data, int *cause)
-{
- struct ast_channel *chan;
- struct ast_format format;
- const char *conf_name = data;
-
- chan = ast_channel_alloc(1, AST_STATE_UP, NULL, NULL, NULL, NULL, NULL, NULL, 0,
- "CBRec/conf-%s-uid-%d",
- conf_name, (int) ast_random());
- if (!chan) {
- return NULL;
- }
- if (ast_channel_add_bridge_role(chan, "recorder")) {
- ast_channel_release(chan);
- return NULL;
- }
- ast_format_set(&format, AST_FORMAT_SLINEAR, 0);
- ast_channel_tech_set(chan, &record_tech);
- ast_format_cap_add_all(ast_channel_nativeformats(chan));
- ast_format_copy(ast_channel_writeformat(chan), &format);
- ast_format_copy(ast_channel_rawwriteformat(chan), &format);
- ast_format_copy(ast_channel_readformat(chan), &format);
- ast_format_copy(ast_channel_rawreadformat(chan), &format);
- return chan;
-}
-
-/*! ConfBridge announcer channel private. */
-struct announce_pvt {
- /*! Unreal channel driver base class values. */
- struct ast_unreal_pvt base;
- /*! Conference bridge associated with this announcer. */
- struct ast_bridge *bridge;
-};
-
-static int announce_call(struct ast_channel *chan, const char *addr, int timeout)
-{
- /* Make sure anyone calling ast_call() for this channel driver is going to fail. */
- return -1;
-}
-
-static int announce_hangup(struct ast_channel *ast)
-{
- struct announce_pvt *p = ast_channel_tech_pvt(ast);
- int res;
-
- if (!p) {
- return -1;
- }
-
- /* give the pvt a ref to fulfill calling requirements. */
- ao2_ref(p, +1);
- res = ast_unreal_hangup(&p->base, ast);
- ao2_ref(p, -1);
-
- return res;
-}
-
-static struct ast_channel *announce_request(const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor, const char *data, int *cause);
-
-static struct ast_channel_tech announce_tech = {
- .type = "CBAnn",
- .description = "Conference Bridge Announcing Channel",
- .requester = announce_request,
- .call = announce_call,
- .hangup = announce_hangup,
-
- .send_digit_begin = ast_unreal_digit_begin,
- .send_digit_end = ast_unreal_digit_end,
- .read = ast_unreal_read,
- .write = ast_unreal_write,
- .write_video = ast_unreal_write,
- .exception = ast_unreal_read,
- .indicate = ast_unreal_indicate,
- .fixup = ast_unreal_fixup,
- .send_html = ast_unreal_sendhtml,
- .send_text = ast_unreal_sendtext,
- .queryoption = ast_unreal_queryoption,
- .setoption = ast_unreal_setoption,
-};
-
-static void announce_pvt_destructor(void *vdoomed)
-{
- struct announce_pvt *doomed = vdoomed;
-
- ao2_cleanup(doomed->bridge);
- doomed->bridge = NULL;
-}
-
-static struct ast_channel *announce_request(const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor, const char *data, int *cause)
-{
- struct ast_channel *chan;
- const char *conf_name = data;
- RAII_VAR(struct confbridge_conference *, conference, NULL, ao2_cleanup);
- RAII_VAR(struct announce_pvt *, pvt, NULL, ao2_cleanup);
-
- conference = ao2_find(conference_bridges, conf_name, OBJ_KEY);
- if (!conference) {
- return NULL;
- }
- ast_assert(conference->bridge != NULL);
-
- /* Allocate a new private structure and then Asterisk channels */
- pvt = (struct announce_pvt *) ast_unreal_alloc(sizeof(*pvt), announce_pvt_destructor,
- cap);
- if (!pvt) {
- return NULL;
- }
- ast_set_flag(&pvt->base, AST_UNREAL_NO_OPTIMIZATION);
- ast_copy_string(pvt->base.name, conf_name, sizeof(pvt->base.name));
- pvt->bridge = conference->bridge;
- ao2_ref(pvt->bridge, +1);
-
- chan = ast_unreal_new_channels(&pvt->base, &announce_tech, AST_STATE_UP, AST_STATE_UP,
- NULL, NULL, requestor, NULL);
- if (chan) {
- ast_answer(pvt->base.owner);
- ast_answer(pvt->base.chan);
- if (ast_channel_add_bridge_role(pvt->base.chan, "announcer")) {
- ast_hangup(chan);
- chan = NULL;
- }
- }
-
- return chan;
-}
-
-/*!
- * \internal
- * \brief Remove the announcer channel from the conference.
- * \since 12.0.0
- *
- * \param chan Either channel in the announcer channel pair.
- *
- * \return Nothing
- */
-static void announce_channel_depart(struct ast_channel *chan)
-{
- struct announce_pvt *p = ast_channel_tech_pvt(chan);
-
- if (!p) {
- return;
- }
-
- ao2_ref(p, +1);
- ao2_lock(p);
- if (!ast_test_flag(&p->base, AST_UNREAL_CARETAKER_THREAD)) {
- ao2_unlock(p);
- ao2_ref(p, -1);
- return;
- }
- ast_clear_flag(&p->base, AST_UNREAL_CARETAKER_THREAD);
- chan = p->base.chan;
- if (chan) {
- ast_channel_ref(chan);
- }
- ao2_unlock(p);
- ao2_ref(p, -1);
- if (chan) {
- ast_bridge_depart(chan);
- ast_channel_unref(chan);
- }
-}
-
-/*!
- * \internal
- * \brief Push the announcer channel into the conference.
- * \since 12.0.0
- *
- * \param ast Either channel in the announcer channel pair.
- *
- * \retval 0 on success.
- * \retval -1 on error.
- */
-static int announce_channel_push(struct ast_channel *ast)
-{
- struct ast_bridge_features *features;
- RAII_VAR(struct announce_pvt *, p, NULL, ao2_cleanup);
- RAII_VAR(struct ast_channel *, chan, NULL, ast_channel_unref);
-
- {
- SCOPED_CHANNELLOCK(lock, ast);
-
- p = ast_channel_tech_pvt(ast);
- if (!p) {
- return -1;
- }
- ao2_ref(p, +1);
- chan = p->base.chan;
- if (!chan) {
- return -1;
- }
- ast_channel_ref(chan);
- }
-
- features = ast_bridge_features_new();
- if (!features) {
- return -1;
- }
- ast_set_flag(&features->feature_flags, AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE);
-
- /* Impart the output channel into the bridge */
- if (ast_bridge_impart(p->bridge, chan, NULL, features, 0)) {
- return -1;
- }
- ao2_lock(p);
- ast_set_flag(&p->base, AST_UNREAL_CARETAKER_THREAD);
- ao2_unlock(p);
- return 0;
-}
-
static void set_rec_filename(struct confbridge_conference *conference, struct ast_str **filename, int is_new)
{
char *rec_file = conference->b_profile.rec_file;
@@ -1124,7 +886,7 @@
ast_debug(1, "Destroying conference bridge '%s'\n", conference->name);
if (conference->playback_chan) {
- announce_channel_depart(conference->playback_chan);
+ conf_announce_channel_depart(conference->playback_chan);
ast_hangup(conference->playback_chan);
conference->playback_chan = NULL;
}
@@ -1595,7 +1357,7 @@
ast_mutex_unlock(&conference->playback_lock);
return -1;
}
- if (announce_channel_push(conference->playback_chan)) {
+ if (conf_announce_channel_push(conference->playback_chan)) {
ast_mutex_unlock(&conference->playback_lock);
return -1;
}
@@ -1610,7 +1372,7 @@
ast_debug(1, "Departing announcer channel '%s' from conference bridge '%s'\n",
ast_channel_name(conference->playback_chan), conference->name);
- announce_channel_depart(conference->playback_chan);
+ conf_announce_channel_depart(conference->playback_chan);
ast_mutex_unlock(&conference->playback_lock);
@@ -3355,8 +3117,8 @@
conf_destroy_config();
- unregister_channel_tech(&announce_tech);
- unregister_channel_tech(&record_tech);
+ unregister_channel_tech(conf_announce_get_tech());
+ unregister_channel_tech(conf_record_get_tech());
return 0;
}
@@ -3380,8 +3142,8 @@
return AST_MODULE_LOAD_DECLINE;
}
- if (register_channel_tech(&record_tech)
- || register_channel_tech(&announce_tech)) {
+ if (register_channel_tech(conf_record_get_tech())
+ || register_channel_tech(conf_announce_get_tech())) {
unload_module();
return AST_MODULE_LOAD_FAILURE;
}
Added: team/rmudgett/bridge_phase/apps/confbridge/conf_chan_announce.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/apps/confbridge/conf_chan_announce.c?view=auto&rev=389336
==============================================================================
--- team/rmudgett/bridge_phase/apps/confbridge/conf_chan_announce.c (added)
+++ team/rmudgett/bridge_phase/apps/confbridge/conf_chan_announce.c Mon May 20 19:21:14 2013
@@ -1,0 +1,207 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2013 Digium, Inc.
+ *
+ * Richard Mudgett <rmudgett at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*!
+ * \file
+ * \brief ConfBridge announcer channel driver
+ *
+ * \author Richard Mudgett <rmudgett at digium.com>
+ *
+ * See Also:
+ * \arg \ref AstCREDITS
+ */
+
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/channel.h"
+#include "asterisk/bridging.h"
+#include "asterisk/core_unreal.h"
+#include "include/confbridge.h"
+
+/* ------------------------------------------------------------------- */
+
+/*! ConfBridge announcer channel private. */
+struct announce_pvt {
+ /*! Unreal channel driver base class values. */
+ struct ast_unreal_pvt base;
+ /*! Conference bridge associated with this announcer. */
+ struct ast_bridge *bridge;
+};
+
+static int announce_call(struct ast_channel *chan, const char *addr, int timeout)
+{
+ /* Make sure anyone calling ast_call() for this channel driver is going to fail. */
+ return -1;
+}
+
+static int announce_hangup(struct ast_channel *ast)
+{
+ struct announce_pvt *p = ast_channel_tech_pvt(ast);
+ int res;
+
+ if (!p) {
+ return -1;
+ }
+
+ /* give the pvt a ref to fulfill calling requirements. */
+ ao2_ref(p, +1);
+ res = ast_unreal_hangup(&p->base, ast);
+ ao2_ref(p, -1);
+
+ return res;
+}
+
+static void announce_pvt_destructor(void *vdoomed)
+{
+ struct announce_pvt *doomed = vdoomed;
+
+ ao2_cleanup(doomed->bridge);
+ doomed->bridge = NULL;
+}
+
+static struct ast_channel *announce_request(const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor, const char *data, int *cause)
+{
+ struct ast_channel *chan;
+ const char *conf_name = data;
+ RAII_VAR(struct confbridge_conference *, conference, NULL, ao2_cleanup);
+ RAII_VAR(struct announce_pvt *, pvt, NULL, ao2_cleanup);
+
+ conference = ao2_find(conference_bridges, conf_name, OBJ_KEY);
+ if (!conference) {
+ return NULL;
+ }
+ ast_assert(conference->bridge != NULL);
+
+ /* Allocate a new private structure and then Asterisk channels */
+ pvt = (struct announce_pvt *) ast_unreal_alloc(sizeof(*pvt), announce_pvt_destructor,
+ cap);
+ if (!pvt) {
+ return NULL;
+ }
+ ast_set_flag(&pvt->base, AST_UNREAL_NO_OPTIMIZATION);
+ ast_copy_string(pvt->base.name, conf_name, sizeof(pvt->base.name));
+ pvt->bridge = conference->bridge;
+ ao2_ref(pvt->bridge, +1);
+
+ chan = ast_unreal_new_channels(&pvt->base, conf_announce_get_tech(),
+ AST_STATE_UP, AST_STATE_UP, NULL, NULL, requestor, NULL);
+ if (chan) {
+ ast_answer(pvt->base.owner);
+ ast_answer(pvt->base.chan);
+ if (ast_channel_add_bridge_role(pvt->base.chan, "announcer")) {
+ ast_hangup(chan);
+ chan = NULL;
+ }
+ }
+
+ return chan;
+}
+
+static struct ast_channel_tech announce_tech = {
+ .type = "CBAnn",
+ .description = "Conference Bridge Announcing Channel",
+ .requester = announce_request,
+ .call = announce_call,
+ .hangup = announce_hangup,
+
+ .send_digit_begin = ast_unreal_digit_begin,
+ .send_digit_end = ast_unreal_digit_end,
+ .read = ast_unreal_read,
+ .write = ast_unreal_write,
+ .write_video = ast_unreal_write,
+ .exception = ast_unreal_read,
+ .indicate = ast_unreal_indicate,
+ .fixup = ast_unreal_fixup,
+ .send_html = ast_unreal_sendhtml,
+ .send_text = ast_unreal_sendtext,
+ .queryoption = ast_unreal_queryoption,
+ .setoption = ast_unreal_setoption,
+};
+
+struct ast_channel_tech *conf_announce_get_tech(void)
+{
+ return &announce_tech;
+}
+
+void conf_announce_channel_depart(struct ast_channel *chan)
+{
+ struct announce_pvt *p = ast_channel_tech_pvt(chan);
+
+ if (!p) {
+ return;
+ }
+
+ ao2_ref(p, +1);
+ ao2_lock(p);
+ if (!ast_test_flag(&p->base, AST_UNREAL_CARETAKER_THREAD)) {
+ ao2_unlock(p);
+ ao2_ref(p, -1);
+ return;
+ }
+ ast_clear_flag(&p->base, AST_UNREAL_CARETAKER_THREAD);
+ chan = p->base.chan;
+ if (chan) {
+ ast_channel_ref(chan);
+ }
+ ao2_unlock(p);
+ ao2_ref(p, -1);
+ if (chan) {
+ ast_bridge_depart(chan);
+ ast_channel_unref(chan);
+ }
+}
+
+int conf_announce_channel_push(struct ast_channel *ast)
+{
+ struct ast_bridge_features *features;
+ RAII_VAR(struct announce_pvt *, p, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_channel *, chan, NULL, ast_channel_unref);
+
+ {
+ SCOPED_CHANNELLOCK(lock, ast);
+
+ p = ast_channel_tech_pvt(ast);
+ if (!p) {
+ return -1;
+ }
+ ao2_ref(p, +1);
+ chan = p->base.chan;
+ if (!chan) {
+ return -1;
+ }
+ ast_channel_ref(chan);
+ }
+
+ features = ast_bridge_features_new();
+ if (!features) {
+ return -1;
+ }
+ ast_set_flag(&features->feature_flags, AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE);
+
+ /* Impart the output channel into the bridge */
+ if (ast_bridge_impart(p->bridge, chan, NULL, features, 0)) {
+ return -1;
+ }
+ ao2_lock(p);
+ ast_set_flag(&p->base, AST_UNREAL_CARETAKER_THREAD);
+ ao2_unlock(p);
+ return 0;
+}
Propchange: team/rmudgett/bridge_phase/apps/confbridge/conf_chan_announce.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/rmudgett/bridge_phase/apps/confbridge/conf_chan_announce.c
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/rmudgett/bridge_phase/apps/confbridge/conf_chan_announce.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: team/rmudgett/bridge_phase/apps/confbridge/conf_chan_record.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/apps/confbridge/conf_chan_record.c?view=auto&rev=389336
==============================================================================
--- team/rmudgett/bridge_phase/apps/confbridge/conf_chan_record.c (added)
+++ team/rmudgett/bridge_phase/apps/confbridge/conf_chan_record.c Mon May 20 19:21:14 2013
@@ -1,0 +1,94 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2013 Digium, Inc.
+ *
+ * Richard Mudgett <rmudgett at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*!
+ * \file
+ * \brief ConfBridge recorder channel driver
+ *
+ * \author Richard Mudgett <rmudgett at digium.com>
+ *
+ * See Also:
+ * \arg \ref AstCREDITS
+ */
+
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/channel.h"
+#include "asterisk/bridging.h"
+#include "include/confbridge.h"
+
+/* ------------------------------------------------------------------- */
+
+static int rec_call(struct ast_channel *chan, const char *addr, int timeout)
+{
+ /* Make sure anyone calling ast_call() for this channel driver is going to fail. */
+ return -1;
+}
+
+static struct ast_frame *rec_read(struct ast_channel *ast)
+{
+ return &ast_null_frame;
+}
+
+static int rec_write(struct ast_channel *ast, struct ast_frame *f)
+{
+ return 0;
+}
+
+static struct ast_channel *rec_request(const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor, const char *data, int *cause)
+{
+ struct ast_channel *chan;
+ struct ast_format format;
+ const char *conf_name = data;
+
+ chan = ast_channel_alloc(1, AST_STATE_UP, NULL, NULL, NULL, NULL, NULL, NULL, 0,
+ "CBRec/conf-%s-uid-%d",
+ conf_name, (int) ast_random());
+ if (!chan) {
+ return NULL;
+ }
+ if (ast_channel_add_bridge_role(chan, "recorder")) {
+ ast_channel_release(chan);
+ return NULL;
+ }
+ ast_format_set(&format, AST_FORMAT_SLINEAR, 0);
+ ast_channel_tech_set(chan, conf_record_get_tech());
+ ast_format_cap_add_all(ast_channel_nativeformats(chan));
+ ast_format_copy(ast_channel_writeformat(chan), &format);
+ ast_format_copy(ast_channel_rawwriteformat(chan), &format);
+ ast_format_copy(ast_channel_readformat(chan), &format);
+ ast_format_copy(ast_channel_rawreadformat(chan), &format);
+ return chan;
+}
+
+static struct ast_channel_tech record_tech = {
+ .type = "CBRec",
+ .description = "Conference Bridge Recording Channel",
+ .requester = rec_request,
+ .call = rec_call,
+ .read = rec_read,
+ .write = rec_write,
+};
+
+struct ast_channel_tech *conf_record_get_tech(void)
+{
+ return &record_tech;
+}
Propchange: team/rmudgett/bridge_phase/apps/confbridge/conf_chan_record.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/rmudgett/bridge_phase/apps/confbridge/conf_chan_record.c
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/rmudgett/bridge_phase/apps/confbridge/conf_chan_record.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: team/rmudgett/bridge_phase/apps/confbridge/include/confbridge.h
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/apps/confbridge/include/confbridge.h?view=diff&rev=389336&r1=389335&r2=389336
==============================================================================
--- team/rmudgett/bridge_phase/apps/confbridge/include/confbridge.h (original)
+++ team/rmudgett/bridge_phase/apps/confbridge/include/confbridge.h Mon May 20 19:21:14 2013
@@ -222,6 +222,8 @@
AST_LIST_HEAD_NOLOCK(, confbridge_user) waiting_list; /*!< List of users waiting to join the conference bridge */
};
+extern struct ao2_container *conference_bridges;
+
struct post_join_action {
int (*func)(struct confbridge_user *user);
AST_LIST_ENTRY(post_join_action) list;
@@ -484,4 +486,41 @@
* \brief unregister stasis message routers to handle manager events for confbridge messages
*/
void manager_confbridge_shutdown(void);
+
+/*!
+ * \brief Get ConfBridge record channel technology struct.
+ * \since 12.0.0
+ *
+ * \return ConfBridge record channel technology.
+ */
+struct ast_channel_tech *conf_record_get_tech(void);
+
+/*!
+ * \brief Get ConfBridge announce channel technology struct.
+ * \since 12.0.0
+ *
+ * \return ConfBridge announce channel technology.
+ */
+struct ast_channel_tech *conf_announce_get_tech(void);
+
+/*!
+ * \brief Remove the announcer channel from the conference.
+ * \since 12.0.0
+ *
+ * \param chan Either channel in the announcer channel pair.
+ *
+ * \return Nothing
+ */
+void conf_announce_channel_depart(struct ast_channel *chan);
+
+/*!
+ * \brief Push the announcer channel into the conference.
+ * \since 12.0.0
+ *
+ * \param ast Either channel in the announcer channel pair.
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int conf_announce_channel_push(struct ast_channel *ast);
#endif
More information about the asterisk-commits
mailing list