mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-22 20:56:39 +00:00
If the RTP stack is already being operated in callback mode, then suspend it upon switching to P2P callback bridging. Once P2P callback bridging has ended, then restore callback mode.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@41303 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
14
main/rtp.c
14
main/rtp.c
@@ -173,6 +173,7 @@ static int bridge_p2p_rtcp_write(struct ast_rtp *rtp, unsigned int *rtcpheader,
|
||||
#define FLAG_HAS_DTMF (1 << 3)
|
||||
#define FLAG_P2P_SENT_MARK (1 << 4)
|
||||
#define FLAG_P2P_NEED_DTMF (1 << 5)
|
||||
#define FLAG_CALLBACK_MODE (1 << 6)
|
||||
|
||||
/*!
|
||||
* \brief Structure defining an RTCP session.
|
||||
@@ -1791,8 +1792,10 @@ struct ast_rtp *ast_rtp_new_with_bindaddr(struct sched_context *sched, struct io
|
||||
}
|
||||
rtp->sched = sched;
|
||||
rtp->io = io;
|
||||
if (callbackmode)
|
||||
if (callbackmode) {
|
||||
rtp->ioid = ast_io_add(rtp->io, rtp->s, rtpread, AST_IO_IN, rtp);
|
||||
ast_set_flag(rtp, FLAG_CALLBACK_MODE);
|
||||
}
|
||||
ast_rtp_pt_default(rtp);
|
||||
return rtp;
|
||||
}
|
||||
@@ -2785,6 +2788,12 @@ static int p2p_callback_enable(struct ast_channel *chan, struct ast_rtp *rtp, in
|
||||
if (ast_test_flag(rtp, FLAG_P2P_NEED_DTMF) || !rtp->io)
|
||||
return 0;
|
||||
|
||||
/* If the RTP structure is already in callback mode, remove it temporarily */
|
||||
if (rtp->ioid) {
|
||||
ast_io_remove(rtp->io, rtp->ioid);
|
||||
rtp->ioid = NULL;
|
||||
}
|
||||
|
||||
/* Steal the file descriptors from the channel and stash them away */
|
||||
fds[0] = chan->fds[0];
|
||||
fds[1] = chan->fds[1];
|
||||
@@ -2809,6 +2818,9 @@ static int p2p_callback_disable(struct ast_channel *chan, struct ast_rtp *rtp, i
|
||||
chan->fds[0] = fds[0];
|
||||
chan->fds[1] = fds[1];
|
||||
ast_channel_unlock(chan);
|
||||
/* Restore callback mode if previously used */
|
||||
if (ast_test_flag(rtp, FLAG_CALLBACK_MODE))
|
||||
rtp->ioid = ast_io_add(rtp->io, rtp->s, rtpread, AST_IO_IN, rtp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user