2020#include " ffi_client.h"
2121#include " livekit/audio_stream.h"
2222#include " livekit/e2ee.h"
23+ #include " livekit/local_audio_track.h"
2324#include " livekit/local_participant.h"
25+ #include " livekit/local_track_publication.h"
26+ #include " livekit/local_video_track.h"
2427#include " livekit/remote_audio_track.h"
2528#include " livekit/remote_data_track.h"
2629#include " livekit/remote_participant.h"
@@ -47,6 +50,33 @@ using proto::FfiResponse;
4750
4851namespace {
4952
53+ std::shared_ptr<LocalTrackPublication> localTrackPublication (const std::shared_ptr<Track>& track) {
54+ if (!track) {
55+ return nullptr ;
56+ }
57+ if (auto video = std::dynamic_pointer_cast<LocalVideoTrack>(track)) {
58+ return video->publication ();
59+ }
60+ if (auto audio = std::dynamic_pointer_cast<LocalAudioTrack>(track)) {
61+ return audio->publication ();
62+ }
63+ return nullptr ;
64+ }
65+
66+ void updateLocalTrackPublicationInfo (LocalTrackPublication& publication, const proto::TrackPublicationInfo& info) {
67+ publication.sid_ = info.sid ();
68+ publication.name_ = info.name ();
69+ publication.kind_ = fromProto (info.kind ());
70+ publication.source_ = fromProto (info.source ());
71+ publication.simulcasted_ = info.simulcasted ();
72+ publication.width_ = info.width ();
73+ publication.height_ = info.height ();
74+ publication.mime_type_ = info.mime_type ();
75+ publication.muted_ = info.muted ();
76+ publication.encryption_type_ = static_cast <EncryptionType>(info.encryption_type ());
77+ publication.audio_features_ = convertAudioFeatures (info.audio_features ());
78+ }
79+
5080std::shared_ptr<livekit::RemoteParticipant> createRemoteParticipant (const proto::OwnedParticipant& owned) {
5181 const auto & pinfo = owned.info ();
5282 std::unordered_map<std::string, std::string> attrs;
@@ -593,6 +623,38 @@ void Room::onEvent(const FfiEvent& event) {
593623 }
594624 break ;
595625 }
626+ case proto::RoomEvent::kLocalTrackRepublished : {
627+ const std::scoped_lock<std::mutex> guard (lock_);
628+ if (!local_participant_) {
629+ LK_LOG_ERROR (" kLocalTrackRepublished: local_participant_ is nullptr" );
630+ break ;
631+ }
632+ const auto & ltr = re.local_track_republished ();
633+ const std::string& previous_sid = ltr.previous_sid ();
634+
635+ auto & published = local_participant_->published_tracks_by_sid_ ;
636+ auto it = published.find (previous_sid);
637+ if (it == published.end ()) {
638+ LK_LOG_WARN (" local_track_republished for unknown previous sid: {}" , previous_sid);
639+ break ;
640+ }
641+ auto track = it->second .lock ();
642+ if (!track) {
643+ published.erase (it);
644+ LK_LOG_WARN (" local_track_republished for expired previous sid: {}" , previous_sid);
645+ break ;
646+ }
647+ auto publication = localTrackPublication (track);
648+ if (!publication) {
649+ LK_LOG_WARN (" local_track_republished missing publication for sid: {}" , previous_sid);
650+ break ;
651+ }
652+ updateLocalTrackPublicationInfo (*publication, ltr.info ());
653+ published.erase (it);
654+ published[publication->sid ()] = track;
655+ track->setPublication (publication);
656+ break ;
657+ }
596658 case proto::RoomEvent::kLocalTrackSubscribed : {
597659 LocalTrackSubscribedEvent ev;
598660 {
0 commit comments