return 0;
}
+/*!
+ * \internal
+ * \brief Request the softmix mixing thread stop.
+ * \since 12.0.0
+ *
+ * \param bridge Which bridge is being stopped.
+ *
+ * \return Nothing
+ */
+static void softmix_bridge_stop(struct ast_bridge *bridge)
+{
+ struct softmix_bridge_data *softmix_data;
+
+ softmix_data = bridge->tech_pvt;
+ if (!softmix_data) {
+ return;
+ }
+
+ ast_mutex_lock(&softmix_data->lock);
+ softmix_data->stop = 1;
+ ast_mutex_unlock(&softmix_data->lock);
+}
+
/*! \brief Function called when a bridge is destroyed */
static void softmix_bridge_destroy(struct ast_bridge *bridge)
{
.capabilities = AST_BRIDGE_CAPABILITY_MULTIMIX,
.preference = AST_BRIDGE_PREFERENCE_BASE_MULTIMIX,
.create = softmix_bridge_create,
+ .stop = softmix_bridge_stop,
.destroy = softmix_bridge_destroy,
.join = softmix_bridge_join,
.leave = softmix_bridge_leave,
*/
int (*create)(struct ast_bridge *bridge);
/*!
+ * \brief Request a bridge technology instance stop in preparation for being destroyed.
+ *
+ * \note On entry, bridge is already locked.
+ */
+ void (*stop)(struct ast_bridge *bridge);
+ /*!
* \brief Destroy a bridging technology instance for a bridge.
*
* \note On entry, bridge must NOT be locked.
/* Pass off the bridge to the technology to destroy if needed */
if (bridge->technology) {
+ ast_debug(1, "Bridge %s: calling %s technology stop\n",
+ bridge->uniqueid, bridge->technology->name);
+ if (bridge->technology->stop) {
+ ast_bridge_lock(bridge);
+ bridge->technology->stop(bridge);
+ ast_bridge_unlock(bridge);
+ }
ast_debug(1, "Bridge %s: calling %s technology destructor\n",
bridge->uniqueid, bridge->technology->name);
if (bridge->technology->destroy) {
return -1;
}
+ ast_debug(1, "Bridge %s: calling %s technology stop\n",
+ dummy_bridge.uniqueid, old_technology->name);
+ if (old_technology->stop) {
+ old_technology->stop(&dummy_bridge);
+ }
+
/* Move existing channels over to the new technology. */
AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
if (bridge_channel->just_joined) {
*/
if (old_technology->destroy) {
ast_debug(1, "Bridge %s: deferring %s technology destructor\n",
- bridge->uniqueid, old_technology->name);
+ dummy_bridge.uniqueid, old_technology->name);
bridge_queue_action_nodup(bridge, deferred_action);
} else {
ast_debug(1, "Bridge %s: calling %s technology destructor\n",
- bridge->uniqueid, old_technology->name);
+ dummy_bridge.uniqueid, old_technology->name);
ast_module_unref(old_technology->mod);
}