From 687597ca8c2412f79b79f9b13e17f3ec0ff0ce0c Mon Sep 17 00:00:00 2001 From: Jonathan Rose Date: Thu, 16 Jul 2015 12:16:25 -0500 Subject: holding_bridge: ensure moh participants get frames Currently, if a blank musiconhold.conf is used, musiconhold will fail to start for a channel going into a holding bridge with an anticipation of getting music on hold. That being the case, no frames will be written to the channel and that can pose a problem for blind transfers in PJSIP which may rely on frames being written to get past the REFER framehook. This patch makes holding bridges start a silence generator if starting music on hold fails and makes it so that if no music on hold functions are installed that the ast_moh_start function will report a failure so that consumers of that function will be able to respond appropriately. ASTERISK-25271 #close Change-Id: I06f066728604943cba0bb0b39fa7cf658a21cd99 (cherry picked from commit 8458b8d441c2f4143ff135163ff3da4f88fe14c8) --- bridges/bridge_holding.c | 6 +++++- main/channel.c | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/bridges/bridge_holding.c b/bridges/bridge_holding.c index 501ef9fa5..7bf7a3922 100644 --- a/bridges/bridge_holding.c +++ b/bridges/bridge_holding.c @@ -205,7 +205,11 @@ static void participant_entertainment_start(struct ast_bridge_channel *bridge_ch switch(hc->idle_mode) { case IDLE_MODE_MOH: moh_class = ast_bridge_channel_get_role_option(bridge_channel, "holding_participant", "moh_class"); - ast_moh_start(bridge_channel->chan, moh_class, NULL); + if (ast_moh_start(bridge_channel->chan, moh_class, NULL)) { + ast_log(LOG_WARNING, "Failed to start moh, starting silence generator instead\n"); + hc->idle_mode = IDLE_MODE_SILENCE; + hc->silence_generator = ast_channel_start_silence_generator(bridge_channel->chan); + } break; case IDLE_MODE_RINGING: ast_indicate(bridge_channel->chan, AST_CONTROL_RINGING); diff --git a/main/channel.c b/main/channel.c index 935ac2835..268f4cd51 100644 --- a/main/channel.c +++ b/main/channel.c @@ -7403,7 +7403,7 @@ int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *inte ast_verb(3, "Music class %s requested but no musiconhold loaded.\n", mclass ? mclass : (interpclass ? interpclass : "default")); - return 0; + return -1; } void ast_moh_stop(struct ast_channel *chan) -- cgit v1.2.3