Skip to content

Commit 98eb558

Browse files
authored
Add UnpublishTrack to local participant, fix LocalTrackPublished event (#44)
1 parent da21284 commit 98eb558

File tree

6 files changed

+66
-6
lines changed

6 files changed

+66
-6
lines changed

Runtime/Scripts/Internal/FFIClient.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ internal sealed class FfiClient : IFFIClient
3232
private readonly IMemoryPool memoryPool;
3333

3434
public event PublishTrackDelegate? PublishTrackReceived;
35+
public event UnpublishTrackDelegate? UnpublishTrackReceived;
3536
public event ConnectReceivedDelegate? ConnectReceived;
3637
public event DisconnectReceivedDelegate? DisconnectReceived;
3738
public event RoomEventReceivedDelegate? RoomEventReceived;
@@ -228,6 +229,9 @@ static unsafe void FFICallback(UIntPtr data, UIntPtr size)
228229
case FfiEvent.MessageOneofCase.PublishTrack:
229230
Instance.PublishTrackReceived?.Invoke(r.PublishTrack!);
230231
break;
232+
case FfiEvent.MessageOneofCase.UnpublishTrack:
233+
Instance.UnpublishTrackReceived?.Invoke(r.UnpublishTrack!);
234+
break;
231235
case FfiEvent.MessageOneofCase.RoomEvent:
232236
Instance.RoomEventReceived?.Invoke(r.RoomEvent);
233237
break;

Runtime/Scripts/Internal/FFIClients/FFIEvents.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ namespace LiveKit.Internal
1212
internal delegate void PublishTrackDelegate(PublishTrackCallback e);
1313

1414

15+
internal delegate void UnpublishTrackDelegate(UnpublishTrackCallback e);
16+
17+
1518
internal delegate void ConnectReceivedDelegate(ConnectCallback e);
1619

1720

Runtime/Scripts/Participant.cs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public PublishTrackInstruction PublishTrack(ILocalTrack localTrack, TrackPublish
7272
if (!Room.TryGetTarget(out var room))
7373
throw new Exception("room is invalid");
7474

75-
var track = (Track)localTrack;
75+
var track = (Track)localTrack;
7676

7777
using var request = FFIBridge.Instance.NewRequest<PublishTrackRequest>();
7878
var publish = request.request;
@@ -81,7 +81,23 @@ public PublishTrackInstruction PublishTrack(ILocalTrack localTrack, TrackPublish
8181
publish.Options = options;
8282
using var response = request.Send();
8383
FfiResponse res = response;
84-
return new PublishTrackInstruction(res.PublishTrack.AsyncId);
84+
return new PublishTrackInstruction(res.PublishTrack.AsyncId, localTrack, _tracks);
85+
}
86+
87+
public UnpublishTrackInstruction UnpublishTrack(ILocalTrack localTrack, bool stopOnUnpublish)
88+
{
89+
if (!Room.TryGetTarget(out var room))
90+
throw new Exception("room is invalid");
91+
92+
using var request = FFIBridge.Instance.NewRequest<UnpublishTrackRequest>();
93+
var unpublish = request.request;
94+
unpublish.LocalParticipantHandle = (ulong) Handle.DangerousGetHandle();
95+
unpublish.StopOnUnpublish = false;
96+
unpublish.TrackSid = localTrack.Sid;
97+
using var response = request.Send();
98+
FfiResponse res = response;
99+
_tracks.Remove (localTrack.Sid);
100+
return new UnpublishTrackInstruction(res.UnpublishTrack.AsyncId);
85101
}
86102

87103
public void PublishData(byte[] data, IReadOnlyCollection<string> destination_identities = null, bool reliable = true, string topic = null)
@@ -156,10 +172,14 @@ internal RemoteParticipant(OwnedParticipant participant, Room room) : base(parti
156172
public sealed class PublishTrackInstruction : YieldInstruction
157173
{
158174
private ulong _asyncId;
175+
private Dictionary<string, TrackPublication> _internalTracks;
176+
private ILocalTrack _localTrack;
159177

160-
internal PublishTrackInstruction(ulong asyncId)
178+
internal PublishTrackInstruction(ulong asyncId, ILocalTrack localTrack, Dictionary<string, TrackPublication> internalTracks)
161179
{
162180
_asyncId = asyncId;
181+
_internalTracks = internalTracks;
182+
_localTrack = localTrack;
163183
FfiClient.Instance.PublishTrackReceived += OnPublish;
164184
}
165185

@@ -170,7 +190,29 @@ internal void OnPublish(PublishTrackCallback e)
170190

171191
IsError = !string.IsNullOrEmpty(e.Error);
172192
IsDone = true;
193+
var publication = new LocalTrackPublication (e.Publication.Info);
194+
publication.UpdateTrack (_localTrack as Track);
195+
_localTrack.UpdateSid(publication.Sid);
196+
_internalTracks.Add (e.Publication.Info.Sid, publication);
173197
FfiClient.Instance.PublishTrackReceived -= OnPublish;
174198
}
175199
}
200+
public sealed class UnpublishTrackInstruction : YieldInstruction
201+
{
202+
private ulong _asyncId;
203+
204+
internal UnpublishTrackInstruction(ulong asyncId) {
205+
_asyncId = asyncId;
206+
FfiClient.Instance.UnpublishTrackReceived += OnUnpublish;
207+
}
208+
209+
internal void OnUnpublish(UnpublishTrackCallback e) {
210+
if (e.AsyncId != _asyncId)
211+
return;
212+
213+
IsError = !string.IsNullOrEmpty(e.Error);
214+
IsDone = true;
215+
FfiClient.Instance.UnpublishTrackReceived -= OnUnpublish;
216+
}
217+
}
176218
}

Runtime/Scripts/Room.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ public ConnectInstruction Connect(string url, string token, RoomOptions options)
169169

170170
public void Disconnect()
171171
{
172+
if (this.RoomHandle == null)
173+
return;
172174
using var response = FFIBridge.Instance.SendDisconnectRequest(this);
173175
Utils.Debug($"Disconnect.... {RoomHandle}");
174176
FfiResponse resp = response;
@@ -356,14 +358,18 @@ internal void OnEventReceived(RoomEvent e)
356358
var dataInfo = e.DataPacketReceived.User;
357359
var data = new byte[dataInfo.Data.Data.DataLen];
358360
Marshal.Copy((IntPtr)dataInfo.Data.Data.DataPtr, data, 0, data.Length);
361+
#pragma warning disable CS0612 // Type or member is obsolete
359362
var participant = GetParticipant(e.DataPacketReceived.ParticipantSid);
363+
#pragma warning restore CS0612 // Type or member is obsolete
360364
DataReceived?.Invoke(data, participant, e.DataPacketReceived.Kind, dataInfo.Topic);
361365
}
362366
break;
363367
case DataPacketReceived.ValueOneofCase.SipDtmf:
364368
{
365369
var dtmfInfo = e.DataPacketReceived.SipDtmf;
370+
#pragma warning disable CS0612 // Type or member is obsolete
366371
var participant = GetParticipant(e.DataPacketReceived.ParticipantSid);
372+
#pragma warning restore CS0612 // Type or member is obsolete
367373
SipDtmfReceived?.Invoke(participant, dtmfInfo.Code, dtmfInfo.Digit);
368374
}
369375
break;

Runtime/Scripts/Track.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace LiveKit
77
{
88
public interface ITrack
99
{
10-
string Sid { get; }
10+
string Sid { get; protected set; }
1111
string Name { get; }
1212
TrackKind Kind { get; }
1313
StreamState StreamState { get; }
@@ -19,7 +19,9 @@ public interface ITrack
1919

2020
public interface ILocalTrack : ITrack
2121
{
22-
22+
public void UpdateSid (string sid) {
23+
Sid = sid;
24+
}
2325
}
2426

2527
public interface IRemoteTrack : ITrack
@@ -55,6 +57,8 @@ public class Track : ITrack
5557

5658
FfiHandle ITrack.TrackHandle => Handle;
5759

60+
string ITrack.Sid { get => _info.Sid; set => _info.Sid = value; }
61+
5862
internal Track(OwnedTrack track, Room room, Participant participant)
5963
{
6064
Handle = FfiHandle.FromOwnedHandle(track.Handle);

Runtime/csc.rsp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
-nullable:enable
1+
-nullable:disable
2+
-nowarn:8632

0 commit comments

Comments
 (0)