示例#1
0
        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)));
        }
示例#3
0
        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)));
        }
示例#8
0
        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);
        }