public void Dispose() { if (_isDisposed) { return; } _isDisposed = true; lock (_updateLock) { if (_updateTimerSubscription != null) { _updateTimerSubscription.Dispose(); _updateTimerSubscription = null; } if (_audioTrack != null) { try { _audioTrack.Stop(); _audioTrack.Dispose(); _audioTrack = null; } catch (Exception e) { GameLog.Client.Audio.Error(e); } } foreach (var track in _endingTracks) { try { track.Stop(); track.Dispose(); } catch (Exception e) { GameLog.Client.Audio.Error(e); } } _endingTracks.Clear(); if (_channelGroup != null) { _channelGroup.Dispose(); _channelGroup = null; } _engine = null; } }