/// <summary> /// Handles data from network connected to specific client id /// </summary> /// <param name="id">unique id of a remote client</param> /// <param name="bytes">array of received data (samples)</param> private void HandleRawData(int id, string name, byte[] bytes) { if (!_listening) { return; } lock (_lock) { Speaker speaker; if (!Speakers.ContainsKey(id)) { speaker = new Speaker(id, name, transform); speaker.IsMute = IsSpeakersMuted; Speakers.Add(id, speaker); SpeakersUpdatedEvent?.Invoke(); } else { speaker = Speakers[id]; } speaker.HandleRawData(bytes); } }
/// <summary> /// Disposes speaker by client id /// </summary> /// <param name="id"></param> public void SpeakerLeave(int id) { if (!_listening) { return; } lock (_lock) { if (Speakers.ContainsKey(id)) { Speakers[id].Dispose(); Speakers.Remove(id); SpeakerLeavedByInactiveEvent?.Invoke(id); } } SpeakersUpdatedEvent?.Invoke(); }
/// <summary> /// cleans inactive speakers /// </summary> private void CleanInactiveSpeakers() { lock (_lock) { List <int> inactive = new List <int>(); foreach (var speaker in Speakers) { if (!speaker.Value.IsActive) { inactive.Add(speaker.Key); } } foreach (int id in inactive) { Speakers[id].Dispose(); Speakers.Remove(id); } inactive.Clear(); } SpeakersUpdatedEvent?.Invoke(); }