protected override void Dispose(bool disposing) { if (disposing) { } if (!IsInvalid) { if (_callbacks != null) { _callbacks.Dispose(); _callbacks = null; } try { lock (Spotify.Mutex) { Spotify.sp_playlist_release(Handle); } } catch { } finally { PlaylistTrackManager.RemoveAll(this); PlaylistManager.Remove(Handle); Handle = IntPtr.Zero; Debug.WriteLine("Playlist disposed"); } } base.Dispose(disposing); }
private void OnTracksAddedCallback(IntPtr playlistPtr, IntPtr tracksPtr, int numTracks, int position, IntPtr userdataptr) { if (playlistPtr != _playlist.Handle) { return; } var trackIndices = new int[numTracks]; var tracks = new ITrack[numTracks]; var trackPtrs = new IntPtr[numTracks]; Marshal.Copy(tracksPtr, trackPtrs, 0, numTracks); for (int i = 0; i < numTracks; i++) { trackIndices[i] = position + i; tracks[i] = PlaylistTrackManager.Get( _playlist.Session, _playlist, trackPtrs[i], trackIndices[i]); } _playlist.QueueThis(() => _playlist.OnTracksAdded(new TracksAddedEventArgs(trackIndices, tracks))); }
private IPlaylistTrack GetTrackIndex(int index) { AssertHandle(); lock (Spotify.Mutex) { return(PlaylistTrackManager.Get(Session, this, Spotify.sp_playlist_track(Handle, index), index)); } }
protected override void Dispose(bool disposing) { if (disposing) { PlaylistTrackManager.Remove(Playlist, _position); } base.Dispose(disposing); }
private void OnTrackSeenChangedCallback(IntPtr playlistPtr, int position, bool seen, IntPtr userdataptr) { if (playlistPtr != _playlist.Handle) { return; } ITrack track = PlaylistTrackManager.Get( _playlist.Session, _playlist, Spotify.sp_playlist_track(playlistPtr, position), position); _playlist.QueueThis(() => _playlist.OnTrackSeenChanged(new TrackSeenEventArgs(track, seen))); }
private void OnTrackCreatedChangedCallback(IntPtr playlistPtr, int position, IntPtr userptr, int when, IntPtr userdataptr) { if (playlistPtr != _playlist.Handle) { return; } ITrack track = PlaylistTrackManager.Get( _playlist.Session, _playlist, Spotify.sp_playlist_track(playlistPtr, position), position); DateTime dtWhen = new DateTime(TimeSpan.FromSeconds(when).Ticks, DateTimeKind.Utc); _playlist.QueueThis(() => _playlist.OnTrackCreatedChanged(new TrackCreatedChangedEventArgs(track, dtWhen))); }
private void OnTracksRemovedCallback(IntPtr playlistPtr, IntPtr trackIndicesPtr, int numTracks, IntPtr userdataptr) { if (playlistPtr != _playlist.Handle) { return; } int[] trackIndices = new int[numTracks]; Marshal.Copy(trackIndicesPtr, trackIndices, 0, numTracks); for (int i = 0; i < trackIndices.Length; i++) { int trackIndex = trackIndices[i]; PlaylistTrackManager.Remove(_playlist, trackIndex); } _playlist.QueueThis(() => _playlist.OnTracksRemoved(new TracksRemovedEventArgs(trackIndices))); }
protected override void Dispose(bool disposing) { if (disposing) { // Dispose managed } // Dispose unmanaged if (!IsInvalid) { try { _mainThreadNotification.Set(); lock (_eventQueueLock) { Monitor.Pulse(_eventQueueLock); } if (_callbacks != null) { _callbacks.Dispose(); _callbacks = null; } PlaylistTrackManager.RemoveAll(this); TrackManager.DisposeAll(this); LinkManager.RemoveAll(this); UserManager.RemoveAll(this); PlaylistContainerManager.RemoveAll(this); PlaylistManager.RemoveAll(this); ContainerPlaylistManager.RemoveAll(this); ArtistManager.RemoveAll(); AlbumManager.RemoveAll(); SessionManager.Remove(Handle); lock (Spotify.Mutex) { Error error = Error.OK; if (ConnectionState == ConnectionState.LoggedIn) { error = Spotify.sp_session_logout(Handle); Debug.WriteLineIf(error != Error.OK, error.GetMessage()); } error = Spotify.sp_session_release(Handle); Debug.WriteLineIf(error != Error.OK, error.GetMessage()); Handle = IntPtr.Zero; } } catch { // Ignore } finally { Debug.WriteLine("Session disposed"); } } base.Dispose(disposing); }