diff --git a/bridges/bridge_native_rtp.c b/bridges/bridge_native_rtp.c index 4436f706af0ddb9daf918ae3145e781c9bcdcb2f..924686bbe749bda9d5fef6c89ae8db97ea78b7e2 100644 --- a/bridges/bridge_native_rtp.c +++ b/bridges/bridge_native_rtp.c @@ -45,7 +45,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/bridging_technology.h" #include "asterisk/frame.h" #include "asterisk/rtp_engine.h" -#include "asterisk/audiohook.h" /*! \brief Forward declarations for frame hook usage */ static int native_rtp_bridge_join(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel); @@ -85,13 +84,7 @@ static struct ast_frame *native_rtp_framehook(struct ast_channel *chan, struct a /*! \brief Internal helper function which checks whether the channels are compatible with our native bridging */ static int native_rtp_bridge_capable(struct ast_channel *chan) { - if (ast_channel_monitor(chan) || (ast_channel_audiohooks(chan) && - !ast_audiohook_write_list_empty(ast_channel_audiohooks(chan))) || - !ast_framehook_list_contains_no_active(ast_channel_framehooks(chan))) { - return 0; - } else { - return 1; - } + return ast_channel_has_audio_frame_or_monitor(chan); } /*! \brief Internal helper function which gets all RTP information (glue and instances) relating to the given channels */ diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index b2b6e603587a1d1480af567e1598bb4721d6279b..d8db4705d073080fa5324a6843d4dab25476f8f2 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -4335,6 +4335,16 @@ int ast_channel_forward_endpoint(struct ast_channel *chan, struct ast_endpoint * */ const char *ast_channel_oldest_linkedid(const char *a, const char *b); +/*! + * \brief Check if the channel has active audiohooks, active framehooks, or a monitor. + * \since 12.0.0 + * + * \param chan The channel to check. + * + * \retval non-zero if channel has active audiohooks, framehooks, or monitor. + */ +int ast_channel_has_audio_frame_or_monitor(struct ast_channel *chan); + /*! * \brief Removes the trailing identifiers from a channel name string * \since 12.0.0 diff --git a/main/bridging.c b/main/bridging.c index 4304dfb3655725ef15061f8cfdf2482a7a89950c..f833ccb8100a1cf1f93e68804eab7db9f06868f7 100644 --- a/main/bridging.c +++ b/main/bridging.c @@ -63,7 +63,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/core_local.h" #include "asterisk/core_unreal.h" #include "asterisk/features_config.h" -#include "asterisk/audiohook.h" /*! All bridges container. */ static struct ao2_container *bridges; @@ -4722,10 +4721,7 @@ static struct ast_bridge *optimize_lock_chan_stack(struct ast_channel *chan) if (!AST_LIST_EMPTY(ast_channel_readq(chan))) { return NULL; } - if (ast_channel_monitor(chan) - || (ast_channel_audiohooks(chan) - && !ast_audiohook_write_list_empty(ast_channel_audiohooks(chan))) - || !ast_framehook_list_contains_no_active(ast_channel_framehooks(chan))) { + if (ast_channel_has_audio_frame_or_monitor(chan)) { /* Channel has an active monitor, audiohook, or framehook. */ return NULL; } @@ -4771,10 +4767,7 @@ static struct ast_bridge *optimize_lock_peer_stack(struct ast_channel *peer) ast_channel_unlock(peer); return NULL; } - if (ast_channel_monitor(peer) - || (ast_channel_audiohooks(peer) - && !ast_audiohook_write_list_empty(ast_channel_audiohooks(peer))) - || !ast_framehook_list_contains_no_active(ast_channel_framehooks(peer))) { + if (ast_channel_has_audio_frame_or_monitor(peer)) { /* Peer has an active monitor, audiohook, or framehook. */ ast_channel_unlock(peer); return NULL; diff --git a/main/channel.c b/main/channel.c index fba59d4df4adfa757e8ca0e1da51a313f5cfae1e..f76d6a845b775dc050b18c1ee818573d8afa91c5 100644 --- a/main/channel.c +++ b/main/channel.c @@ -2629,6 +2629,14 @@ void ast_set_hangupsource(struct ast_channel *chan, const char *source, int forc } } +int ast_channel_has_audio_frame_or_monitor(struct ast_channel *chan) +{ + return ast_channel_monitor(chan) + || (ast_channel_audiohooks(chan) + && !ast_audiohook_write_list_empty(ast_channel_audiohooks(chan))) + || !ast_framehook_list_contains_no_active(ast_channel_framehooks(chan)); +} + static void destroy_hooks(struct ast_channel *chan) { if (ast_channel_audiohooks(chan)) {