Commit 9d619a74 authored by Felix Paul Kühne's avatar Felix Paul Kühne

macosx/media-source: add API wrapper

parent 86470dcc
......@@ -154,6 +154,9 @@
7DFBDCB1226A518400B700A5 /* VLCLibraryMenuController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFBDCB0226A518400B700A5 /* VLCLibraryMenuController.m */; };
7DFBDCB4226CD00900B700A5 /* VLCLibraryDataTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFBDCB3226CD00900B700A5 /* VLCLibraryDataTypes.m */; };
7DFBDCB7226CDFD600B700A5 /* VLCImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFBDCB6226CDFD600B700A5 /* VLCImageView.m */; };
7DFBDCBB226CED6300B700A5 /* VLCMediaSourceProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFBDCBA226CED6300B700A5 /* VLCMediaSourceProvider.m */; };
7DFBDCBE226CED7200B700A5 /* VLCMediaSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFBDCBD226CED7200B700A5 /* VLCMediaSource.m */; };
7DFBDCC1226DC16200B700A5 /* VLCInputItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFBDCC0226DC16200B700A5 /* VLCInputItem.m */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
......@@ -521,6 +524,12 @@
7DFBDCB3226CD00900B700A5 /* VLCLibraryDataTypes.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryDataTypes.m; sourceTree = "<group>"; };
7DFBDCB5226CDFD600B700A5 /* VLCImageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCImageView.h; sourceTree = "<group>"; };
7DFBDCB6226CDFD600B700A5 /* VLCImageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCImageView.m; sourceTree = "<group>"; };
7DFBDCB9226CED6300B700A5 /* VLCMediaSourceProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCMediaSourceProvider.h; sourceTree = "<group>"; };
7DFBDCBA226CED6300B700A5 /* VLCMediaSourceProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCMediaSourceProvider.m; sourceTree = "<group>"; };
7DFBDCBC226CED7200B700A5 /* VLCMediaSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCMediaSource.h; sourceTree = "<group>"; };
7DFBDCBD226CED7200B700A5 /* VLCMediaSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCMediaSource.m; sourceTree = "<group>"; };
7DFBDCBF226DC16200B700A5 /* VLCInputItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCInputItem.h; sourceTree = "<group>"; };
7DFBDCC0226DC16200B700A5 /* VLCInputItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCInputItem.m; sourceTree = "<group>"; };
8E49720006417F6800370C9F /* VLCInformationWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCInformationWindowController.h; sourceTree = "<group>"; };
8E49720106417F6800370C9F /* VLCInformationWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCInformationWindowController.m; sourceTree = "<group>"; };
8E55FB7F0459B0FD00FB3317 /* VLCOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCOutput.h; sourceTree = "<group>"; };
......@@ -664,6 +673,7 @@
1C1ED5112204B08E00811EC0 /* extensions */,
1C1ED5122204B0B500811EC0 /* imported */,
1C1ED5132204B0CB00811EC0 /* library */,
7DFBDCB8226CED3700B700A5 /* media-source */,
1C1ED50E2204B01C00811EC0 /* main */,
1C1ED50F2204B04A00811EC0 /* menus */,
1C1ED50C2204AFD900811EC0 /* os-integration */,
......@@ -939,6 +949,8 @@
7DFBDCAD2269ED0C00B700A5 /* VLCLibraryDataSource.m */,
7DFBDCAF226A518400B700A5 /* VLCLibraryMenuController.h */,
7DFBDCB0226A518400B700A5 /* VLCLibraryMenuController.m */,
7DFBDCBF226DC16200B700A5 /* VLCInputItem.h */,
7DFBDCC0226DC16200B700A5 /* VLCInputItem.m */,
);
path = library;
sourceTree = "<group>";
......@@ -1299,6 +1311,17 @@
name = Frameworks;
sourceTree = "<group>";
};
7DFBDCB8226CED3700B700A5 /* media-source */ = {
isa = PBXGroup;
children = (
7DFBDCB9226CED6300B700A5 /* VLCMediaSourceProvider.h */,
7DFBDCBA226CED6300B700A5 /* VLCMediaSourceProvider.m */,
7DFBDCBC226CED7200B700A5 /* VLCMediaSource.h */,
7DFBDCBD226CED7200B700A5 /* VLCMediaSource.m */,
);
path = "media-source";
sourceTree = "<group>";
};
8E445F86047289E50059A3A7 /* File Icons */ = {
isa = PBXGroup;
children = (
......@@ -1519,6 +1542,7 @@
1CCC88F02078A3D500E5626F /* About.xib in Sources */,
7DFBDCA82269E77500B700A5 /* VLCLibraryController.m in Sources */,
1CCC88F12078A3D500E5626F /* AddonManager.xib in Sources */,
7DFBDCC1226DC16200B700A5 /* VLCInputItem.m in Sources */,
1CCC88F22078A3D500E5626F /* AudioEffects.xib in Sources */,
1CCC88F32078A3D500E5626F /* VideoEffects.xib in Sources */,
1CCC88F42078A3D500E5626F /* Bookmarks.xib in Sources */,
......@@ -1526,6 +1550,7 @@
1CCC88F62078A3D500E5626F /* MediaInfo.xib in Sources */,
7D66D4392200C5B80040D04A /* VLCVideoFilterHelper.m in Sources */,
7D445D812202524000263D34 /* VLCPlaylistController.m in Sources */,
7DFBDCBE226CED7200B700A5 /* VLCMediaSource.m in Sources */,
1CCC88F72078A3D500E5626F /* ConvertAndSave.xib in Sources */,
1CCC88F82078A3D500E5626F /* CoreDialogs.xib in Sources */,
1CCC88F92078A3D500E5626F /* DetachedVideoWindow.xib in Sources */,
......@@ -1588,6 +1613,7 @@
7D0F640C2202163E00FDB91F /* VLCPlaylistDataSource.m in Sources */,
1C3113AD1E508C6900D4DD76 /* VLCExtensionsManager.m in Sources */,
1C3113AF1E508C6900D4DD76 /* VLCFSPanelController.m in Sources */,
7DFBDCBB226CED6300B700A5 /* VLCMediaSourceProvider.m in Sources */,
7D66D4362200BC340040D04A /* VLCClickerManager.m in Sources */,
1C3113B11E508C6900D4DD76 /* VLCFSPanelDraggableView.m in Sources */,
1C3113B41E508C6900D4DD76 /* VLCPlaybackContinuityController.m in Sources */,
......
......@@ -44,6 +44,8 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/imported/AppleRemote/AppleRemote.m \
gui/macosx/imported/SPMediaKeyTap/SPMediaKeyTap.h \
gui/macosx/imported/SPMediaKeyTap/SPMediaKeyTap.m \
gui/macosx/library/VLCInputItem.h \
gui/macosx/library/VLCInputItem.m \
gui/macosx/library/VLCLibraryCollectionViewItem.h \
gui/macosx/library/VLCLibraryCollectionViewItem.m \
gui/macosx/library/VLCLibraryController.h \
......@@ -137,6 +139,10 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/preferences/prefs.m \
gui/macosx/preferences/prefs_widgets.h \
gui/macosx/preferences/prefs_widgets.m \
gui/macosx/media-source/VLCMediaSource.h \
gui/macosx/media-source/VLCMediaSource.m \
gui/macosx/media-source/VLCMediaSourceProvider.h \
gui/macosx/media-source/VLCMediaSourceProvider.m \
gui/macosx/views/VLCBottomBarView.h \
gui/macosx/views/VLCBottomBarView.m \
gui/macosx/views/VLCDefaultValueSlider.h \
......
/*****************************************************************************
* VLCInputItem.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2019 VLC authors and VideoLAN
*
* Authors: Felix Paul Kühne <fkuehne # videolan -dot- org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Foundation/Foundation.h>
#import <vlc_common.h>
#import <vlc_input_item.h>
#import <vlc_tick.h>
NS_ASSUME_NONNULL_BEGIN
@interface VLCInputItem : NSObject
- (instancetype)initWithInputItem:(struct input_item_t *)p_inputItem;
@property (readonly) NSString *name;
@property (readonly) NSString *MRL;
@property (readonly) vlc_tick_t duration;
@property (readonly) enum input_item_type_e inputType;
@end
@interface VLCInputNode : NSObject
- (instancetype)initWithInputNode:(struct input_item_node_t *)p_inputNode;
@property (readonly, nullable) VLCInputItem *inputItem;
@property (readonly) int numberOfChildren;
@property (readonly) NSArray <VLCInputNode *> *children;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCInputItem.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2019 VLC authors and VideoLAN
*
* Authors: Felix Paul Kühne <fkuehne # videolan -dot- org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "VLCInputItem.h"
#import "extensions/NSString+Helpers.h"
@interface VLCInputItem()
{
struct input_item_t *_p_inputItem;
}
@end
@implementation VLCInputItem
- (instancetype)initWithInputItem:(struct input_item_t *)p_inputItem
{
self = [super init];
if (self && p_inputItem != NULL) {
_p_inputItem = p_inputItem;
input_item_Hold(_p_inputItem);
}
return self;
}
- (void)dealloc
{
input_item_Release(_p_inputItem);
}
- (NSString *)name
{
if (_p_inputItem) {
return toNSStr(_p_inputItem->psz_name);
}
return @"";
}
- (NSString *)MRL
{
if (_p_inputItem) {
return toNSStr(_p_inputItem->psz_uri);
}
return @"";
}
- (vlc_tick_t)duration
{
if (_p_inputItem) {
return _p_inputItem->i_duration;
}
return -1;
}
- (enum input_item_type_e)inputType
{
if (_p_inputItem) {
return _p_inputItem->i_type;
}
return ITEM_TYPE_UNKNOWN;
}
@end
@interface VLCInputNode()
{
struct input_item_node_t *_p_inputNode;
}
@end
@implementation VLCInputNode
- (instancetype)initWithInputNode:(struct input_item_node_t *)p_inputNode
{
self = [super init];
if (self && p_inputNode != NULL) {
_p_inputNode = p_inputNode;
}
return self;
}
- (VLCInputItem *)inputItem
{
if (_p_inputNode->p_item) {
return [[VLCInputItem alloc] initWithInputItem:_p_inputNode->p_item];
}
return nil;
}
- (int)numberOfChildren
{
return _p_inputNode->i_children;
}
- (NSArray<VLCInputNode *> *)children
{
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:_p_inputNode->i_children];
for (int i = 0; i < _p_inputNode->i_children; i++) {
VLCInputNode *inputNode = [[VLCInputNode alloc] initWithInputNode:_p_inputNode->pp_children[i]];
if (inputNode) {
[mutableArray addObject:inputNode];
}
}
return [mutableArray copy];
}
@end
/*****************************************************************************
* VLCMediaSource.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2019 VLC authors and VideoLAN
*
* Authors: Felix Paul Kühne <fkuehne # videolan -dot- org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Foundation/Foundation.h>
#import <vlc_media_source.h>
@class VLCInputNode;
NS_ASSUME_NONNULL_BEGIN
extern NSString *VLCMediaSourceChildrenReset;
extern NSString *VLCMediaSourceChildrenAdded;
extern NSString *VLCMediaSourceChildrenRemoved;
@interface VLCMediaSource : NSObject
- (instancetype)initWithMediaSource:(vlc_media_source_t *)p_mediaSource;
@property (readonly) NSString *mediaSourceDescription;
@property (readonly) VLCInputNode *rootNode;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCMediaSource.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2019 VLC authors and VideoLAN
*
* Authors: Felix Paul Kühne <fkuehne # videolan -dot- org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "VLCMediaSource.h"
#import "library/VLCInputItem.h"
#import "extensions/NSString+Helpers.h"
@interface VLCMediaSource ()
{
vlc_media_source_t *_p_mediaSource;
vlc_media_tree_listener_id *_p_treeListenerID;
}
@end
NSString *VLCMediaSourceChildrenReset = @"VLCMediaSourceChildrenReset";
NSString *VLCMediaSourceChildrenAdded = @"VLCMediaSourceChildrenAdded";
NSString *VLCMediaSourceChildrenRemoved = @"VLCMediaSourceChildrenRemoved";
static void cb_children_reset(vlc_media_tree_t *p_tree,
input_item_node_t *p_node,
void *p_data)
{
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:VLCMediaSourceChildrenReset
object:[[VLCInputNode alloc] initWithInputNode:p_node]];
});
}
static void cb_children_added(vlc_media_tree_t *p_tree,
input_item_node_t *p_node,
input_item_node_t *const p_children[],
size_t count,
void *p_data)
{
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:VLCMediaSourceChildrenAdded
object:[[VLCInputNode alloc] initWithInputNode:p_node]];
});
}
static void cb_children_removed(vlc_media_tree_t *p_tree,
input_item_node_t *p_node,
input_item_node_t *const p_children[],
size_t count,
void *p_data)
{
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:VLCMediaSourceChildrenRemoved
object:[[VLCInputNode alloc] initWithInputNode:p_node]];
});
}
static const struct vlc_media_tree_callbacks treeCallbacks = {
cb_children_reset,
cb_children_added,
cb_children_removed,
};
@implementation VLCMediaSource
- (instancetype)initWithMediaSource:(vlc_media_source_t *)p_mediaSource
{
self = [super init];
if (self && p_mediaSource != NULL) {
_p_mediaSource = p_mediaSource;
vlc_media_source_Hold(_p_mediaSource);
_p_treeListenerID = vlc_media_tree_AddListener(_p_mediaSource->tree,
&treeCallbacks,
(__bridge void *)self,
NO);
}
return self;
}
- (void)dealloc
{
if (_p_mediaSource != NULL) {
if (_p_treeListenerID) {
vlc_media_tree_RemoveListener(_p_mediaSource->tree,
_p_treeListenerID);
}
vlc_media_source_Release(_p_mediaSource);
}
}
- (NSString *)mediaSourceDescription
{
if (_p_mediaSource != NULL) {
return toNSStr(_p_mediaSource->description);
}
return @"";
}
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ — %@", NSStringFromClass([self class]), self.mediaSourceDescription];
}
- (VLCInputNode *)rootNode
{
vlc_media_tree_Lock(_p_mediaSource->tree);
VLCInputNode *inputNode = [[VLCInputNode alloc] initWithInputNode:&_p_mediaSource->tree->root];
vlc_media_tree_Unlock(_p_mediaSource->tree);
return inputNode;
}
@end
/*****************************************************************************
* VLCMediaSourceProvider.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2019 VLC authors and VideoLAN
*
* Authors: Felix Paul Kühne <fkuehne # videolan -dot- org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Foundation/Foundation.h>
#import <vlc_services_discovery.h>
@class VLCMediaSource;
NS_ASSUME_NONNULL_BEGIN
@interface VLCMediaSourceProvider : NSObject
+ (NSArray <VLCMediaSource *> *)listOfMediaSourcesForCategory:(enum services_discovery_category_e)category;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCMediaSourceProvider.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2019 VLC authors and VideoLAN
*
* Authors: Felix Paul Kühne <fkuehne # videolan -dot- org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "VLCMediaSourceProvider.h"
#import "media-source/VLCMediaSource.h"
#import "main/VLCMain.h"
#import <vlc_media_source.h>
@implementation VLCMediaSourceProvider
+ (NSArray <VLCMediaSource *> *)listOfMediaSourcesForCategory:(enum services_discovery_category_e)category
{
libvlc_int_t *p_libvlcInstance = vlc_object_instance(getIntf());
vlc_media_source_provider_t *p_sourceProvider = vlc_media_source_provider_Get(p_libvlcInstance);
if (p_sourceProvider == NULL) {
return @[];
}
vlc_media_source_meta_list_t *p_sourceMetaList = vlc_media_source_provider_List(p_sourceProvider,
category);
size_t count = vlc_media_source_meta_list_Count(p_sourceMetaList);
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:count];
for (size_t x = 0; x < count; x++) {
struct vlc_media_source_meta *p_sourceMetaItem = vlc_media_source_meta_list_Get(p_sourceMetaList, x);
vlc_media_source_t *p_mediaSource = vlc_media_source_provider_GetMediaSource(p_sourceProvider, p_sourceMetaItem->name);
if (p_mediaSource == NULL) {
continue;
}
VLCMediaSource *mediaSource = [[VLCMediaSource alloc] initWithMediaSource:p_mediaSource];
[mutableArray addObject:mediaSource];
}
vlc_media_source_meta_list_Delete(p_sourceMetaList);
return [mutableArray copy];
}
@end
......@@ -462,6 +462,8 @@ modules/gui/macosx/extensions/VLCHexNumberFormatter.h
modules/gui/macosx/extensions/VLCHexNumberFormatter.m
modules/gui/macosx/extensions/misc.h
modules/gui/macosx/extensions/misc.m
modules/gui/macosx/library/VLCInputItem.h
modules/gui/macosx/library/VLCInputItem.m
modules/gui/macosx/library/VLCLibraryCollectionViewItem.h
modules/gui/macosx/library/VLCLibraryCollectionViewItem.m
modules/gui/macosx/library/VLCLibraryController.h
......@@ -553,6 +555,10 @@ modules/gui/macosx/preferences/prefs.h
modules/gui/macosx/preferences/prefs.m
modules/gui/macosx/preferences/prefs_widgets.h
modules/gui/macosx/preferences/prefs_widgets.m
modules/gui/macosx/media-source/VLCMediaSource.h
modules/gui/macosx/media-source/VLCMediaSource.m
modules/gui/macosx/media-source/VLCMediaSourceProvider.h
modules/gui/macosx/media-source/VLCMediaSourceProvider.m
modules/gui/macosx/views/VLCBottomBarView.h
modules/gui/macosx/views/VLCBottomBarView.m
modules/gui/macosx/views/VLCDefaultValueSlider.h
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment