mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
Extract a useful routine from the softmix bridge technology.
* Extract a useful routine from the softmix bridge technology for other technologies. Make other technologies use it if they can. * Made native and 1-1 bridges write to all parties if the bridge channel writing the frame into the bridge is NULL. Softmix will also do the same for frame types that make sense. * Tweak the bridge write routine return value meaning and adjust the bridge technologies to match. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@392514 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -255,27 +255,25 @@ static void holding_bridge_leave(struct ast_bridge *bridge, struct ast_bridge_ch
|
||||
|
||||
static int holding_bridge_write(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)
|
||||
{
|
||||
struct ast_bridge_channel *cur;
|
||||
struct holding_channel *hc = bridge_channel->tech_pvt;
|
||||
struct holding_channel *hc = bridge_channel ? bridge_channel->tech_pvt : NULL;
|
||||
|
||||
/* If there is no tech_pvt, then the channel failed to allocate one when it joined and is borked. Don't listen to him. */
|
||||
if (!hc) {
|
||||
return -1;
|
||||
/* "Accept" the frame and discard it. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If we aren't an announcer, we never have any business writing anything. */
|
||||
if (!ast_test_flag(&hc->holding_roles, HOLDING_ROLE_ANNOUNCER)) {
|
||||
return -1;
|
||||
/* "Accept" the frame and discard it. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Ok, so we are the announcer and there are one or more people available to receive our writes. Let's do it. */
|
||||
AST_LIST_TRAVERSE(&bridge->channels, cur, entry) {
|
||||
if (bridge_channel == cur || !cur->tech_pvt) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ast_bridge_channel_queue_frame(cur, frame);
|
||||
}
|
||||
/*
|
||||
* Ok, so we are the announcer. Write the frame to all other
|
||||
* channels if any.
|
||||
*/
|
||||
ast_bridge_queue_everyone_else(bridge, bridge_channel, frame);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user