Replace libvlc_exception_get_message with libvlc_errmsg
[vlc.git] / projects / macosx / framework / Sources / VLCLibrary.m
1 /*****************************************************************************
2  * VLCLibrary.m: VLCKit.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_errmsg(), 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=minimal_macosx", 
95             "--no-video-title-show", "--no-sout-keep", "--ignore-config",
96                         "--opengl-provider=minimal_macosx",
97                         "-verbose=-1"
98             //, "--control=motion", "--motion-use-rotate", "--video-filter=rotate"
99         };
100         
101         instance = (void *)libvlc_new( sizeof(lib_vlc_params)/sizeof(lib_vlc_params[0]), lib_vlc_params, &ex );
102         catch_exception( &ex );
103         
104         // Assignment unneeded, as the audio unit will do it for us
105         /*audio = */ [[VLCAudio alloc] initWithLibrary:self];
106     }
107     return self;
108 }
109
110 - (void)dealloc 
111 {
112     if( instance ) 
113         libvlc_release( instance );
114     
115     if( self == sharedLibrary ) 
116         sharedLibrary = nil;
117     
118     instance = nil;
119     [audio release];
120     [super dealloc];
121 }
122
123 @synthesize audio;
124 @end
125
126 @implementation VLCLibrary (VLCLibVLCBridging)
127 + (void *)sharedInstance
128 {
129     return [self sharedLibrary].instance;
130 }
131
132 - (void *)instance
133 {
134     return instance;
135 }
136 @end
137
138 @implementation VLCLibrary (VLCAudioBridging)
139 - (void)setAudio:(VLCAudio *)value
140 {
141     if (!audio)
142         audio = value;
143 }
144 @end