diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asterisk/bridge.h | 3 | ||||
-rw-r--r-- | include/asterisk/bridge_channel.h | 27 | ||||
-rw-r--r-- | include/asterisk/bridge_technology.h | 19 | ||||
-rw-r--r-- | include/asterisk/channel.h | 13 | ||||
-rw-r--r-- | include/asterisk/channel_internal.h | 2 | ||||
-rw-r--r-- | include/asterisk/stream.h | 23 |
6 files changed, 86 insertions, 1 deletions
diff --git a/include/asterisk/bridge.h b/include/asterisk/bridge.h index ffe08da13..a9b01a6bb 100644 --- a/include/asterisk/bridge.h +++ b/include/asterisk/bridge.h @@ -323,6 +323,9 @@ struct ast_bridge { /*! Immutable bridge UUID. */ AST_STRING_FIELD(uniqueid); ); + + /*! Type mapping used for media routing */ + struct ast_vector_int media_types; }; /*! \brief Bridge base class virtual method table. */ diff --git a/include/asterisk/bridge_channel.h b/include/asterisk/bridge_channel.h index a7971df27..dd72f3275 100644 --- a/include/asterisk/bridge_channel.h +++ b/include/asterisk/bridge_channel.h @@ -183,6 +183,12 @@ struct ast_bridge_channel { unsigned int padding:30; }; }; + struct { + /*! An index mapping of where a channel's media needs to be routed */ + struct ast_vector_int to_bridge; + /*! An index mapping of where a bridge's media needs to be routed */ + struct ast_vector_int to_channel; + } stream_map; }; /*! @@ -704,6 +710,27 @@ void ast_bridge_channel_feature_digit_add(struct ast_bridge_channel *bridge_chan */ void ast_bridge_channel_feature_digit(struct ast_bridge_channel *bridge_channel, int digit); +/*! + * \brief Maps a channel's stream topology to and from the bridge + * \since 15.0.0 + * + * When a channel joins a bridge or its associated stream topology is updated, each stream + * in the topology needs to be mapped according to its media type to the bridge. Calling + * this method creates a mapping of each stream on the channel indexed to the bridge's + * supported media types and vice versa (i.e. bridge's media types indexed to channel + * streams). + * + * The first channel to join the bridge creates the initial order for the bridge's media + * types (e.g. a one to one mapping is made). Subsequently added channels are mapped to + * that order adding more media types if/when the newly added channel has more streams + * and/or media types specified by the bridge. + * + * \param bridge_channel Channel to map + * + * \return Nothing + */ +void ast_bridge_channel_stream_map(struct ast_bridge_channel *bridge_channel); + #if defined(__cplusplus) || defined(c_plusplus) } #endif diff --git a/include/asterisk/bridge_technology.h b/include/asterisk/bridge_technology.h index 843d93ccf..09b0fc0e8 100644 --- a/include/asterisk/bridge_technology.h +++ b/include/asterisk/bridge_technology.h @@ -158,6 +158,25 @@ struct ast_bridge_technology { * \note On entry, bridge is already locked. */ int (*write)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_frame *frame); + /*! + * \brief Callback for when a request has been made to change a stream topology on a channel + * + * This is called when a bridge receives a request to change the topology on the channel. A bridge + * technology should define a handler for this callback if it needs to update internals or intercept + * the request and not pass it on to other channels. This can be done by returning a nonzero value. + * + * \retval 0 Frame accepted by the bridge. + * \retval -1 Frame rejected. + */ + int (*stream_topology_request_change)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel); + /*! + * \brief Callback for when a stream topology changes on the channel + * + * This is called when a bridge receives an indication that a topology has been changed on a channel + * and the new topology has been mapped to the bridge. A bridge technology should define a handler for + * this callback if it needs to update internals due to a channel's topology changing. + */ + void (*stream_topology_changed)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel); /*! TRUE if the bridge technology is currently suspended. */ unsigned int suspended:1; /*! Module this bridge technology belongs to. It is used for reference counting bridges using the technology. */ diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 128cd3056..889d3ff07 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -4904,6 +4904,7 @@ int ast_channel_is_multistream(struct ast_channel *chan); * * \param chan The channel to change * \param topology The new stream topology + * \param change_source The source that initiated the change * * \pre chan is locked * @@ -4918,7 +4919,8 @@ int ast_channel_is_multistream(struct ast_channel *chan); * \note This interface is provided for applications and resources to request that the topology change. * It is not for use by the channel driver itself. */ -int ast_channel_request_stream_topology_change(struct ast_channel *chan, struct ast_stream_topology *topology); +int ast_channel_request_stream_topology_change(struct ast_channel *chan, + struct ast_stream_topology *topology, void *change_source); /*! * \brief Provide notice to a channel that the stream topology has changed @@ -4936,4 +4938,13 @@ int ast_channel_request_stream_topology_change(struct ast_channel *chan, struct */ int ast_channel_stream_topology_changed(struct ast_channel *chan, struct ast_stream_topology *topology); +/*! + * \brief Retrieve the source that initiated the last stream topology change + * + * \param chan The channel + * + * \retval The channel's stream topology change source + */ +void *ast_channel_get_stream_topology_change_source(struct ast_channel *chan); + #endif /* _ASTERISK_CHANNEL_H */ diff --git a/include/asterisk/channel_internal.h b/include/asterisk/channel_internal.h index 3de2b14aa..dd791a416 100644 --- a/include/asterisk/channel_internal.h +++ b/include/asterisk/channel_internal.h @@ -29,5 +29,7 @@ void ast_channel_internal_errno_set(enum ast_channel_error error); enum ast_channel_error ast_channel_internal_errno(void); void ast_channel_internal_set_stream_topology(struct ast_channel *chan, struct ast_stream_topology *topology); +void ast_channel_internal_set_stream_topology_change_source( + struct ast_channel *chan, void *change_source); void ast_channel_internal_swap_stream_topology(struct ast_channel *chan1, struct ast_channel *chan2); diff --git a/include/asterisk/stream.h b/include/asterisk/stream.h index 1e07407a9..1bb34b72a 100644 --- a/include/asterisk/stream.h +++ b/include/asterisk/stream.h @@ -27,6 +27,7 @@ #define _AST_STREAM_H_ #include "asterisk/codec.h" +#include "asterisk/vector.h" /*! * \brief Forward declaration for a stream, as it is opaque @@ -43,6 +44,11 @@ struct ast_format_cap; */ struct ast_stream_topology; +/*! + * \brief A mapping of two topologies. + */ +struct ast_stream_topology_map; + typedef void (*ast_stream_data_free_fn)(void *); /*! @@ -405,4 +411,21 @@ struct ast_stream *ast_stream_topology_get_first_stream_by_type( const struct ast_stream_topology *topology, enum ast_media_type type); +/*! + * \brief Map a given topology's streams to the given types. + * + * \note The given vectors in which mapping values are placed are reset by + * this function. This means if those vectors already contain mapping + * values they will be lost. + * + * \param topology The topology to map + * \param types The media types to be mapped + * \param v0 Index mapping of topology to types + * \param v1 Index mapping of types to topology + * + * \since 15 + */ +void ast_stream_topology_map(const struct ast_stream_topology *topology, + struct ast_vector_int *types, struct ast_vector_int *v0, struct ast_vector_int *v1); + #endif /* _AST_STREAM_H */ |