diff --git a/examples/media/main.cpp b/examples/media/main.cpp index f97e96f..03b50f2 100644 --- a/examples/media/main.cpp +++ b/examples/media/main.cpp @@ -65,7 +65,7 @@ int main() { media.setBitrate( 3000); // Request 3Mbps (Browsers do not encode more than 2.5MBps from a webcam) - auto track = pc->createTrack(media); + auto track = pc->addTrack(media); auto session = std::make_shared(); track->setRtcpHandler(session); diff --git a/include/rtc/peerconnection.hpp b/include/rtc/peerconnection.hpp index cf13c3b..d82d9df 100644 --- a/include/rtc/peerconnection.hpp +++ b/include/rtc/peerconnection.hpp @@ -86,6 +86,10 @@ public: void setRemoteDescription(Description description); void addRemoteCandidate(Candidate candidate); + std::shared_ptr addDataChannel(string label, string protocol = "", + Reliability reliability = {}); + + // Equivalent to calling addDataChannel() and setLocalDescription() std::shared_ptr createDataChannel(string label, string protocol = "", Reliability reliability = {}); @@ -102,7 +106,7 @@ public: std::optional rtt(); // Track media support requires compiling with libSRTP - std::shared_ptr createTrack(Description::Media description); + std::shared_ptr addTrack(Description::Media description); void onTrack(std::function track)> callback); // libnice only diff --git a/include/rtc/rtc.h b/include/rtc/rtc.h index f6548bb..3c18725 100644 --- a/include/rtc/rtc.h +++ b/include/rtc/rtc.h @@ -119,6 +119,10 @@ RTC_EXPORT int rtcGetRemoteAddress(int pc, char *buffer, int size); // DataChannel RTC_EXPORT int rtcSetDataChannelCallback(int pc, rtcDataChannelCallbackFunc cb); +RTC_EXPORT int rtcAddDataChannel(int pc, const char *label); // returns dc id +RTC_EXPORT int rtcAddDataChannelExt(int pc, const char *label, const char *protocol, + const rtcReliability *reliability); // returns dc id +// Equivalent to calling rtcAddDataChannel() and rtcSetLocalDescription() RTC_EXPORT int rtcCreateDataChannel(int pc, const char *label); // returns dc id RTC_EXPORT int rtcCreateDataChannelExt(int pc, const char *label, const char *protocol, const rtcReliability *reliability); // returns dc id @@ -130,7 +134,7 @@ RTC_EXPORT int rtcGetDataChannelReliability(int dc, rtcReliability *reliability) // Track RTC_EXPORT int rtcSetTrackCallback(int pc, rtcTrackCallbackFunc cb); -RTC_EXPORT int rtcCreateTrack(int pc, const char *mediaDescriptionSdp); // returns tr id +RTC_EXPORT int rtcAddTrack(int pc, const char *mediaDescriptionSdp); // returns tr id RTC_EXPORT int rtcDeleteTrack(int tr); RTC_EXPORT int rtcGetTrackDescription(int tr, char *buffer, int size); diff --git a/src/peerconnection.cpp b/src/peerconnection.cpp index 44a79e2..deab92e 100644 --- a/src/peerconnection.cpp +++ b/src/peerconnection.cpp @@ -85,8 +85,9 @@ std::optional PeerConnection::remoteDescription() const { void PeerConnection::setLocalDescription() { PLOG_VERBOSE << "Setting local description"; - if (std::atomic_load(&mIceTransport)) - throw std::logic_error("Local description is already set"); + if (std::atomic_load(&mIceTransport)) { + PLOG_DEBUG << "Local description is already set"; + } // RFC 5763: The endpoint that is the offerer MUST use the setup attribute value of // setup:actpass. @@ -197,8 +198,8 @@ std::optional PeerConnection::remoteAddress() const { return iceTransport ? iceTransport->getRemoteAddress() : nullopt; } -shared_ptr PeerConnection::createDataChannel(string label, string protocol, - Reliability reliability) { +shared_ptr PeerConnection::addDataChannel(string label, string protocol, + Reliability reliability) { if (auto local = localDescription(); local && !local->hasApplication()) { PLOG_ERROR << "The PeerConnection was negociated without DataChannel support."; throw std::runtime_error("No DataChannel support on the PeerConnection"); @@ -214,18 +215,17 @@ shared_ptr PeerConnection::createDataChannel(string label, string p auto channel = emplaceDataChannel(role, std::move(label), std::move(protocol), std::move(reliability)); - if (!iceTransport) { - // RFC 5763: The endpoint that is the offerer MUST use the setup attribute value of - // setup:actpass. - // See https://tools.ietf.org/html/rfc5763#section-5 - iceTransport = initIceTransport(Description::Role::ActPass); - processLocalDescription(iceTransport->getLocalDescription(Description::Type::Offer)); - iceTransport->gatherLocalCandidates(); - } else { - if (auto transport = std::atomic_load(&mSctpTransport)) - if (transport->state() == SctpTransport::State::Connected) - channel->open(transport); - } + if (auto transport = std::atomic_load(&mSctpTransport)) + if (transport->state() == SctpTransport::State::Connected) + channel->open(transport); + + return channel; +} + +shared_ptr PeerConnection::createDataChannel(string label, string protocol, + Reliability reliability) { + auto channel = addDataChannel(label, protocol, reliability); + setLocalDescription(); return channel; } @@ -255,7 +255,7 @@ bool PeerConnection::hasMedia() const { return local && local->hasAudioOrVideo(); } -std::shared_ptr PeerConnection::createTrack(Description::Media description) { +std::shared_ptr PeerConnection::addTrack(Description::Media description) { if (localDescription()) throw std::logic_error("Tracks must be created before local description"); diff --git a/src/rtc.cpp b/src/rtc.cpp index 01c0d04..c21b766 100644 --- a/src/rtc.cpp +++ b/src/rtc.cpp @@ -268,12 +268,12 @@ int rtcDeletePeerConnection(int pc) { }); } -int rtcCreateDataChannel(int pc, const char *label) { - return rtcCreateDataChannelExt(pc, label, nullptr, nullptr); +int rtcAddDataChannel(int pc, const char *label) { + return rtcAddDataChannelExt(pc, label, nullptr, nullptr); } -int rtcCreateDataChannelExt(int pc, const char *label, const char *protocol, - const rtcReliability *reliability) { +int rtcAddDataChannelExt(int pc, const char *label, const char *protocol, + const rtcReliability *reliability) { return WRAP({ Reliability r = {}; if (reliability) { @@ -291,7 +291,7 @@ int rtcCreateDataChannelExt(int pc, const char *label, const char *protocol, } } auto peerConnection = getPeerConnection(pc); - int dc = emplaceDataChannel(peerConnection->createDataChannel( + int dc = emplaceDataChannel(peerConnection->addDataChannel( string(label ? label : ""), string(protocol ? protocol : ""), r)); if (auto ptr = getUserPointer(pc)) rtcSetUserPointer(dc, *ptr); @@ -299,6 +299,17 @@ int rtcCreateDataChannelExt(int pc, const char *label, const char *protocol, }); } +int rtcCreateDataChannel(int pc, const char *label) { + return rtcCreateDataChannelExt(pc, label, nullptr, nullptr); +} + +int rtcCreateDataChannelExt(int pc, const char *label, const char *protocol, + const rtcReliability *reliability) { + int dc = rtcAddDataChannelExt(pc, label, protocol, reliability); + rtcSetLocalDescription(pc); + return dc; +} + int rtcDeleteDataChannel(int dc) { return WRAP({ auto dataChannel = getDataChannel(dc); @@ -313,13 +324,13 @@ int rtcDeleteDataChannel(int dc) { }); } -int rtcCreateTrack(int pc, const char *mediaDescriptionSdp) { +int rtcAddTrack(int pc, const char *mediaDescriptionSdp) { if (!mediaDescriptionSdp) throw std::invalid_argument("Unexpected null pointer for track media description"); auto peerConnection = getPeerConnection(pc); Description::Media media{string(mediaDescriptionSdp)}; - int tr = emplaceTrack(peerConnection->createTrack(std::move(media))); + int tr = emplaceTrack(peerConnection->addTrack(std::move(media))); if (auto ptr = getUserPointer(pc)) rtcSetUserPointer(tr, *ptr); return tr; diff --git a/test/capi_track.cpp b/test/capi_track.cpp index 3983a75..5a782d5 100644 --- a/test/capi_track.cpp +++ b/test/capi_track.cpp @@ -151,7 +151,7 @@ int test_capi_track_main() { goto error; // Peer 1: Create track - peer1->tr = rtcCreateTrack(peer1->pc, mediaDescription); + peer1->tr = rtcAddTrack(peer1->pc, mediaDescription); rtcSetOpenCallback(peer1->tr, openCallback); rtcSetClosedCallback(peer1->tr, closedCallback); diff --git a/test/track.cpp b/test/track.cpp index 6044727..3c8000c 100644 --- a/test/track.cpp +++ b/test/track.cpp @@ -102,7 +102,7 @@ void test_track() { std::atomic_store(&t2, t); }); - auto t1 = pc1->createTrack(Description::Video("test")); + auto t1 = pc1->addTrack(Description::Video("test")); pc1->setLocalDescription();