]> git.sesse.net Git - vlc/blob - projects/macosx/framework/Sources/VLCExtensionsManager.m
macosx/framework: Hack ourselves to get extensions.
[vlc] / projects / macosx / framework / Sources / VLCExtensionsManager.m
1 //
2 //  VLCExtensionsManager.m
3 //  VLCKit
4 //
5 //  Created by Pierre d'Herbemont on 1/26/10.
6 //  Copyright 2010 __MyCompanyName__. All rights reserved.
7 //
8
9 #import "VLCExtensionsManager.h"
10 #import "VLCExtension.h"
11 #import "VLCLibrary.h"
12 #import "VLCLibVLCBridging.h"
13 #import <vlc_extensions.h>
14 #import <vlc_input.h>
15
16 // Here comes the nasty hack.
17 #import "../../../../src/control/media_player_internal.h"
18 #import "../../../../src/control/libvlc_internal.h"
19
20 static input_thread_t *libvlc_media_player_get_input_thread(libvlc_media_player_t *player)
21 {
22     vlc_mutex_lock(&player->object_lock);
23     input_thread_t *input = player->p_input_thread;
24     if(input)
25         vlc_object_hold(input);
26     vlc_mutex_unlock(&player->object_lock);
27     return input;
28 }
29
30 static vlc_object_t *libvlc_get_vlc_instance(libvlc_instance_t *instance)
31 {
32     vlc_mutex_lock(&instance->instance_lock);
33     libvlc_int_t *libvlc = instance->p_libvlc_int;
34     if(libvlc)
35         vlc_object_hold(libvlc);
36     vlc_mutex_unlock(&instance->instance_lock);
37     return VLC_OBJECT(libvlc);
38 }
39
40
41 #define _instance ((extensions_manager_t *)instance)
42
43 @implementation VLCExtensionsManager
44 static VLCExtensionsManager *sharedManager = nil;
45
46 + (VLCExtensionsManager *)sharedManager
47 {
48     if (!sharedManager)
49     {
50         /* Initialize a shared instance */
51         sharedManager = [[self alloc] init];
52     }
53     return sharedManager;
54 }
55
56 - (void)dealloc
57 {
58     module_unneed(_instance, _instance->p_module);
59     vlc_object_release(_instance);
60
61     [[NSNotificationCenter defaultCenter] removeObserver:self];
62
63     [_extensions release];
64     [super dealloc];
65 }
66
67 - (NSArray *)extensions
68 {
69     if (!instance)
70     {
71         vlc_object_t *libvlc = libvlc_get_vlc_instance([VLCLibrary sharedInstance]);
72         instance = vlc_object_create(libvlc, sizeof(extensions_manager_t));
73         if (!_instance)
74         {
75             vlc_object_release(libvlc);
76             return nil;
77         }
78         vlc_object_attach(_instance, libvlc);
79
80         _instance->p_module = module_need(_instance, "extension", NULL, false);
81         NSAssert(_instance->p_module, @"Unable to load extensions module");
82
83         vlc_object_release(libvlc);
84     }
85
86     if (_extensions)
87         return _extensions;
88     _extensions = [[NSMutableArray alloc] init];
89     extension_t *ext;
90     vlc_mutex_lock(&_instance->lock);
91     FOREACH_ARRAY(ext, _instance->extensions)
92         VLCExtension *extension = [[VLCExtension alloc] initWithInstance:ext];
93         [_extensions addObject:extension];
94         [extension release];
95     FOREACH_END()
96     vlc_mutex_unlock(&_instance->lock);
97     return _extensions;
98 }
99
100 - (void)runExtension:(VLCExtension *)extension
101 {
102     extension_t *ext = [extension instance];
103
104     if(extension_TriggerOnly(_instance, ext))
105         extension_Trigger(_instance, ext);
106     else
107     {
108         if(!extension_IsActivated(_instance, ext))
109             extension_Activate(_instance, ext);
110     }
111 }
112
113 - (void)mediaPlayerLikelyChangedInput
114 {
115     input_thread_t *input = _player ? libvlc_media_player_get_input_thread([_player libVLCMediaPlayer]) : NULL;
116
117     // Don't send more than appropriate
118     if (_previousInput == input)
119         return;
120     _previousInput = input;
121
122     for(VLCExtension *extension in _extensions)
123         extension_SetInput(_instance, [extension instance], input);
124     if (input)
125         vlc_object_release(input);
126 }
127
128 - (void)setMediaPlayer:(VLCMediaPlayer *)player
129 {
130     if (_player == player)
131         return;
132
133     // Don't set a NULL mediaPlayer.
134     // so that we always have an input around.
135     if (!player)
136         return;
137
138     NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
139     [center removeObserver:self name:VLCMediaPlayerStateChanged object:_player];
140
141     [_player release];
142     _player = [player retain];
143
144     [self mediaPlayerLikelyChangedInput];
145
146
147     if (player)
148         [center addObserver:self selector:@selector(mediaPlayerLikelyChangedInput) name:VLCMediaPlayerStateChanged object:_player];
149 }
150
151 - (VLCMediaPlayer *)mediaPlayer
152 {
153     return _player;
154 }
155 @end