123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- /*****************************************************************************
- * 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;
- @end
- @implementation VLCMediaListAspect (KeyValueCodingCompliance)
- /* For the @"Media" key */
- - (int) countOfMedia
- {
- return [self count];
- }
- - (id) objectInMediaAtIndex:(int)i
- {
- return [self mediaAtIndex: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;
- int index = event->u.media_list_view_item_added.index;
- [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"Media"];
- [pool release];
- }
- static void HandleMediaListViewItemDeleted( const libvlc_event_t * event, void * user_data)
- {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- id self = user_data;
- int index = event->u.media_list_view_item_deleted.index;
- [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"Media"];
- [pool release];
- }
- @implementation VLCMediaListAspect
- - (void)dealloc
- {
- // Release allocated memory
- libvlc_media_list_view_release(p_mlv);
- [cachedMedia 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];
- }
- - (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_mlist);
- cachedMedia = [[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);
- [cachedMedia addObject:[VLCMedia mediaWithLibVLCMediaDescriptor: p_md]];
- libvlc_media_descriptor_release(p_md);
- }
- [self initInternalMediaListView];
- //libvlc_media_list_unlock(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 );
- }
- @end
|