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