]> git.sesse.net Git - vlc/blob - projects/macosx/framework/Sources/VLCLibrary.m
macosx/VLCKit: Load VLCLibrary when VLCKit is loaded. No longer need atexit( .....
[vlc] / projects / macosx / framework / Sources / VLCLibrary.m
1 /*****************************************************************************
2  * VLCLibrary.h: VLC.framework VLCLibrary implementation
3  *****************************************************************************
4  * Copyright (C) 2007 Pierre d'Herbemont
5  * Copyright (C) 2007 the VideoLAN team
6  * $Id$
7  *
8  * Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #import "VLCLibrary.h"
26 #import "VLCLibVLCBridging.h"
27
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include <vlc/vlc.h>
33 #include <vlc/libvlc_structures.h>
34
35 static VLCLibrary * sharedLibrary = nil;
36
37 void __catch_exception( void * e, const char * function, const char * file, int line_number )
38 {
39     libvlc_exception_t * ex = (libvlc_exception_t *)e;
40     if( libvlc_exception_raised( ex ) )
41     {
42         NSException* libvlcException = [NSException
43             exceptionWithName:@"LibVLCException"
44             reason:[NSString stringWithFormat:@"libvlc has thrown us an error: %s (%s:%d %s)", 
45                 libvlc_exception_get_message( ex ), file, line_number, function]
46             userInfo:nil];
47         libvlc_exception_clear( ex );
48         @throw libvlcException;
49     }
50 }
51
52 void * CreateSharedLibraryOnStartup( void ) 
53 {
54     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
55     
56     /* This library is not loaded for no reason, so let's create
57      * a VLCLibrary instance. */
58     [VLCLibrary sharedLibrary];
59     
60     [pool release];
61     
62     return NULL;
63 }
64
65 void * DestroySharedLibraryAtExit( void )
66 {
67     /* Release the global object that may have been alloc-ed
68      * in -[VLCLibrary init] */
69     [sharedLibrary release];
70     sharedLibrary = nil;
71
72     return NULL;
73 }
74
75 @implementation VLCLibrary
76 + (VLCLibrary *)sharedLibrary
77 {
78     if (!sharedLibrary) 
79     {
80         /* Initialize a shared instance */
81         sharedLibrary = [[self alloc] init];
82     }
83     return sharedLibrary;
84 }
85
86 - (id)init 
87 {
88     if (self = [super init]) 
89     {
90         libvlc_exception_t ex;
91         libvlc_exception_init( &ex );
92         
93         const char * lib_vlc_params[] = { 
94             "-I", "dummy", "--vout=opengllayer", 
95             "--no-video-title-show", "--no-sout-keep"
96             //, "--control=motion", "--motion-use-rotate", "--video-filter=rotate"
97         };
98         
99         instance = (void *)libvlc_new( sizeof(lib_vlc_params)/sizeof(lib_vlc_params[0]), lib_vlc_params, &ex );
100         catch_exception( &ex );
101         
102         // Assignment unneeded, as the audio unit will do it for us
103         /*audio = */ [[VLCAudio alloc] initWithLibrary:self];
104     }
105     return self;
106 }
107
108 - (void)dealloc 
109 {
110     if( instance ) 
111         libvlc_release( instance );
112     
113     if( self == sharedLibrary ) 
114         sharedLibrary = nil;
115     
116     instance = nil;
117     [audio release];
118     [super dealloc];
119 }
120
121 @synthesize audio;
122 @end
123
124 @implementation VLCLibrary (VLCLibVLCBridging)
125 + (void *)sharedInstance
126 {
127     return [self sharedLibrary].instance;
128 }
129
130 - (void *)instance
131 {
132     return instance;
133 }
134 @end
135
136 @implementation VLCLibrary (VLCAudioBridging)
137 - (void)setAudio:(VLCAudio *)value
138 {
139     if (!audio)
140         audio = value;
141 }
142 @end