Binaural synthesis (confbridge): On/off setting for binaural synthesis.
[asterisk/asterisk.git] / apps / confbridge / include / confbridge.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2011, Digium, Inc.
5  *
6  * David Vossel <dvossel@digium.com>
7  * Joshua Colp <jcolp@digium.com>
8  *
9  * See http://www.asterisk.org for more information about
10  * the Asterisk project. Please do not directly contact
11  * any of the maintainers of this project for assistance;
12  * the project provides a web site, mailing lists and IRC
13  * channels for your use.
14  *
15  * This program is free software, distributed under the terms of
16  * the GNU General Public License Version 2. See the LICENSE file
17  * at the top of the source tree.
18  */
19
20
21 #ifndef _CONFBRIDGE_H
22 #define _CONFBRIDGE_H
23
24 #include "asterisk.h"
25 #include "asterisk/app.h"
26 #include "asterisk/logger.h"
27 #include "asterisk/linkedlists.h"
28 #include "asterisk/channel.h"
29 #include "asterisk/bridge.h"
30 #include "asterisk/bridge_features.h"
31 #include "conf_state.h"
32
33 /* Maximum length of a conference bridge name */
34 #define MAX_CONF_NAME AST_MAX_EXTENSION
35 /* Maximum length of a conference pin */
36 #define MAX_PIN     80
37 /* Maximum length of bridge/user/menu profile names */
38 #define MAX_PROFILE_NAME 128
39
40 #define DEFAULT_USER_PROFILE "default_user"
41 #define DEFAULT_BRIDGE_PROFILE "default_bridge"
42 #define DEFAULT_MENU_PROFILE "default_menu"
43
44 #define DEFAULT_TALKING_THRESHOLD 160
45 #define DEFAULT_SILENCE_THRESHOLD 2500
46
47 enum user_profile_flags {
48         USER_OPT_ADMIN =        (1 << 0), /*!< Set if the caller is an administrator */
49         USER_OPT_NOONLYPERSON = (1 << 1), /*!< Set if the "you are currently the only person in this conference" sound file should not be played */
50         USER_OPT_MARKEDUSER =   (1 << 2), /*!< Set if the caller is a marked user */
51         USER_OPT_STARTMUTED =   (1 << 3), /*!< Set if the caller should be initially set muted */
52         USER_OPT_MUSICONHOLD =  (1 << 4), /*!< Set if music on hold should be played if nobody else is in the conference bridge */
53         USER_OPT_QUIET =        (1 << 5), /*!< Set if no audio prompts should be played */
54         USER_OPT_ANNOUNCEUSERCOUNT = (1 << 6), /*!< Set if the number of users should be announced to the caller */
55         USER_OPT_WAITMARKED =   (1 << 7), /*!< Set if the user must wait for a marked user before starting */
56         USER_OPT_ENDMARKED =    (1 << 8), /*!< Set if the user should be kicked after the last Marked user exits */
57         USER_OPT_DENOISE =      (1 << 9), /*!< Sets if denoise filter should be used on audio before mixing. */
58         USER_OPT_ANNOUNCE_JOIN_LEAVE = (1 << 10), /*!< Sets if the user's name should be recorded and announced on join and leave. */
59         USER_OPT_TALKER_DETECT = (1 << 11), /*!< Sets if start and stop talking events should generated for this user over AMI. */
60         USER_OPT_DROP_SILENCE =  (1 << 12), /*!< Sets if silence should be dropped from the mix or not. */
61         USER_OPT_DTMF_PASS    =  (1 << 13), /*!< Sets if dtmf should be passed into the conference or not */
62         USER_OPT_ANNOUNCEUSERCOUNTALL = (1 << 14), /*!< Sets if the number of users should be announced to everyone. */
63         USER_OPT_JITTERBUFFER =  (1 << 15), /*!< Places a jitterbuffer on the user. */
64         USER_OPT_ANNOUNCE_JOIN_LEAVE_REVIEW = (1 << 16), /*!< modifies ANNOUNCE_JOIN_LEAVE - user reviews the recording before continuing */
65 };
66
67 enum bridge_profile_flags {
68         BRIDGE_OPT_RECORD_CONFERENCE = (1 << 0), /*!< Set if the conference should be recorded */
69         BRIDGE_OPT_VIDEO_SRC_LAST_MARKED = (1 << 1), /*!< Set if conference should feed video of last marked user to all participants. */
70         BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED = (1 << 2), /*!< Set if conference should feed video of first marked user to all participants. */
71         BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER = (1 << 3), /*!< Set if conference set the video feed to follow the loudest talker.  */
72         BRIDGE_OPT_RECORD_FILE_APPEND = (1 << 4), /*!< Set if the record file should be appended to between start/stops.  */
73         BRIDGE_OPT_RECORD_FILE_TIMESTAMP = (1 << 5), /*< Set if the record file should have a timestamp appended */
74         BRIDGE_OPT_BINAURAL_ACTIVE = (1 << 6), /*< Set if binaural convolution is activated */
75 };
76
77 enum conf_menu_action_id {
78         MENU_ACTION_TOGGLE_MUTE = 1,
79         MENU_ACTION_PLAYBACK,
80         MENU_ACTION_PLAYBACK_AND_CONTINUE,
81         MENU_ACTION_INCREASE_LISTENING,
82         MENU_ACTION_DECREASE_LISTENING,
83         MENU_ACTION_RESET_LISTENING,
84         MENU_ACTION_RESET_TALKING,
85         MENU_ACTION_INCREASE_TALKING,
86         MENU_ACTION_DECREASE_TALKING,
87         MENU_ACTION_DIALPLAN_EXEC,
88         MENU_ACTION_ADMIN_TOGGLE_LOCK,
89         MENU_ACTION_ADMIN_KICK_LAST,
90         MENU_ACTION_LEAVE,
91         MENU_ACTION_NOOP,
92         MENU_ACTION_SET_SINGLE_VIDEO_SRC,
93         MENU_ACTION_RELEASE_SINGLE_VIDEO_SRC,
94         MENU_ACTION_PARTICIPANT_COUNT,
95         MENU_ACTION_ADMIN_TOGGLE_MUTE_PARTICIPANTS,
96 };
97
98 /*! The conference menu action contains both
99  *  the action id that represents the action that
100  *  must take place, along with any data associated
101  *  with that action. */
102 struct conf_menu_action {
103         enum conf_menu_action_id id;
104         union {
105                 char playback_file[PATH_MAX];
106                 struct {
107                         char context[AST_MAX_CONTEXT];
108                         char exten[AST_MAX_EXTENSION];
109                         int priority;
110                 } dialplan_args;
111         } data;
112         AST_LIST_ENTRY(conf_menu_action) action;
113 };
114
115 /*! Conference menu entries contain the DTMF sequence
116  *  and the list of actions that are associated with that
117  *  sequence. */
118 struct conf_menu_entry {
119         /*! the DTMF sequence that triggers the actions */
120         char dtmf[MAXIMUM_DTMF_FEATURE_STRING];
121         /*! The actions associated with this menu entry. */
122         AST_LIST_HEAD_NOLOCK(, conf_menu_action) actions;
123         AST_LIST_ENTRY(conf_menu_entry) entry;
124 };
125
126 /*! Conference menu structure.  Contains a list
127  * of DTMF sequences coupled with the actions those
128  * sequences invoke.*/
129 struct conf_menu {
130         char name[MAX_PROFILE_NAME];
131         AST_LIST_HEAD_NOLOCK(, conf_menu_entry) entries;
132 };
133
134 struct user_profile {
135         char name[MAX_PROFILE_NAME];
136         char pin[MAX_PIN];
137         char moh_class[128];
138         char announcement[PATH_MAX];
139         unsigned int flags;
140         unsigned int announce_user_count_all_after;
141         /*! The time in ms of talking before a user is considered to be talking by the dsp. */
142         unsigned int talking_threshold;
143         /*! The time in ms of silence before a user is considered to be silent by the dsp. */
144         unsigned int silence_threshold;
145         /*! The time in ms the user may stay in the confbridge */
146         unsigned int timeout;
147 };
148
149 enum conf_sounds {
150         CONF_SOUND_HAS_JOINED,
151         CONF_SOUND_HAS_LEFT,
152         CONF_SOUND_KICKED,
153         CONF_SOUND_MUTED,
154         CONF_SOUND_UNMUTED,
155         CONF_SOUND_ONLY_ONE,
156         CONF_SOUND_THERE_ARE,
157         CONF_SOUND_OTHER_IN_PARTY,
158         CONF_SOUND_PLACE_IN_CONF,
159         CONF_SOUND_WAIT_FOR_LEADER,
160         CONF_SOUND_LEADER_HAS_LEFT,
161         CONF_SOUND_GET_PIN,
162         CONF_SOUND_INVALID_PIN,
163         CONF_SOUND_ONLY_PERSON,
164         CONF_SOUND_LOCKED,
165         CONF_SOUND_LOCKED_NOW,
166         CONF_SOUND_UNLOCKED_NOW,
167         CONF_SOUND_ERROR_MENU,
168         CONF_SOUND_JOIN,
169         CONF_SOUND_LEAVE,
170         CONF_SOUND_PARTICIPANTS_MUTED,
171         CONF_SOUND_PARTICIPANTS_UNMUTED,
172         CONF_SOUND_BEGIN,
173 };
174
175 struct bridge_profile_sounds {
176         AST_DECLARE_STRING_FIELDS(
177                 AST_STRING_FIELD(hasjoin);
178                 AST_STRING_FIELD(hasleft);
179                 AST_STRING_FIELD(kicked);
180                 AST_STRING_FIELD(muted);
181                 AST_STRING_FIELD(unmuted);
182                 AST_STRING_FIELD(onlyone);
183                 AST_STRING_FIELD(thereare);
184                 AST_STRING_FIELD(otherinparty);
185                 AST_STRING_FIELD(placeintoconf);
186                 AST_STRING_FIELD(waitforleader);
187                 AST_STRING_FIELD(leaderhasleft);
188                 AST_STRING_FIELD(getpin);
189                 AST_STRING_FIELD(invalidpin);
190                 AST_STRING_FIELD(onlyperson);
191                 AST_STRING_FIELD(locked);
192                 AST_STRING_FIELD(lockednow);
193                 AST_STRING_FIELD(unlockednow);
194                 AST_STRING_FIELD(errormenu);
195                 AST_STRING_FIELD(leave);
196                 AST_STRING_FIELD(join);
197                 AST_STRING_FIELD(participantsmuted);
198                 AST_STRING_FIELD(participantsunmuted);
199                 AST_STRING_FIELD(begin);
200         );
201 };
202
203 struct bridge_profile {
204         char name[MAX_PROFILE_NAME];
205         char language[MAX_LANGUAGE];              /*!< Language used for playback_chan */
206         char rec_file[PATH_MAX];
207         char rec_options[128];
208         char rec_command[128];
209         unsigned int flags;
210         unsigned int max_members;          /*!< The maximum number of participants allowed in the conference */
211         unsigned int internal_sample_rate; /*!< The internal sample rate of the bridge. 0 when set to auto adjust mode. */
212         unsigned int mix_interval;  /*!< The internal mixing interval used by the bridge. When set to 0 the bridgewill use a default interval. */
213         struct bridge_profile_sounds *sounds;
214         char regcontext[AST_MAX_CONTEXT];
215 };
216
217 /*! \brief The structure that represents a conference bridge */
218 struct confbridge_conference {
219         char name[MAX_CONF_NAME];                                         /*!< Name of the conference bridge */
220         struct confbridge_state *state;                                   /*!< Conference state information */
221         struct ast_bridge *bridge;                                        /*!< Bridge structure doing the mixing */
222         struct bridge_profile b_profile;                                  /*!< The Bridge Configuration Profile */
223         unsigned int activeusers;                                         /*!< Number of active users present */
224         unsigned int markedusers;                                         /*!< Number of marked users present */
225         unsigned int waitingusers;                                        /*!< Number of waiting users present */
226         unsigned int locked:1;                                            /*!< Is this conference bridge locked? */
227         unsigned int muted:1;                                             /*!< Is this conference bridge muted? */
228         struct ast_channel *playback_chan;                                /*!< Channel used for playback into the conference bridge */
229         struct ast_channel *record_chan;                                  /*!< Channel used for recording the conference */
230         struct ast_str *record_filename;                                  /*!< Recording filename. */
231         struct ast_str *orig_rec_file;                                    /*!< Previous b_profile.rec_file. */
232         AST_LIST_HEAD_NOLOCK(, confbridge_user) active_list;              /*!< List of users participating in the conference bridge */
233         AST_LIST_HEAD_NOLOCK(, confbridge_user) waiting_list;             /*!< List of users waiting to join the conference bridge */
234         struct ast_taskprocessor *playback_queue;                         /*!< Queue for playing back bridge announcements and managing the announcer channel */
235 };
236
237 extern struct ao2_container *conference_bridges;
238
239 struct post_join_action {
240         int (*func)(struct confbridge_user *user);
241         AST_LIST_ENTRY(post_join_action) list;
242 };
243
244 /*! \brief The structure that represents a conference bridge user */
245 struct confbridge_user {
246         struct confbridge_conference *conference;    /*!< Conference bridge they are participating in */
247         struct bridge_profile b_profile;             /*!< The Bridge Configuration Profile */
248         struct user_profile u_profile;               /*!< The User Configuration Profile */
249         char menu_name[MAX_PROFILE_NAME];            /*!< The name of the DTMF menu assigned to this user */
250         char name_rec_location[PATH_MAX];            /*!< Location of the User's name recorded file if it exists */
251         struct ast_channel *chan;                    /*!< Asterisk channel participating */
252         struct ast_bridge_features features;         /*!< Bridge features structure */
253         struct ast_bridge_tech_optimizations tech_args; /*!< Bridge technology optimizations for talk detection */
254         unsigned int suspended_moh;                  /*!< Count of active suspended MOH actions. */
255         unsigned int muted:1;                        /*!< Has the user requested to be muted? */
256         unsigned int kicked:1;                       /*!< User has been kicked from the conference */
257         unsigned int playing_moh:1;                  /*!< MOH is currently being played to the user */
258         AST_LIST_HEAD_NOLOCK(, post_join_action) post_join_list; /*!< List of sounds to play after joining */;
259         AST_LIST_ENTRY(confbridge_user) list;        /*!< Linked list information */
260 };
261
262 /*! \brief load confbridge.conf file */
263 int conf_load_config(void);
264
265 /*! \brief reload confbridge.conf file */
266 int conf_reload_config(void);
267
268 /*! \brief destroy the information loaded from the confbridge.conf file*/
269 void conf_destroy_config(void);
270
271 /*!
272  * \brief find a user profile given a user profile's name and store
273  * that profile in result structure.
274  *
275  * \param chan channel the user profile is requested for
276  * \param user_profile_name name of the profile requested (optional)
277  * \param result data contained by the user profile will be copied to this struct pointer
278  *
279  * \details If user_profile_name is not provided, this function will
280  * check for the presence of a user profile set by the CONFBRIDGE
281  * function on a channel datastore. If that doesn't exist, the
282  * default_user profile is used.
283  *
284  * \retval user profile on success
285  * \retval NULL on failure
286  */
287 const struct user_profile *conf_find_user_profile(struct ast_channel *chan, const char *user_profile_name, struct user_profile *result);
288
289 /*!
290  * \brief Find a bridge profile given a bridge profile's name and store
291  * that profile in result structure.
292  *
293  * \param chan channel the bridge profile is requested for
294  * \param bridge_profile_name name of the profile requested (optional)
295  * \param result data contained by the bridge profile will be copied to this struct pointer
296  *
297  * \details If bridge_profile_name is not provided, this function will
298  * check for the presence of a bridge profile set by the CONFBRIDGE
299  * function on a channel datastore. If that doesn't exist, the
300  * default_bridge profile is used.
301  *
302  * \retval bridge profile on success
303  * \retval NULL on failure
304  */
305 const struct bridge_profile *conf_find_bridge_profile(struct ast_channel *chan, const char *bridge_profile_name, struct bridge_profile *result);
306
307 /*!
308  * \brief find a menu profile given a menu profile's name and apply
309  * the menu in DTMF hooks.
310  *
311  * \param chan channel the menu profile is requested for
312  * \param user user profile the menu is being applied to
313  * \param menu_profile_name name of the profile requested (optional)
314  *
315  * \details If menu_profile_name is not provided, this function will
316  * check for the presence of a menu profile set by the CONFBRIDGE
317  * function on a channel datastore. If that doesn't exist, the
318  * default_menu profile is used.
319  *
320  * \retval 0 on success
321  * \retval -1 on failure
322  */
323 int conf_set_menu_to_user(struct ast_channel *chan, struct confbridge_user *user, const char *menu_profile_name);
324
325 /*!
326  * \brief Destroy a bridge profile found by 'conf_find_bridge_profile'
327  */
328 void conf_bridge_profile_destroy(struct bridge_profile *b_profile);
329
330 /*!
331  * \brief copies a bridge profile
332  * \note conf_bridge_profile_destroy must be called on the dst structure
333  */
334 void conf_bridge_profile_copy(struct bridge_profile *dst, struct bridge_profile *src);
335
336 /*!
337  * \brief Finds a menu_entry in a menu structure matched by DTMF sequence.
338  *
339  * \note the menu entry found must be destroyed using conf_menu_entry_destroy()
340  *
341  * \retval 1 success, entry is found and stored in result
342  * \retval 0 failure, no entry found for given DTMF sequence
343  */
344 int conf_find_menu_entry_by_sequence(const char *dtmf_sequence, struct conf_menu *menu, struct conf_menu_entry *result);
345
346 /*!
347  * \brief Destroys and frees all the actions stored in a menu_entry structure
348  */
349 void conf_menu_entry_destroy(struct conf_menu_entry *menu_entry);
350
351 /*!
352  * \brief Once a DTMF sequence matches a sequence in the user's DTMF menu, this function will get
353  * called to perform the menu action.
354  *
355  * \param bridge_channel Bridged channel this is involving
356  * \param user the conference user to perform the action on.
357  * \param menu_entry the menu entry that invoked this callback to occur.
358  * \param menu an AO2 referenced pointer to the entire menu structure the menu_entry
359  *        derived from.
360  *
361  * \note The menu_entry is a deep copy of the entry found in the menu structure.  This allows
362  * for the menu_entry to be accessed without requiring the menu lock.  If the menu must
363  * be accessed, the menu lock must be held.  Reference counting of the menu structure is
364  * handled outside of the scope of this function.
365  *
366  * \retval 0 success
367  * \retval -1 failure
368  */
369 int conf_handle_dtmf(
370         struct ast_bridge_channel *bridge_channel,
371         struct confbridge_user *user,
372         struct conf_menu_entry *menu_entry,
373         struct conf_menu *menu);
374
375
376 /*! \brief Looks to see if sound file is stored in bridge profile sounds, if not
377  *  default sound is provided.*/
378 const char *conf_get_sound(enum conf_sounds sound, struct bridge_profile_sounds *custom_sounds);
379
380 int func_confbridge_helper(struct ast_channel *chan, const char *cmd, char *data, const char *value);
381
382 /*!
383  * \brief Play sound file into conference bridge
384  *
385  * \param conference The conference bridge to play sound file into
386  * \param filename Sound file to play
387  *
388  * \retval 0 success
389  * \retval -1 failure
390  */
391 int play_sound_file(struct confbridge_conference *conference, const char *filename);
392
393 /*!
394  * \brief Play sound file into conference bridge asynchronously
395  *
396  * If the initiator parameter is non-NULL, then the playback will wait for
397  * that initiator channel to get back in the bridge before playing the sound
398  * file. This way, the initiator has no danger of hearing a "clipped" file.
399  *
400  * \param conference The conference bridge to play sound file into
401  * \param filename Sound file to play
402  * \param initiator Channel that initiated playback.
403  *
404  * \retval 0 success
405  * \retval -1 failure
406  */
407 int async_play_sound_file(struct confbridge_conference *conference, const char *filename,
408         struct ast_channel *initiator);
409
410 /*!
411  * \brief Indicate the initiator of an async sound file is ready for it to play.
412  *
413  * When playing an async sound file, the initiator is typically either out of the bridge
414  * or not in a position to hear the queued announcement. This function lets the announcement
415  * thread know that the initiator is now ready for the sound to play.
416  *
417  * If an async announcement was queued and no initiator channel was provided, then this is
418  * a no-op
419  *
420  * \param chan The channel that initiated the async announcement
421  */
422 void async_play_sound_ready(struct ast_channel *chan);
423
424 /*! \brief Callback to be called when the conference has become empty
425  * \param conference The conference bridge
426  */
427 void conf_ended(struct confbridge_conference *conference);
428
429 /*!
430  * \brief Update the actual mute status of the user and set it on the bridge.
431  *
432  * \param user User to update the mute status.
433  *
434  * \return Nothing
435  */
436 void conf_update_user_mute(struct confbridge_user *user);
437
438 /*!
439  * \brief Stop MOH for the conference user.
440  *
441  * \param user Conference user to stop MOH on.
442  *
443  * \return Nothing
444  */
445 void conf_moh_stop(struct confbridge_user *user);
446
447 /*!
448  * \brief Start MOH for the conference user.
449  *
450  * \param user Conference user to start MOH on.
451  *
452  * \return Nothing
453  */
454 void conf_moh_start(struct confbridge_user *user);
455
456 /*! \brief Attempt to mute/play MOH to the only user in the conference if they require it
457  * \param conference A conference bridge containing a single user
458  */
459 void conf_mute_only_active(struct confbridge_conference *conference);
460
461 /*! \brief Callback to execute any time we transition from zero to one active users
462  * \param conference The conference bridge with a single active user joined
463  * \retval 0 success
464  * \retval -1 failure
465  */
466 void conf_handle_first_join(struct confbridge_conference *conference);
467
468 /*! \brief Handle actions every time a waitmarked user joins w/o a marked user present
469  * \param user The waitmarked user
470  * \retval 0 success
471  * \retval -1 failure
472  */
473 int conf_handle_inactive_waitmarked(struct confbridge_user *user);
474
475 /*! \brief Handle actions whenever an unmarked user joins an inactive conference
476  * \note These actions seem like they could apply just as well to a marked user
477  * and possibly be made to happen any time transitioning to a single state.
478  *
479  * \param user The unmarked user
480  */
481 int conf_handle_only_unmarked(struct confbridge_user *user);
482
483 /*! \brief Handle when a conference moves to having more than one active participant
484  * \param conference The conference bridge with more than one active participant
485  */
486 void conf_handle_second_active(struct confbridge_conference *conference);
487
488 /*! \brief Add a conference bridge user as an unmarked active user of the conference
489  * \param conference The conference bridge to add the user to
490  * \param user The conference bridge user to add to the conference
491  */
492 void conf_add_user_active(struct confbridge_conference *conference, struct confbridge_user *user);
493
494 /*! \brief Add a conference bridge user as a marked active user of the conference
495  * \param conference The conference bridge to add the user to
496  * \param user The conference bridge user to add to the conference
497  */
498 void conf_add_user_marked(struct confbridge_conference *conference, struct confbridge_user *user);
499
500 /*! \brief Add a conference bridge user as an waiting user of the conference
501  * \param conference The conference bridge to add the user to
502  * \param user The conference bridge user to add to the conference
503  */
504 void conf_add_user_waiting(struct confbridge_conference *conference, struct confbridge_user *user);
505
506 /*! \brief Remove a conference bridge user from the unmarked active conference users in the conference
507  * \param conference The conference bridge to remove the user from
508  * \param user The conference bridge user to remove from the conference
509  */
510 void conf_remove_user_active(struct confbridge_conference *conference, struct confbridge_user *user);
511
512 /*! \brief Remove a conference bridge user from the marked active conference users in the conference
513  * \param conference The conference bridge to remove the user from
514  * \param user The conference bridge user to remove from the conference
515  */
516 void conf_remove_user_marked(struct confbridge_conference *conference, struct confbridge_user *user);
517
518 /*! \brief Remove a conference bridge user from the waiting conference users in the conference
519  * \param conference The conference bridge to remove the user from
520  * \param user The conference bridge user to remove from the conference
521  */
522 void conf_remove_user_waiting(struct confbridge_conference *conference, struct confbridge_user *user);
523
524 /*! \brief Queue a function to run with the given conference bridge user as an argument once the state transition is complete
525  * \param user The conference bridge user to pass to the function
526  * \param func The function to queue
527  * \retval 0 success
528  * \retval non-zero failure
529  */
530 int conf_add_post_join_action(struct confbridge_user *user, int (*func)(struct confbridge_user *user));
531
532 /*!
533  * \since 12.0
534  * \brief get the confbridge start stasis message type
535  *
536  * \retval stasis message type for confbridge start messages if it's available
537  * \retval NULL if it isn't
538  */
539 struct stasis_message_type *confbridge_start_type(void);
540
541 /*!
542  * \since 12.0
543  * \brief get the confbridge end stasis message type
544  *
545  * \retval stasis message type for confbridge end messages if it's available
546  * \retval NULL if it isn't
547  */
548 struct stasis_message_type *confbridge_end_type(void);
549
550 /*!
551  * \since 12.0
552  * \brief get the confbridge join stasis message type
553  *
554  * \retval stasis message type for confbridge join messages if it's available
555  * \retval NULL if it isn't
556  */
557 struct stasis_message_type *confbridge_join_type(void);
558
559 /*!
560  * \since 12.0
561  * \brief get the confbridge leave stasis message type
562  *
563  * \retval stasis message type for confbridge leave messages if it's available
564  * \retval NULL if it isn't
565  */
566 struct stasis_message_type *confbridge_leave_type(void);
567
568 /*!
569  * \since 12.0
570  * \brief get the confbridge start_record stasis message type
571  *
572  * \retval stasis message type for confbridge start_record messages if it's available
573  * \retval NULL if it isn't
574  */
575 struct stasis_message_type *confbridge_start_record_type(void);
576
577 /*!
578  * \since 12.0
579  * \brief get the confbridge stop_record stasis message type
580  *
581  * \retval stasis message type for confbridge stop_record messages if it's available
582  * \retval NULL if it isn't
583  */
584 struct stasis_message_type *confbridge_stop_record_type(void);
585
586 /*!
587  * \since 12.0
588  * \brief get the confbridge mute stasis message type
589  *
590  * \retval stasis message type for confbridge mute messages if it's available
591  * \retval NULL if it isn't
592  */
593 struct stasis_message_type *confbridge_mute_type(void);
594
595 /*!
596  * \since 12.0
597  * \brief get the confbridge unmute stasis message type
598  *
599  * \retval stasis message type for confbridge unmute messages if it's available
600  * \retval NULL if it isn't
601  */
602 struct stasis_message_type *confbridge_unmute_type(void);
603
604 /*!
605  * \since 12.0
606  * \brief get the confbridge talking stasis message type
607  *
608  * \retval stasis message type for confbridge talking messages if it's available
609  * \retval NULL if it isn't
610  */
611 struct stasis_message_type *confbridge_talking_type(void);
612
613 /*!
614  * \since 12.0
615  * \brief register stasis message routers to handle manager events for confbridge messages
616  *
617  * \retval 0 success
618  * \retval non-zero failure
619  */
620 int manager_confbridge_init(void);
621
622 /*!
623  * \since 12.0
624  * \brief unregister stasis message routers to handle manager events for confbridge messages
625  */
626 void manager_confbridge_shutdown(void);
627
628 /*!
629  * \brief Get ConfBridge record channel technology struct.
630  * \since 12.0.0
631  *
632  * \return ConfBridge record channel technology.
633  */
634 struct ast_channel_tech *conf_record_get_tech(void);
635
636 /*!
637  * \brief Get ConfBridge announce channel technology struct.
638  * \since 12.0.0
639  *
640  * \return ConfBridge announce channel technology.
641  */
642 struct ast_channel_tech *conf_announce_get_tech(void);
643
644 /*!
645  * \brief Push the announcer channel into the conference.
646  * \since 12.0.0
647  *
648  * \param ast Either channel in the announcer channel pair.
649  *
650  * \retval 0 on success.
651  * \retval -1 on error.
652  */
653 int conf_announce_channel_push(struct ast_channel *ast);
654 #endif