diff --git a/src/media/audio/audio_rtp_session.cpp b/src/media/audio/audio_rtp_session.cpp index cbb063064e34e6d3fd8bba5ae47878f947e1a200..afe335846da68bbf59e53c57b10dd9b3d7f69a62 100644 --- a/src/media/audio/audio_rtp_session.cpp +++ b/src/media/audio/audio_rtp_session.cpp @@ -382,7 +382,14 @@ AudioRtpSession::startSender() if (sender_) RING_WARN("Restarting audio sender"); + + // be sure to not send any packets before saving last RTP seq value + socketPair_->stopSendOp(); + if (sender_) + initSeqVal_ = sender_->getLastSeqValue() + 1; try { + sender_.reset(); + socketPair_->stopSendOp(false); sender_.reset(new AudioSender(callID_, getRemoteRtpUri(), send_, *socketPair_, initSeqVal_)); } catch (const MediaEncoderException &e) { @@ -395,9 +402,6 @@ void AudioRtpSession::restartSender() { std::lock_guard<std::recursive_mutex> lock(mutex_); - - // continue on last sequence number - initSeqVal_ = sender_->getLastSeqValue() + 1; startSender(); } diff --git a/src/media/socket_pair.cpp b/src/media/socket_pair.cpp index 9873a247ee0a6b7f9ae518fd323089e1dcf7a522..cadd00102bb0da63996747be561b3154b41ac03f 100644 --- a/src/media/socket_pair.cpp +++ b/src/media/socket_pair.cpp @@ -260,6 +260,12 @@ SocketPair::interrupt() cv_.notify_all(); } +void +SocketPair::stopSendOp(bool state) +{ + noWrite_ = state; +} + void SocketPair::closeSockets() { @@ -463,10 +469,15 @@ SocketPair::writeData(uint8_t* buf, int buf_size) if (ret < 0) return ret; + if (noWrite_) + return buf_size; return sendto(fd, reinterpret_cast<const char*>(buf), buf_size, 0, reinterpret_cast<sockaddr*>(&dest_addr), dest_addr_len); } + if (noWrite_) + return buf_size; + // IceSocket if (isRTCP) return rtcp_sock_->send(buf, buf_size); diff --git a/src/media/socket_pair.h b/src/media/socket_pair.h index bdada9d644a0e999651b5d137a8911ba769e9782..f5992e6312718d8c4d05502ddd74a1fb618ef994 100644 --- a/src/media/socket_pair.h +++ b/src/media/socket_pair.h @@ -93,6 +93,8 @@ class SocketPair { void createSRTP(const char* out_suite, const char* out_params, const char* in_suite, const char* in_params); + void stopSendOp(bool state = true); + private: NON_COPYABLE(SocketPair); @@ -119,6 +121,7 @@ class SocketPair { sockaddr_storage rtcpDestAddr_; socklen_t rtcpDestAddrLen_; std::atomic_bool interrupted_ {false}; + std::atomic_bool noWrite_ {false}; std::unique_ptr<SRTPProtoContext> srtpContext_; }; diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp index 05808c468161ded38dfa0446e9dfc3963d939840..01b7fecc0d68972b617f1d1b4c927afd188b6069 100644 --- a/src/media/video/video_rtp_session.cpp +++ b/src/media/video/video_rtp_session.cpp @@ -89,11 +89,16 @@ void VideoRtpSession::startSender() } } + + // be sure to not send any packets before saving last RTP seq value + socketPair_->stopSendOp(); + if (sender_) + initSeqVal_ = sender_->getLastSeqValue() + 1; try { - sender_.reset( - new VideoSender(getRemoteRtpUri(), localVideoParams_, - send_, *socketPair_, initSeqVal_) - ); + sender_.reset(); + socketPair_->stopSendOp(false); + sender_.reset(new VideoSender(getRemoteRtpUri(), localVideoParams_, + send_, *socketPair_, initSeqVal_)); } catch (const MediaEncoderException &e) { RING_ERR("%s", e.what()); send_.enabled = false; @@ -106,8 +111,6 @@ VideoRtpSession::restartSender() { std::lock_guard<std::recursive_mutex> lock(mutex_); - // continue on last sequence number - initSeqVal_ = sender_->getLastSeqValue() + 1; startSender(); if (sender_) {