Merged revisions 73512 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Thu, 5 Jul 2007 20:51:08 +0000 (20:51 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 5 Jul 2007 20:51:08 +0000 (20:51 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r73512 | russell | 2007-07-05 15:50:08 -0500 (Thu, 05 Jul 2007) | 5 lines

Pass HOLD and UNHOLD frames to the other channel when they are returned from a
native bridge function.  This fixes a problem where when two zap channels are
natively bridged and one does a flash hook, the other channel did not receive
music on hold.  (Reported to me directly by Doug Bailey at Digium)

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@73513 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_features.c

index 629fea3..213fdbe 100644 (file)
@@ -1749,17 +1749,24 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
                /* many things should be sent to the 'other' channel */
                other = (who == chan) ? peer : chan;
                if (f->frametype == AST_FRAME_CONTROL) {
-                       if (f->subclass == AST_CONTROL_RINGING)
-                               ast_indicate(other, AST_CONTROL_RINGING);
-                       else if (f->subclass == -1)
-                               ast_indicate(other, -1);
-                       else if (f->subclass == AST_CONTROL_FLASH)
-                               ast_indicate(other, AST_CONTROL_FLASH);
-                       else if (f->subclass == AST_CONTROL_OPTION) {
+                       switch (f->subclass) {
+                       case AST_CONTROL_RINGING:
+                       case AST_CONTROL_FLASH:
+                       case -1:
+                               ast_indicate(other, f->subclass);
+                               break;
+                       case AST_CONTROL_HOLD:
+                       case AST_CONTROL_UNHOLD:
+                               ast_indicate_data(other, f->subclass, f->data, f->datalen);
+                               break;
+                       case AST_CONTROL_OPTION:
                                aoh = f->data;
                                /* Forward option Requests */
-                               if (aoh && aoh->flag == AST_OPTION_FLAG_REQUEST)
-                                       ast_channel_setoption(other, ntohs(aoh->option), aoh->data, f->datalen - sizeof(struct ast_option_header), 0);
+                               if (aoh && aoh->flag == AST_OPTION_FLAG_REQUEST) {
+                                       ast_channel_setoption(other, ntohs(aoh->option), aoh->data, 
+                                               f->datalen - sizeof(struct ast_option_header), 0);
+                               }
+                               break;
                        }
                } else if (f->frametype == AST_FRAME_DTMF_BEGIN) {
                        /* eat it */