MacOSX/Framework/VLCMedia.m: Update the subitems on sub item additions.
authorPierre d'Herbemont <pdherbemont@videolan.org>
Sun, 30 Dec 2007 01:50:14 +0000 (01:50 +0000)
committerPierre d'Herbemont <pdherbemont@videolan.org>
Sun, 30 Dec 2007 01:50:14 +0000 (01:50 +0000)
extras/MacOSX/Framework/Sources/VLCMedia.m

index a2dca1d..17ba838 100644 (file)
@@ -70,6 +70,7 @@ NSString *VLCMediaMetaChanged           = @"VLCMediaMetaChanged";
 
 /* Callback Methods */
 - (void)metaChanged:(NSString *)metaType;
+- (void)subItemAdded;
 @end
 
 static VLCMediaState libvlc_state_to_media_state[] =
@@ -122,6 +123,15 @@ static void HandleMediaStateChanged(const libvlc_event_t *event, void *self)
     [pool release];
 }
 
+static void HandleMediaSubItemAdded(const libvlc_event_t *event, void *self)
+{
+    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+    [[VLCEventManager sharedManager] callOnMainThreadObject:self
+                                                 withMethod:@selector(subItemAdded)
+                                       withArgumentAsObject:nil];
+    [pool release];
+}
+
 /******************************************************************************
  * Implementation
  */
@@ -206,6 +216,7 @@ static void HandleMediaStateChanged(const libvlc_event_t *event, void *self)
             libvlc_event_detach(p_em, libvlc_MediaDescriptorMetaChanged,     HandleMediaMetaChanged,     self, NULL);
             libvlc_event_detach(p_em, libvlc_MediaDescriptorDurationChanged, HandleMediaDurationChanged, self, NULL);
             libvlc_event_detach(p_em, libvlc_MediaDescriptorStateChanged,    HandleMediaStateChanged,    self, NULL);
+            libvlc_event_detach(p_em, libvlc_MediaDescriptorSubItemAdded,    HandleMediaSubItemAdded,    self, NULL);
         }
         [super release];
     }
@@ -427,6 +438,7 @@ static void HandleMediaStateChanged(const libvlc_event_t *event, void *self)
     libvlc_event_attach(p_em, libvlc_MediaDescriptorMetaChanged,     HandleMediaMetaChanged,     self, &ex);
     libvlc_event_attach(p_em, libvlc_MediaDescriptorDurationChanged, HandleMediaDurationChanged, self, &ex);
     libvlc_event_attach(p_em, libvlc_MediaDescriptorStateChanged,    HandleMediaStateChanged,    self, &ex);
+    libvlc_event_attach(p_em, libvlc_MediaDescriptorSubItemAdded,    HandleMediaSubItemAdded,    self, &ex);
     quit_on_exception( &ex );
     
     libvlc_media_list_t *p_mlist = libvlc_media_descriptor_subitems( p_md, NULL );
@@ -438,6 +450,7 @@ static void HandleMediaStateChanged(const libvlc_event_t *event, void *self)
         subitems = [[VLCMediaList mediaListWithLibVLCMediaList:p_mlist] retain];
         libvlc_media_list_release( p_mlist );
     }
+
     state = LibVLCStateToMediaState(libvlc_media_descriptor_get_state( p_md, NULL ));
     /* Force VLCMetaInformationTitle, that will trigger preparsing
      * And all the other meta will be added through the libvlc event system */
@@ -489,6 +502,21 @@ static void HandleMediaStateChanged(const libvlc_event_t *event, void *self)
 {
     [self fetchMetaInformationFromLibVLCWithType:metaType];
 }
+
+- (void)subItemAdded
+{
+    if( subitems )
+        return; /* Nothing to do */
+
+    libvlc_media_list_t *p_mlist = libvlc_media_descriptor_subitems( p_md, NULL );
+
+    NSAssert( p_mlist, @"The mlist shouldn't be nil, we are receiving a subItemAdded");
+
+    [self willChangeValueForKey:@"subitems"];
+    subitems = [[VLCMediaList mediaListWithLibVLCMediaList:p_mlist] retain];
+    [self didChangeValueForKey:@"subitems"];
+    libvlc_media_list_release( p_mlist );
+}
 @end
 
 /******************************************************************************