123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- /*****************************************************************************
- * VLCMediaList.m: VLC.framework VLCMediaList implementation
- *****************************************************************************
- * Copyright (C) 2007 Pierre d'Herbemont
- * Copyright (C) 2007 the VideoLAN team
- * $Id$
- *
- * Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
- #import "VLCMediaListAspect.h"
- #import "VLCLibrary.h"
- #import "VLCEventManager.h"
- #import "VLCLibVLCBridging.h"
- #include <vlc/vlc.h>
- #include <vlc/libvlc.h>
- // TODO: Documentation
- @interface VLCMediaListAspect (Private)
- /* Initializers */
- - (void)initInternalMediaListView;
- - (void)mediaListViewItemAdded:(NSDictionary *)args;
- - (void)mediaListViewItemRemoved:(NSNumber *)index;
- @end
- @implementation VLCMediaListAspectNode
- @synthesize media;
- @synthesize children;
- - (BOOL)isLeaf
- {
- return self.children == NULL;
- }
- -(void)dealloc
- {
- [self.children release];
- [super dealloc];
- }
- @end
- @implementation VLCMediaListAspect (KeyValueCodingCompliance)
- /* For the @"media" key */
- - (int) countOfMedia
- {
- return [cachedNode count];
- }
- - (id) objectInMediaAtIndex:(int)i
- {
- return [[cachedNode objectAtIndex:i] media];
- }
- /* For the @"node" key */
- - (int) countOfNode
- {
- return [cachedNode count];
- }
- - (id) objectInNodeAtIndex:(int)i
- {
- return [cachedNode objectAtIndex:i];
- }
- @end
- /* libvlc event callback */
- static void HandleMediaListViewItemAdded(const libvlc_event_t *event, void *user_data)
- {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- id self = user_data;
- [[VLCEventManager sharedManager] callOnMainThreadObject:self
- withMethod:@selector(mediaListViewItemAdded:)
- withArgumentAsObject:[NSDictionary dictionaryWithObjectsAndKeys:
- [VLCMedia mediaWithLibVLCMediaDescriptor:event->u.media_list_item_added.item], @"media",
- [NSNumber numberWithInt:event->u.media_list_item_added.index], @"index",
- nil]];
- [pool release];
- }
- static void HandleMediaListViewItemDeleted( const libvlc_event_t * event, void * user_data)
- {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- id self = user_data;
- [[VLCEventManager sharedManager] callOnMainThreadObject:self
- withMethod:@selector(mediaListViewItemRemoved:)
- withArgumentAsObject:[NSNumber numberWithInt:event->u.media_list_item_deleted.index]];
- [pool release];
- }
- @implementation VLCMediaListAspect
- - (void)dealloc
- {
- // Release allocated memory
- libvlc_media_list_view_release(p_mlv);
- [cachedNode release];
- [super dealloc];
- }
- - (VLCMedia *)mediaAtIndex:(int)index
- {
- libvlc_exception_t p_e;
- libvlc_exception_init( &p_e );
- libvlc_media_descriptor_t *p_md = libvlc_media_list_view_item_at_index( p_mlv, index, &p_e );
- quit_on_exception( &p_e );
-
- // Returns local object for media descriptor, searchs for user data first. If not found it creates a
- // new cocoa object representation of the media descriptor.
- return [VLCMedia mediaWithLibVLCMediaDescriptor:p_md];
- }
- - (VLCMediaListAspect *)childrenAtIndex:(int)index
- {
- libvlc_exception_t p_e;
- libvlc_exception_init( &p_e );
- libvlc_media_list_view_t *p_sub_mlv = libvlc_media_list_view_children_at_index( p_mlv, index, &p_e );
- quit_on_exception( &p_e );
- if( !p_sub_mlv )
- return nil;
- // Returns local object for media descriptor, searchs for user data first. If not found it creates a
- // new cocoa object representation of the media descriptor.
- return [VLCMediaListAspect mediaListAspectWithLibVLCMediaListView:p_sub_mlv];
- }
- - (VLCMediaListAspectNode *)nodeAtIndex:(int)index
- {
- VLCMediaListAspectNode * node = [[[VLCMediaListAspectNode alloc] init] autorelease];
- [node setMedia:[self mediaAtIndex: index]];
- return node;
- }
- - (int)count
- {
- libvlc_exception_t p_e;
- libvlc_exception_init( &p_e );
- int result = libvlc_media_list_view_count( p_mlv, &p_e );
- quit_on_exception( &p_e );
- return result;
- }
- @end
- @implementation VLCMediaListAspect (LibVLCBridging)
- + (id)mediaListAspectWithLibVLCMediaListView:(libvlc_media_list_view_t *)p_new_mlv;
- {
- return [[[VLCMediaListAspect alloc] initWithLibVLCMediaListView:p_new_mlv] autorelease];
- }
- - (id)initWithLibVLCMediaListView:(libvlc_media_list_view_t *)p_new_mlv;
- {
- if( self = [super init] )
- {
- p_mlv = p_new_mlv;
- libvlc_media_list_view_retain(p_mlv);
- //libvlc_media_list_lock(p_mlv->p_mlist);
- cachedNode = [[NSMutableArray alloc] initWithCapacity:libvlc_media_list_view_count(p_mlv, NULL)];
- int i, count = libvlc_media_list_view_count(p_mlv, NULL);
- for( i = 0; i < count; i++ )
- {
- libvlc_media_descriptor_t * p_md = libvlc_media_list_view_item_at_index(p_mlv, i, NULL);
- libvlc_media_list_view_t * p_sub_mlv = libvlc_media_list_view_children_at_index(p_mlv, i, NULL);
- VLCMediaListAspectNode * node = [[[VLCMediaListAspectNode alloc] init] autorelease];
- [node setMedia:[VLCMedia mediaWithLibVLCMediaDescriptor: p_md]];
- [node setChildren: p_sub_mlv ? [VLCMediaListAspect mediaListAspectWithLibVLCMediaListView: p_sub_mlv] : nil];
- [cachedNode addObject:node];
- libvlc_media_descriptor_release(p_md);
- if( p_sub_mlv ) libvlc_media_list_view_release(p_sub_mlv);
- }
- [self initInternalMediaListView];
- //libvlc_media_list_unlock(p_mlv->p_mlist);
- }
- return self;
- }
- - (libvlc_media_list_view_t *)libVLCMediaListView
- {
- return (libvlc_media_list_view_t *)p_mlv;
- }
- @end
- @implementation VLCMediaListAspect (Private)
- - (void)initInternalMediaListView
- {
- libvlc_exception_t e;
- libvlc_exception_init( &e );
- libvlc_event_manager_t *p_em = libvlc_media_list_event_manager( p_mlv, &e );
- /* Add internal callback */
- libvlc_event_attach( p_em, libvlc_MediaListViewItemAdded, HandleMediaListViewItemAdded, self, &e );
- libvlc_event_attach( p_em, libvlc_MediaListViewItemDeleted, HandleMediaListViewItemDeleted, self, &e );
- quit_on_exception( &e );
- }
- - (void)mediaListViewItemAdded:(NSDictionary *)args
- {
- int index = [[args objectForKey:@"index"] intValue];
- VLCMedia * media = [args objectForKey:@"media"];
- VLCMediaListAspectNode * node = [[[VLCMediaListAspectNode alloc] init] autorelease];
- [node setMedia:media];
- [node setChildren:[self childrenAtIndex:index]];
- [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"media"];
- [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"node"];
- [cachedNode insertObject:node atIndex:index];
- [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"node"];
- [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"media"];
- }
- - (void)mediaListViewItemRemoved:(NSNumber *)index
- {
- [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"media"];
- [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"node"];
- [cachedNode removeObjectAtIndex:[index intValue]];
- [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"node"];
- [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"media"];
- }
- @end
|