Exemplo n.º 1
0
 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;
             }
         }
     }
 }