You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.0 KiB
156 lines
4.0 KiB
//
|
|
// VLCExtensionsManager.m
|
|
// VLCKit
|
|
//
|
|
// Created by Pierre d'Herbemont on 1/26/10.
|
|
// Copyright 2010 __MyCompanyName__. All rights reserved.
|
|
//
|
|
|
|
#import "VLCExtensionsManager.h"
|
|
#import "VLCExtension.h"
|
|
#import "VLCLibrary.h"
|
|
#import "VLCLibVLCBridging.h"
|
|
#import <vlc_extensions.h>
|
|
#import <vlc_input.h>
|
|
#include <vlc_modules.h>
|
|
|
|
// Here comes the nasty hack.
|
|
#define MODULE_STRING "VLCKit"
|
|
#import "../../../../src/control/media_player_internal.h"
|
|
#import "../../../../src/control/libvlc_internal.h"
|
|
|
|
static input_thread_t *libvlc_media_player_get_input_thread(libvlc_media_player_t *player)
|
|
{
|
|
vlc_mutex_lock(&player->input.lock);
|
|
input_thread_t *input = player->input.p_thread;
|
|
if(input)
|
|
vlc_object_hold(input);
|
|
vlc_mutex_unlock(&player->input.lock);
|
|
return input;
|
|
}
|
|
|
|
static vlc_object_t *libvlc_get_vlc_instance(libvlc_instance_t *instance)
|
|
{
|
|
vlc_mutex_lock(&instance->instance_lock);
|
|
libvlc_int_t *libvlc = instance->p_libvlc_int;
|
|
if(libvlc)
|
|
vlc_object_hold(libvlc);
|
|
vlc_mutex_unlock(&instance->instance_lock);
|
|
return VLC_OBJECT(libvlc);
|
|
}
|
|
|
|
|
|
#define _instance ((extensions_manager_t *)instance)
|
|
|
|
@implementation VLCExtensionsManager
|
|
static VLCExtensionsManager *sharedManager = nil;
|
|
|
|
+ (VLCExtensionsManager *)sharedManager
|
|
{
|
|
if (!sharedManager)
|
|
{
|
|
/* Initialize a shared instance */
|
|
sharedManager = [[self alloc] init];
|
|
}
|
|
return sharedManager;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
module_unneed(_instance, _instance->p_module);
|
|
vlc_object_release(_instance);
|
|
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
|
|
[_extensions release];
|
|
[super dealloc];
|
|
}
|
|
|
|
- (NSArray *)extensions
|
|
{
|
|
if (!instance)
|
|
{
|
|
vlc_object_t *libvlc = libvlc_get_vlc_instance([VLCLibrary sharedInstance]);
|
|
instance = vlc_object_create(libvlc, sizeof(extensions_manager_t));
|
|
if (!_instance)
|
|
{
|
|
vlc_object_release(libvlc);
|
|
return nil;
|
|
}
|
|
|
|
_instance->p_module = module_need(_instance, "extension", NULL, false);
|
|
NSAssert(_instance->p_module, @"Unable to load extensions module");
|
|
|
|
vlc_object_release(libvlc);
|
|
}
|
|
|
|
if (_extensions)
|
|
return _extensions;
|
|
_extensions = [[NSMutableArray alloc] init];
|
|
extension_t *ext;
|
|
vlc_mutex_lock(&_instance->lock);
|
|
FOREACH_ARRAY(ext, _instance->extensions)
|
|
VLCExtension *extension = [[VLCExtension alloc] initWithInstance:ext];
|
|
[_extensions addObject:extension];
|
|
[extension release];
|
|
FOREACH_END()
|
|
vlc_mutex_unlock(&_instance->lock);
|
|
return _extensions;
|
|
}
|
|
|
|
- (void)runExtension:(VLCExtension *)extension
|
|
{
|
|
extension_t *ext = [extension instance];
|
|
|
|
if(extension_TriggerOnly(_instance, ext))
|
|
extension_Trigger(_instance, ext);
|
|
else
|
|
{
|
|
if(!extension_IsActivated(_instance, ext))
|
|
extension_Activate(_instance, ext);
|
|
}
|
|
}
|
|
|
|
- (void)mediaPlayerLikelyChangedInput
|
|
{
|
|
input_thread_t *input = _player ? libvlc_media_player_get_input_thread([_player libVLCMediaPlayer]) : NULL;
|
|
|
|
// Don't send more than appropriate
|
|
if (_previousInput == input)
|
|
return;
|
|
_previousInput = input;
|
|
|
|
for(VLCExtension *extension in _extensions)
|
|
extension_SetInput(_instance, [extension instance], input);
|
|
if (input)
|
|
vlc_object_release(input);
|
|
}
|
|
|
|
- (void)setMediaPlayer:(VLCMediaPlayer *)player
|
|
{
|
|
if (_player == player)
|
|
return;
|
|
|
|
// Don't set a NULL mediaPlayer.
|
|
// so that we always have an input around.
|
|
if (!player)
|
|
return;
|
|
|
|
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
|
[center removeObserver:self name:VLCMediaPlayerStateChanged object:_player];
|
|
|
|
[_player release];
|
|
_player = [player retain];
|
|
|
|
[self mediaPlayerLikelyChangedInput];
|
|
|
|
|
|
if (player)
|
|
[center addObserver:self selector:@selector(mediaPlayerLikelyChangedInput) name:VLCMediaPlayerStateChanged object:_player];
|
|
}
|
|
|
|
- (VLCMediaPlayer *)mediaPlayer
|
|
{
|
|
return _player;
|
|
}
|
|
@end
|
|
|