protected override void Dispose(bool isDisposing) { try { LibVlcInterop.libvlc_media_player_release(descriptor); } finally { base.Dispose(isDisposing); } }
public void Parse() { VerifyObjectIsNotDisposed(); // lock (staticLock) { if (!IsParsed()) { LibVlcInterop.libvlc_media_parse(this.descriptor); } // if (tracksInfo == null) { parseState = new ParseState(); parseState.waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset); try { IntPtr player = LibVlcInterop.libvlc_media_player_new_from_media(this.descriptor); if (player == IntPtr.Zero) { throw new VlcInternalException(String.Format("Can't create an instance of player when parsing. LibVlc tells: {0}", LibVlcInterop.libvlc_errmsg())); } IntPtr playerEvents = LibVlcInterop.libvlc_media_player_event_manager(player); if (playerEvents == IntPtr.Zero) { throw new VlcInternalException(String.Format("Can't get event manager of player when parsing. LibVlc tells: {0}", LibVlcInterop.libvlc_errmsg())); } // try { parseState.eventHandler = new LibVlcInterop.VlcEventHandlerDelegate(onTrackInfoEndReached); IntPtr function = Marshal.GetFunctionPointerForDelegate(parseState.eventHandler); // int res = LibVlcInterop.libvlc_event_attach(playerEvents, libvlc_event_type_e.libvlc_MediaPlayerEndReached, function, IntPtr.Zero); if (res != 0) { throw new VlcInternalException(String.Format("Unable to attach event {0}", libvlc_event_type_e.libvlc_MediaPlayerEndReached.ToString())); } // LibVlcInterop.libvlc_media_add_option(descriptor, "sout=#description"); LibVlcInterop.libvlc_media_player_play(player); // if (parseState.waitHandle.WaitOne(parseTimeout)) { // LibVlcInterop.libvlc_media_player_release(player); player = IntPtr.Zero; // tracksInfo = LibVlcInterop.libvlc_media_get_tracks_info(descriptor); // if (logger.IsInfoEnabled) { StringBuilder builder = new StringBuilder(); builder.Append("Parsed tracks info: "); // foreach (libvlc_media_track_info_t track in tracksInfo) { builder.AppendLine(""); if (track.i_type == libvlc_track_t.libvlc_track_audio) { builder.AppendLine("Type: audio"); builder.AppendLine("Channels: " + track.i_channels); builder.AppendLine("Rate: " + track.i_rate); } else if (track.i_type == libvlc_track_t.libvlc_track_text) { builder.AppendLine("Type: text"); } else if (track.i_type == libvlc_track_t.libvlc_track_video) { builder.AppendLine("Type: video"); } else { builder.AppendLine("Type: unknown"); } builder.AppendLine("Description: " + LibVlcInterop.vlc_fourcc_GetDescription(0, track.i_codec)); } // builder.AppendLine("Total tracks: " + tracksInfo.Length); logger.Info(builder.ToString()); } } else { throw new VlcTimeoutException("Can't get tracks information."); } } finally { if (player != IntPtr.Zero) { LibVlcInterop.libvlc_media_player_release(player); } } } catch (Exception exc) { if (logger.IsErrorEnabled) { logger.Error("An error occured during parse.", exc); } throw; } finally { parseState.waitHandle.Close(); parseState = null; } } } }