|
|
|
@ -672,6 +672,30 @@ static void softmix_bridge_write_voice(struct ast_bridge *bridge, struct ast_bri
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \internal
|
|
|
|
|
* \brief Clear talking flag, stop contributing to mixing and notify handlers.
|
|
|
|
|
* \since 13.21.0, 15.4.0
|
|
|
|
|
*
|
|
|
|
|
* \param bridge_channel Which channel's talking to clear
|
|
|
|
|
*
|
|
|
|
|
* \return Nothing
|
|
|
|
|
*/
|
|
|
|
|
static void clear_talking(struct ast_bridge_channel *bridge_channel)
|
|
|
|
|
{
|
|
|
|
|
struct softmix_channel *sc = bridge_channel->tech_pvt;
|
|
|
|
|
|
|
|
|
|
if (sc->talking) {
|
|
|
|
|
ast_mutex_lock(&sc->lock);
|
|
|
|
|
ast_slinfactory_flush(&sc->factory);
|
|
|
|
|
sc->talking = 0;
|
|
|
|
|
ast_mutex_unlock(&sc->lock);
|
|
|
|
|
|
|
|
|
|
/* Notify that we are no longer talking. */
|
|
|
|
|
ast_bridge_channel_notify_talking(bridge_channel, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \internal
|
|
|
|
|
* \brief Check for voice status updates.
|
|
|
|
@ -684,23 +708,14 @@ static void softmix_bridge_write_voice(struct ast_bridge *bridge, struct ast_bri
|
|
|
|
|
*/
|
|
|
|
|
static void softmix_bridge_check_voice(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
|
|
|
|
|
{
|
|
|
|
|
struct softmix_channel *sc = bridge_channel->tech_pvt;
|
|
|
|
|
|
|
|
|
|
if (sc->talking
|
|
|
|
|
&& bridge_channel->features->mute) {
|
|
|
|
|
if (bridge_channel->features->mute) {
|
|
|
|
|
/*
|
|
|
|
|
* We were muted while we were talking.
|
|
|
|
|
*
|
|
|
|
|
* Immediately stop contributing to mixing
|
|
|
|
|
* and report no longer talking.
|
|
|
|
|
*/
|
|
|
|
|
ast_mutex_lock(&sc->lock);
|
|
|
|
|
ast_slinfactory_flush(&sc->factory);
|
|
|
|
|
sc->talking = 0;
|
|
|
|
|
ast_mutex_unlock(&sc->lock);
|
|
|
|
|
|
|
|
|
|
/* Notify that we are no longer talking. */
|
|
|
|
|
ast_bridge_channel_notify_talking(bridge_channel, 0);
|
|
|
|
|
clear_talking(bridge_channel);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -724,6 +739,17 @@ static int softmix_bridge_write_control(struct ast_bridge *bridge, struct ast_br
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
switch (frame->subclass.integer) {
|
|
|
|
|
case AST_CONTROL_HOLD:
|
|
|
|
|
/*
|
|
|
|
|
* Doing anything for holds in a conference bridge could be considered a bit
|
|
|
|
|
* odd. That being said, in most cases one would probably want the talking
|
|
|
|
|
* flag cleared when 'hold' is pressed by the remote endpoint, so go ahead
|
|
|
|
|
* and do that here. However, that is all we'll do. Meaning if for some reason
|
|
|
|
|
* the endpoint continues to send audio frames despite pressing 'hold' talking
|
|
|
|
|
* will once again be detected for that channel.
|
|
|
|
|
*/
|
|
|
|
|
clear_talking(bridge_channel);
|
|
|
|
|
break;
|
|
|
|
|
case AST_CONTROL_VIDUPDATE:
|
|
|
|
|
ast_bridge_queue_everyone_else(bridge, NULL, frame);
|
|
|
|
|
break;
|
|
|
|
|