From 55a92b318bec18a6c31424f3ffdd8a9e80dd0bc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <felix@feepk.net> Date: Wed, 26 Jun 2019 14:18:04 +0200 Subject: [PATCH] macosx: iterate on media discovery This shows discovered devices now instead of services capable of discovering something. Browsing will be implement in subsequent commits. --- modules/gui/macosx/library/VLCInputItem.m | 10 ++ .../gui/macosx/media-source/VLCMediaSource.m | 9 +- .../media-source/VLCMediaSourceDataSource.h | 1 - .../media-source/VLCMediaSourceDataSource.m | 95 +++++++++++++------ 4 files changed, 80 insertions(+), 35 deletions(-) diff --git a/modules/gui/macosx/library/VLCInputItem.m b/modules/gui/macosx/library/VLCInputItem.m index 9f998ec2f4be..b20f4ead4553 100644 --- a/modules/gui/macosx/library/VLCInputItem.m +++ b/modules/gui/macosx/library/VLCInputItem.m @@ -92,6 +92,16 @@ return self; } +- (NSString *)description +{ + NSString *inputItemName; + if (_p_inputNode->p_item) + inputItemName = toNSStr(_p_inputNode->p_item->psz_name); + else + inputItemName = @"p_item == nil"; + return [NSString stringWithFormat:@"%@: node: %p input name: %@, number of children: %i", NSStringFromClass([self class]), _p_inputNode, inputItemName, self.numberOfChildren]; +} + - (VLCInputItem *)inputItem { if (_p_inputNode->p_item) { diff --git a/modules/gui/macosx/media-source/VLCMediaSource.m b/modules/gui/macosx/media-source/VLCMediaSource.m index 7e099310023d..d02bee24f7c6 100644 --- a/modules/gui/macosx/media-source/VLCMediaSource.m +++ b/modules/gui/macosx/media-source/VLCMediaSource.m @@ -43,8 +43,9 @@ static void cb_children_reset(vlc_media_tree_t *p_tree, void *p_data) { dispatch_async(dispatch_get_main_queue(), ^{ + VLCMediaSource *mediaSource = (__bridge VLCMediaSource *)p_data; [[NSNotificationCenter defaultCenter] postNotificationName:VLCMediaSourceChildrenReset - object:[[VLCInputNode alloc] initWithInputNode:p_node]]; + object:mediaSource]; }); } @@ -55,8 +56,9 @@ static void cb_children_added(vlc_media_tree_t *p_tree, void *p_data) { dispatch_async(dispatch_get_main_queue(), ^{ + VLCMediaSource *mediaSource = (__bridge VLCMediaSource *)p_data; [[NSNotificationCenter defaultCenter] postNotificationName:VLCMediaSourceChildrenAdded - object:[[VLCInputNode alloc] initWithInputNode:p_node]]; + object:mediaSource]; }); } @@ -67,8 +69,9 @@ static void cb_children_removed(vlc_media_tree_t *p_tree, void *p_data) { dispatch_async(dispatch_get_main_queue(), ^{ + VLCMediaSource *mediaSource = (__bridge VLCMediaSource *)p_data; [[NSNotificationCenter defaultCenter] postNotificationName:VLCMediaSourceChildrenRemoved - object:[[VLCInputNode alloc] initWithInputNode:p_node]]; + object:mediaSource]; }); } diff --git a/modules/gui/macosx/media-source/VLCMediaSourceDataSource.h b/modules/gui/macosx/media-source/VLCMediaSourceDataSource.h index 897231ed68ee..8c6b6143cf69 100644 --- a/modules/gui/macosx/media-source/VLCMediaSourceDataSource.h +++ b/modules/gui/macosx/media-source/VLCMediaSourceDataSource.h @@ -31,7 +31,6 @@ NS_ASSUME_NONNULL_BEGIN @interface VLCMediaSourceDataSource : NSObject <NSCollectionViewDataSource, NSCollectionViewDelegate> -@property (readwrite) VLCMediaSourceMode mediaSourceMode; @property (readwrite) NSCollectionView *collectionView; - (void)loadMediaSources; diff --git a/modules/gui/macosx/media-source/VLCMediaSourceDataSource.m b/modules/gui/macosx/media-source/VLCMediaSourceDataSource.m index c07245761b9c..c55bbbf8a48d 100644 --- a/modules/gui/macosx/media-source/VLCMediaSourceDataSource.m +++ b/modules/gui/macosx/media-source/VLCMediaSourceDataSource.m @@ -32,7 +32,7 @@ @interface VLCMediaSourceDataSource () { - NSArray *_mediaDiscovery; + NSArray *_mediaSources; } @end @@ -42,39 +42,55 @@ { self = [super init]; if (self) { - _mediaDiscovery = @[]; + _mediaSources = @[]; + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self + selector:@selector(mediaSourceChildrenReset:) + name:VLCMediaSourceChildrenReset + object:nil]; + [notificationCenter addObserver:self + selector:@selector(mediaSourceChildrenAdded:) + name:VLCMediaSourceChildrenAdded + object:nil]; + [notificationCenter addObserver:self + selector:@selector(mediaSourceChildrenRemoved:) + name:VLCMediaSourceChildrenRemoved + object:nil]; } return self; } +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + - (void)loadMediaSources { - NSArray *mediaDiscoveryForLAN = [VLCMediaSourceProvider listOfMediaSourcesForCategory:SD_CAT_LAN]; - NSUInteger count = mediaDiscoveryForLAN.count; + NSArray *mediaSourcesOnLAN = [VLCMediaSourceProvider listOfMediaSourcesForCategory:SD_CAT_LAN]; + NSUInteger count = mediaSourcesOnLAN.count; if (count > 0) { for (NSUInteger x = 0; x < count; x++) { - VLCMediaSource *mediaSource = mediaDiscoveryForLAN[x]; + VLCMediaSource *mediaSource = mediaSourcesOnLAN[x]; VLCInputNode *rootNode = [mediaSource rootNode]; [mediaSource preparseInputItemWithinTree:rootNode.inputItem]; } } - _mediaDiscovery = mediaDiscoveryForLAN; + _mediaSources = mediaSourcesOnLAN; [self.collectionView reloadData]; } +- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView +{ + return _mediaSources.count; +} + - (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - switch (self.mediaSourceMode) { - case VLCMediaSourceModeLAN: - return _mediaDiscovery.count; - break; - - case VLCMediaSourceModeInternet: - default: - return 0; - break; - } + VLCMediaSource *mediaSource = _mediaSources[section]; + VLCInputNode *rootNode = mediaSource.rootNode; + return rootNode.numberOfChildren; } - (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView @@ -82,21 +98,12 @@ { VLCMediaSourceCollectionViewItem *viewItem = [collectionView makeItemWithIdentifier:VLCMediaSourceCellIdentifier forIndexPath:indexPath]; - NSArray *mediaArray; - switch (self.mediaSourceMode) { - case VLCMediaSourceModeLAN: - mediaArray = _mediaDiscovery; - break; - - case VLCMediaSourceModeInternet: - default: - NSAssert(1, @"no representation for selected media source mode %li", (long)self.mediaSourceMode); - mediaArray = @[]; - break; - } - - VLCMediaSource *mediaSource = mediaArray[indexPath.item]; - viewItem.titleTextField.stringValue = mediaSource.mediaSourceDescription; + VLCMediaSource *mediaSource = _mediaSources[indexPath.section]; + VLCInputNode *rootNode = mediaSource.rootNode; + NSArray *nodeChildren = rootNode.children; + VLCInputNode *childNode = nodeChildren[indexPath.item]; + VLCInputItem *childRootInput = childNode.inputItem; + viewItem.titleTextField.stringValue = childRootInput.name; return viewItem; } @@ -106,4 +113,30 @@ NSLog(@"media source selection changed: %@", indexPaths); } +#pragma mark - VLCMediaSource Delegation + +- (void)mediaSourceChildrenReset:(NSNotification *)aNotification +{ + msg_Dbg(getIntf(), "Reset nodes: %s", [[aNotification.object description] UTF8String]); + [self reloadDataForNotification:aNotification]; +} + +- (void)mediaSourceChildrenAdded:(NSNotification *)aNotification +{ + msg_Dbg(getIntf(), "Received new nodes: %s", [[aNotification.object description] UTF8String]); + [self reloadDataForNotification:aNotification]; +} + +- (void)mediaSourceChildrenRemoved:(NSNotification *)aNotification +{ + msg_Dbg(getIntf(), "Removed nodes: %s", [[aNotification.object description] UTF8String]); + [self reloadDataForNotification:aNotification]; +} + +- (void)reloadDataForNotification:(NSNotification *)aNotification +{ + NSInteger index = [_mediaSources indexOfObject:aNotification.object]; + [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:index]]; +} + @end -- GitLab