Skip to content
Snippets Groups Projects
Commit 19684ab6 authored by Felix Paul Kühne's avatar Felix Paul Kühne
Browse files

macosx: implement playlist reset and dynamic updating

parent 586e3387
No related branches found
No related tags found
No related merge requests found
......@@ -44,6 +44,7 @@
<constraint firstItem="ohB-P0-nCv" firstAttribute="centerY" secondItem="c22-O7-iKe" secondAttribute="centerY" id="mGo-gc-dR6"/>
<constraint firstItem="Hnm-OH-KKY" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="owl-FT-tZX"/>
<constraint firstItem="Hnm-OH-KKY" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="vEf-1U-gh4"/>
<constraint firstItem="3Ha-ZH-fa9" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="ohB-P0-nCv" secondAttribute="trailing" constant="10" id="wQv-VX-Hhb"/>
</constraints>
<connections>
<outlet property="durationTextField" destination="3Ha-ZH-fa9" id="vbh-oE-Afj"/>
......
......@@ -47,6 +47,11 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (readwrite, assign) VLCPlaylistDataSource *playlistDataSource;
/**
* Index of the current playlist item
*/
@property (readonly) size_t currentPlaylistIndex;
/**
* indicates whether there is a previous item in the list the user could go back to
*/
......
......@@ -32,9 +32,11 @@
vlc_playlist_listener_id *_playlistListenerID;
}
- (void)playlistResetWithItems:(vlc_playlist_item_t *const *)items count:(size_t)numberOfItems;
- (void)playlistAdded:(vlc_playlist_item_t *const *)items atIndex:(size_t)insertionIndex count:(size_t)numberOfItems;
- (void)playlistRemovedItemsAtIndex:(size_t)index count:(size_t)numberOfItems;
- (void)currentPlaylistItemChanged:(ssize_t)index;
- (void)playlistUpdatedForIndex:(size_t)firstUpdatedIndex items:(vlc_playlist_item_t *const *)items count:(size_t)numberOfItems;
@end
......@@ -48,6 +50,8 @@ cb_playlist_items_reset(vlc_playlist_t *playlist,
void *p_data)
{
NSLog(@"%s: numberOfItems %zu", __func__, numberOfItems);
VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
[playlistController playlistResetWithItems:items count:numberOfItems];
}
static void
......@@ -75,12 +79,14 @@ cb_playlist_items_removed(vlc_playlist_t *playlist,
static void
cb_playlist_items_updated(vlc_playlist_t *playlist,
size_t index,
size_t firstUpdatedIndex,
vlc_playlist_item_t *const items[],
size_t len,
size_t numberOfUpdatedItems,
void *p_data)
{
NSLog(@"%s: index: %zu len: %zu", __func__, index, len);
NSLog(@"%s: index: %zu len: %zu", __func__, firstUpdatedIndex, numberOfUpdatedItems);
VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
[playlistController playlistUpdatedForIndex:firstUpdatedIndex items:items count:numberOfUpdatedItems];
}
static void
......@@ -159,6 +165,17 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
#pragma mark - callback forwarders
- (void)playlistResetWithItems:(vlc_playlist_item_t *const *)items count:(size_t)numberOfItems
{
NSLog(@"%s", __func__);
for (size_t i = 0; i < numberOfItems; i++) {
[_playlistModel addItem:items[i]];
}
[_playlistDataSource performSelectorOnMainThread:@selector(playlistUpdated) withObject:nil waitUntilDone:NO];
}
- (void)playlistAdded:(vlc_playlist_item_t *const *)items atIndex:(size_t)insertionIndex count:(size_t)numberOfItems
{
NSLog(@"%s", __func__);
......@@ -184,6 +201,17 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
- (void)currentPlaylistItemChanged:(ssize_t)index
{
_currentPlaylistIndex = index;
[_playlistDataSource performSelectorOnMainThread:@selector(playlistUpdated) withObject:nil waitUntilDone:NO];
}
- (void)playlistUpdatedForIndex:(size_t)firstUpdatedIndex items:(vlc_playlist_item_t *const *)items count:(size_t)numberOfItems
{
NSLog(@"%s", __func__);
VLC_UNUSED(items);
for (size_t i = firstUpdatedIndex; i < firstUpdatedIndex + numberOfItems; i++) {
[_playlistModel updateItemAtIndex:i];
}
[_playlistDataSource performSelectorOnMainThread:@selector(playlistUpdated) withObject:nil waitUntilDone:NO];
}
......
......@@ -77,7 +77,7 @@ static NSString *VLCPlaylistCellIdentifier = @"VLCPlaylistCellIdentifier";
}
cellView.mediaTitleTextField.stringValue = item.title;
cellView.durationTextField.stringValue = [NSString stringWithTime:item.duration];
cellView.durationTextField.stringValue = [NSString stringWithTimeFromTicks:item.duration];
cellView.mediaImageView.image = [NSImage imageNamed: @"noart.png"];
// TODO: show more data if available
......
......@@ -37,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (readwrite, retain, nullable) NSString *artworkURLString;
- (instancetype)initWithPlaylistItem:(vlc_playlist_item_t *)p_item;
- (void)updateRepresentation;
@end
......
......@@ -32,24 +32,29 @@
self = [super init];
if (self) {
_playlistItem = p_item;
input_item_t *p_media = vlc_playlist_item_GetMedia(p_item);
vlc_mutex_lock(&p_media->lock);
_title = toNSStr(p_media->psz_name);
_duration = p_media->i_duration;
if (p_media->p_meta) {
_artistName = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_Artist));
_albumName = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_Album));
_artworkURLString = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_ArtworkURL));
}
vlc_mutex_unlock(&p_media->lock);
[self updateRepresentation];
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"item %p, title: %@", &_playlistItem, _title];
return [NSString stringWithFormat:@"item %p, title: %@ duration %lli", &_playlistItem, _title, _duration];
}
- (void)updateRepresentation
{
input_item_t *p_media = vlc_playlist_item_GetMedia(_playlistItem);
vlc_mutex_lock(&p_media->lock);
_title = toNSStr(p_media->psz_name);
_duration = p_media->i_duration;
if (p_media->p_meta) {
_artistName = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_Artist));
_albumName = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_Album));
_artworkURLString = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_ArtworkURL));
}
vlc_mutex_unlock(&p_media->lock);
}
- (NSString *)path
......
......@@ -33,9 +33,12 @@ NS_ASSUME_NONNULL_BEGIN
@property (readwrite, assign) VLCPlaylistController *playlistController;
@property (readonly) size_t numberOfPlaylistItems;
- (void)dropExistingData;
- (VLCPlaylistItem *)playlistItemAtIndex:(NSInteger)index;
- (void)addItem:(vlc_playlist_item_t *)item;
- (void)addItem:(vlc_playlist_item_t *)item atIndex:(size_t)index;
- (void)removeItemAtIndex:(size_t)index;
- (void)updateItemAtIndex:(size_t)index;
@end
......
......@@ -53,11 +53,22 @@
return ret;
}
- (void)dropExistingData
{
[_playlistArray removeAllObjects];
}
- (VLCPlaylistItem *)playlistItemAtIndex:(NSInteger)index
{
return _playlistArray[index];
}
- (void)addItem:(vlc_playlist_item_t *)item
{
VLCPlaylistItem *playlistItem = [[VLCPlaylistItem alloc] initWithPlaylistItem:item];
[_playlistArray addObject:playlistItem];
}
- (void)addItem:(vlc_playlist_item_t *)item atIndex:(size_t)index
{
VLCPlaylistItem *playlistItem = [[VLCPlaylistItem alloc] initWithPlaylistItem:item];
......@@ -69,4 +80,10 @@
[_playlistArray removeObjectAtIndex:index];
}
- (void)updateItemAtIndex:(size_t)index
{
VLCPlaylistItem *item = _playlistArray[index];
[item updateRepresentation];
}
@end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment