private IEnumerable <TrackDescription> GetDescription(IntPtr trackInfo) { if (trackInfo == IntPtr.Zero) { yield break; } libvlc_track_description_t trackDesc = (libvlc_track_description_t)Marshal.PtrToStructure(trackInfo, typeof(libvlc_track_description_t)); do { yield return(new TrackDescription() { Id = trackDesc.i_id, Name = Marshal.PtrToStringAnsi(trackDesc.psz_name) }); if (trackDesc.p_next != IntPtr.Zero) { trackDesc = (libvlc_track_description_t)Marshal.PtrToStructure(trackDesc.p_next, typeof(libvlc_track_description_t)); } else { break; } }while (true); LibVlcMethods.libvlc_track_description_release(trackInfo); }
//========================================================================== public libvlc_track_description_t libvlc_video_get_track_description(IntPtr p_mi) { VerifyAccess(); IntPtr pointer = m_libvlc_video_get_track_description(p_mi); if (pointer == IntPtr.Zero) { return(null); } // I still have no clue whether the returned descriptions have to be freed // in any way; but i assume not internal_libvlc_track_description_t track_description = (internal_libvlc_track_description_t)Marshal.PtrToStructure(pointer, typeof(internal_libvlc_track_description_t)); libvlc_track_description_t result = new libvlc_track_description_t { i_id = track_description.i_id, psz_name = track_description.psz_name }; libvlc_track_description_t current = result; while (track_description.p_next != IntPtr.Zero) { track_description = (internal_libvlc_track_description_t)Marshal.PtrToStructure(track_description.p_next, typeof(internal_libvlc_track_description_t)); current.p_next = new libvlc_track_description_t { i_id = track_description.i_id, psz_name = track_description.psz_name }; current = current.p_next; } current.p_next = null; m_libvlc_track_description_list_release(pointer); return(result); }
//========================================================================== public libvlc_track_description_t libvlc_video_get_spu_description(IntPtr p_mi) { VerifyAccess(); IntPtr pointer = m_libvlc_video_get_spu_description(p_mi); if (pointer == IntPtr.Zero) { return(null); } internal_libvlc_track_description_t track_description = (internal_libvlc_track_description_t)Marshal.PtrToStructure(pointer, typeof(internal_libvlc_track_description_t)); libvlc_track_description_t result = new libvlc_track_description_t { i_id = track_description.i_id, psz_name = track_description.psz_name }; libvlc_track_description_t current = result; while (track_description.p_next != IntPtr.Zero) { track_description = (internal_libvlc_track_description_t)Marshal.PtrToStructure(track_description.p_next, typeof(internal_libvlc_track_description_t)); current.p_next = new libvlc_track_description_t { i_id = track_description.i_id, psz_name = track_description.psz_name }; current = current.p_next; } current.p_next = null; m_libvlc_track_description_list_release(pointer); return(result); }
/// <summary> /// /// </summary> protected void LoadTracks() { _Tracks.Clear(); lock (Player.player_lock) { bool done; IntPtr p_head = GetTrackDescInternal(); Player.p_ex.CheckException(); IntPtr p_track = p_head; do { libvlc_track_description_t track = (libvlc_track_description_t)Marshal.PtrToStructure(p_track, typeof(libvlc_track_description_t)); _Tracks.Add(track.i_id, new VlcTrack(track.i_id, Marshal.PtrToStringAnsi(track.psz_name))); p_track = track.p_next; done = (p_track == IntPtr.Zero); } while (!done); InteropMethods.libvlc_track_description_release(p_head); } _ReloadTracks = false; }
//========================================================================== public libvlc_track_description_t libvlc_video_get_track_description(IntPtr p_mi) { VerifyAccess(); IntPtr pointer = m_libvlc_video_get_track_description(p_mi); if(pointer == IntPtr.Zero) return null; // I still have no clue whether the returned descriptions have to be freed // in any way; but i assume not internal_libvlc_track_description_t track_description = (internal_libvlc_track_description_t)Marshal.PtrToStructure(pointer, typeof(internal_libvlc_track_description_t)); libvlc_track_description_t result = new libvlc_track_description_t { i_id = track_description.i_id, psz_name = track_description.psz_name }; libvlc_track_description_t current = result; while(track_description.p_next != IntPtr.Zero) { track_description = (internal_libvlc_track_description_t)Marshal.PtrToStructure(track_description.p_next, typeof(internal_libvlc_track_description_t)); current.p_next = new libvlc_track_description_t { i_id = track_description.i_id, psz_name = track_description.psz_name }; current = current.p_next; } current.p_next = null; m_libvlc_track_description_list_release(pointer); return result; }
//========================================================================== public libvlc_track_description_t libvlc_video_get_spu_description(IntPtr p_mi) { VerifyAccess(); IntPtr pointer = m_libvlc_video_get_spu_description(p_mi); if(pointer == IntPtr.Zero) return null; internal_libvlc_track_description_t track_description = (internal_libvlc_track_description_t)Marshal.PtrToStructure(pointer, typeof(internal_libvlc_track_description_t)); libvlc_track_description_t result = new libvlc_track_description_t { i_id = track_description.i_id, psz_name = track_description.psz_name }; libvlc_track_description_t current = result; while(track_description.p_next != IntPtr.Zero) { track_description = (internal_libvlc_track_description_t)Marshal.PtrToStructure(track_description.p_next, typeof(internal_libvlc_track_description_t)); current.p_next = new libvlc_track_description_t { i_id = track_description.i_id, psz_name = track_description.psz_name }; current = current.p_next; } current.p_next = null; m_libvlc_track_description_list_release(pointer); return result; }
//========================================================================== public int libvlc_track_description_list_release(libvlc_track_description_t p_track_description) { return(0); }
//========================================================================== public int libvlc_track_description_list_release(libvlc_track_description_t p_track_description) { return 0; }