mirror of
https://github.com/libretro/Play-.git
synced 2025-02-08 18:16:12 +00:00
Lots of changes in the iOS version of PsfPlayer:
- Added track title and length discovery. - Playlist now displays currently playing item. - Added icons in the tab bar. Might break Win32 version since some files moved. git-svn-id: http://svn.purei.org/purei/trunk@1197 b36208d7-6611-0410-8bec-b1987f11c4a2
This commit is contained in:
parent
336d4f7343
commit
544fc681e0
@ -1,5 +1,4 @@
|
||||
#ifndef _LOCKFREEQUEUE_H_
|
||||
#define _LOCKFREEQUEUE_H_
|
||||
#pragma once
|
||||
|
||||
template <typename ValueType>
|
||||
class CLockFreeQueue
|
||||
@ -31,7 +30,7 @@ public:
|
||||
m_consIndex++;
|
||||
m_consIndex %= m_maxItemCount;
|
||||
|
||||
InterlockedDecrement(&m_itemCount);
|
||||
m_itemCount--;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -48,17 +47,15 @@ public:
|
||||
m_prodIndex++;
|
||||
m_prodIndex %= m_maxItemCount;
|
||||
|
||||
InterlockedIncrement(&m_itemCount);
|
||||
m_itemCount++;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
ValueType* m_items;
|
||||
LONG m_itemCount;
|
||||
unsigned int m_maxItemCount;
|
||||
unsigned int m_prodIndex;
|
||||
unsigned int m_consIndex;
|
||||
ValueType* m_items;
|
||||
std::atomic<unsigned int> m_itemCount;
|
||||
unsigned int m_maxItemCount;
|
||||
unsigned int m_prodIndex;
|
||||
unsigned int m_consIndex;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,5 +1,4 @@
|
||||
#ifndef _PLAYLIST_H_
|
||||
#define _PLAYLIST_H_
|
||||
#pragma once
|
||||
|
||||
#include "PsfTags.h"
|
||||
#include <vector>
|
||||
@ -67,5 +66,3 @@ private:
|
||||
ArchiveList m_archives;
|
||||
unsigned int m_currentItemId;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
132
tools/PsfPlayer/Source/PlaylistDiscoveryService.cpp
Normal file
132
tools/PsfPlayer/Source/PlaylistDiscoveryService.cpp
Normal file
@ -0,0 +1,132 @@
|
||||
#include "PlaylistDiscoveryService.h"
|
||||
#include "PsfStreamProvider.h"
|
||||
#include "PsfBase.h"
|
||||
#include "PsfTags.h"
|
||||
|
||||
CPlaylistDiscoveryService::CPlaylistDiscoveryService()
|
||||
: m_threadActive(false)
|
||||
, m_commandQueue(5)
|
||||
, m_resultQueue(5)
|
||||
, m_runId(0)
|
||||
, m_charEncoding(CPsfTags::CE_WINDOWS_1252)
|
||||
{
|
||||
m_threadActive = true;
|
||||
m_thread = std::thread([&] () { ThreadProc(); });
|
||||
}
|
||||
|
||||
CPlaylistDiscoveryService::~CPlaylistDiscoveryService()
|
||||
{
|
||||
m_threadActive = false;
|
||||
m_thread.join();
|
||||
}
|
||||
|
||||
void CPlaylistDiscoveryService::AddItemInRun(const boost::filesystem::path& filePath, const boost::filesystem::path& archivePath, unsigned int itemId)
|
||||
{
|
||||
COMMAND command;
|
||||
command.runId = m_runId;
|
||||
command.itemId = itemId;
|
||||
command.filePath = filePath;
|
||||
command.archivePath = archivePath;
|
||||
m_pendingCommands.push_back(command);
|
||||
}
|
||||
|
||||
void CPlaylistDiscoveryService::ResetRun()
|
||||
{
|
||||
m_pendingCommands.clear();
|
||||
m_runId++;
|
||||
}
|
||||
|
||||
void CPlaylistDiscoveryService::ProcessPendingItems(CPlaylist& playlist)
|
||||
{
|
||||
while(m_pendingCommands.size() != 0)
|
||||
{
|
||||
const auto& command(*m_pendingCommands.begin());
|
||||
if(m_commandQueue.TryPush(command))
|
||||
{
|
||||
m_pendingCommands.pop_front();
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
RESULT result;
|
||||
if(m_resultQueue.TryPop(result))
|
||||
{
|
||||
if(result.runId == m_runId)
|
||||
{
|
||||
int itemIdx = playlist.FindItem(result.itemId);
|
||||
if(itemIdx != -1)
|
||||
{
|
||||
CPlaylist::ITEM item = playlist.GetItem(itemIdx);
|
||||
item.title = result.title;
|
||||
item.length = result.length;
|
||||
playlist.UpdateItem(itemIdx, item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CPlaylistDiscoveryService::ThreadProc()
|
||||
{
|
||||
ResultQueue pendingResults;
|
||||
|
||||
while(m_threadActive)
|
||||
{
|
||||
COMMAND command;
|
||||
if(m_commandQueue.TryPop(command))
|
||||
{
|
||||
try
|
||||
{
|
||||
auto streamProvider = CreatePsfStreamProvider(command.archivePath);
|
||||
std::unique_ptr<Framework::CStream> inputStream(streamProvider->GetStreamForPath(command.filePath));
|
||||
CPsfBase psfFile(*inputStream);
|
||||
CPsfTags tags(CPsfTags::TagMap(psfFile.GetTagsBegin(), psfFile.GetTagsEnd()));
|
||||
tags.SetDefaultCharEncoding(m_charEncoding);
|
||||
|
||||
RESULT result;
|
||||
result.runId = command.runId;
|
||||
result.itemId = command.itemId;
|
||||
result.length = 0;
|
||||
|
||||
if(tags.HasTag("title"))
|
||||
{
|
||||
result.title = tags.GetTagValue("title");
|
||||
}
|
||||
else
|
||||
{
|
||||
result.title = command.filePath.leaf().wstring();
|
||||
}
|
||||
|
||||
if(tags.HasTag("length"))
|
||||
{
|
||||
result.length = tags.ConvertTimeString(tags.GetTagValue("length").c_str());
|
||||
}
|
||||
|
||||
pendingResults.push_back(result);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
//assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
while(pendingResults.size() != 0)
|
||||
{
|
||||
const auto& command(*pendingResults.begin());
|
||||
if(m_resultQueue.TryPush(command))
|
||||
{
|
||||
pendingResults.pop_front();
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
}
|
||||
}
|
49
tools/PsfPlayer/Source/PlaylistDiscoveryService.h
Normal file
49
tools/PsfPlayer/Source/PlaylistDiscoveryService.h
Normal file
@ -0,0 +1,49 @@
|
||||
#pragma once
|
||||
|
||||
#include <thread>
|
||||
#include <deque>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include "LockFreeQueue.h"
|
||||
#include "Playlist.h"
|
||||
#include "PsfTags.h"
|
||||
|
||||
class CPlaylistDiscoveryService
|
||||
{
|
||||
public:
|
||||
CPlaylistDiscoveryService();
|
||||
virtual ~CPlaylistDiscoveryService();
|
||||
|
||||
void AddItemInRun(const boost::filesystem::path& filePath, const boost::filesystem::path& archivePath, unsigned int itemId);
|
||||
void ResetRun();
|
||||
void ProcessPendingItems(CPlaylist&);
|
||||
|
||||
private:
|
||||
struct COMMAND
|
||||
{
|
||||
boost::filesystem::path filePath;
|
||||
boost::filesystem::path archivePath;
|
||||
unsigned int runId;
|
||||
unsigned int itemId;
|
||||
};
|
||||
|
||||
struct RESULT
|
||||
{
|
||||
unsigned int runId;
|
||||
unsigned int itemId;
|
||||
std::wstring title;
|
||||
double length;
|
||||
};
|
||||
|
||||
typedef std::deque<COMMAND> CommandQueue;
|
||||
typedef std::deque<RESULT> ResultQueue;
|
||||
|
||||
void ThreadProc();
|
||||
|
||||
std::thread m_thread;
|
||||
bool m_threadActive;
|
||||
CLockFreeQueue<COMMAND> m_commandQueue;
|
||||
CLockFreeQueue<RESULT> m_resultQueue;
|
||||
CommandQueue m_pendingCommands;
|
||||
uint32 m_runId;
|
||||
CPsfTags::CHAR_ENCODING m_charEncoding;
|
||||
};
|
@ -65,6 +65,7 @@ std::string CPsfTags::GetRawTagValue(const char* tagName) const
|
||||
|
||||
std::wstring CPsfTags::GetTagValue(const char* tagName) const
|
||||
{
|
||||
assert(m_stringConverter);
|
||||
return m_stringConverter(GetRawTagValue(tagName));
|
||||
}
|
||||
|
||||
|
@ -9,7 +9,7 @@ static StringType TimeToString(double time)
|
||||
separator += ':';
|
||||
unsigned int secs = static_cast<unsigned int>(time) % 60;
|
||||
unsigned int mins = static_cast<unsigned int>(time) / 60;
|
||||
std::basic_stringstream<StringType::value_type> result;
|
||||
std::basic_stringstream<typename StringType::value_type> result;
|
||||
result << mins << separator;
|
||||
result.width(2);
|
||||
result.fill('0');
|
@ -18,6 +18,7 @@ enum REPEAT_MODE
|
||||
uint64 m_frames;
|
||||
bool m_playing;
|
||||
|
||||
PlaylistViewController* m_playlistViewController;
|
||||
FileInfoViewController* m_fileInfoViewController;
|
||||
|
||||
CPlaylist* m_playlist;
|
||||
|
@ -6,21 +6,13 @@
|
||||
#import "string_cast.h"
|
||||
#import <AVFoundation/AVAudioSession.h>
|
||||
#import <MediaPlayer/MediaPlayer.h>
|
||||
#import "NSStringUtils.h"
|
||||
|
||||
#define PLAY_STRING @"Play"
|
||||
#define PAUSE_STRING @"Pause"
|
||||
|
||||
@implementation MainTabBarController
|
||||
|
||||
NSString* stringWithWchar(const std::wstring& input)
|
||||
{
|
||||
NSString* result = [[NSString alloc] initWithBytes: input.data()
|
||||
length: input.length() * sizeof(wchar_t)
|
||||
encoding: NSUTF32LittleEndianStringEncoding];
|
||||
[result autorelease];
|
||||
return result;
|
||||
}
|
||||
|
||||
-(void)onAudioSessionInterruption: (NSNotification*)notification
|
||||
{
|
||||
NSNumber* interruptionType = [notification.userInfo valueForKey: AVAudioSessionInterruptionTypeKey];
|
||||
@ -104,8 +96,8 @@ NSString* stringWithWchar(const std::wstring& input)
|
||||
m_virtualMachine->Pause();
|
||||
m_virtualMachine->Reset();
|
||||
|
||||
PlaylistViewController* playlistViewController = (PlaylistViewController*)self.viewControllers[0];
|
||||
playlistViewController.delegate = self;
|
||||
m_playlistViewController = (PlaylistViewController*)self.viewControllers[0];
|
||||
m_playlistViewController.delegate = self;
|
||||
|
||||
m_fileInfoViewController = (FileInfoViewController*)self.viewControllers[1];
|
||||
m_fileInfoViewController.delegate = self;
|
||||
@ -285,6 +277,7 @@ NSString* stringWithWchar(const std::wstring& input)
|
||||
|
||||
m_ready = true;
|
||||
m_currentPlaylistItem = itemIndex;
|
||||
[m_playlistViewController setPlayingItemIndex: itemIndex];
|
||||
[self onPlayButtonPress];
|
||||
}
|
||||
catch(const std::exception& exception)
|
||||
|
7
tools/PsfPlayer/Source/ios_ui/NSStringUtils.h
Normal file
7
tools/PsfPlayer/Source/ios_ui/NSStringUtils.h
Normal file
@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <string>
|
||||
|
||||
NSString* stringWithWchar(const std::wstring& input);
|
||||
|
10
tools/PsfPlayer/Source/ios_ui/NSStringUtils.mm
Normal file
10
tools/PsfPlayer/Source/ios_ui/NSStringUtils.mm
Normal file
@ -0,0 +1,10 @@
|
||||
#import "NSStringUtils.h"
|
||||
|
||||
NSString* stringWithWchar(const std::wstring& input)
|
||||
{
|
||||
NSString* result = [[NSString alloc] initWithBytes: input.data()
|
||||
length: input.length() * sizeof(wchar_t)
|
||||
encoding: NSUTF32LittleEndianStringEncoding];
|
||||
[result autorelease];
|
||||
return result;
|
||||
}
|
BIN
tools/PsfPlayer/Source/ios_ui/PlaylistBarIcon.png
Normal file
BIN
tools/PsfPlayer/Source/ios_ui/PlaylistBarIcon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 294 B |
BIN
tools/PsfPlayer/Source/ios_ui/PlaylistBarIcon@2x.png
Normal file
BIN
tools/PsfPlayer/Source/ios_ui/PlaylistBarIcon@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 699 B |
@ -1,5 +1,6 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "Playlist.h"
|
||||
#import "PlaylistDiscoveryService.h"
|
||||
#import "PlaylistSelectViewController.h"
|
||||
|
||||
@protocol PlaylistViewControllerDelegate
|
||||
@ -11,12 +12,15 @@
|
||||
|
||||
@interface PlaylistViewController : UIViewController<PlaylistSelectViewControllerDelegate>
|
||||
{
|
||||
CPlaylist* m_playlist;
|
||||
IBOutlet UITableView* m_tableView;
|
||||
CPlaylist* m_playlist;
|
||||
CPlaylistDiscoveryService* m_playlistDiscoveryService;
|
||||
IBOutlet UITableView* m_tableView;
|
||||
unsigned int m_playingItemIndex;
|
||||
}
|
||||
|
||||
@property (nonatomic, assign) IBOutlet id<PlaylistViewControllerDelegate> delegate;
|
||||
|
||||
-(IBAction)onOpenPlaylist: (id)sender;
|
||||
-(void)setPlayingItemIndex: (unsigned int)playingItemIndex;
|
||||
|
||||
@end
|
||||
|
@ -3,6 +3,7 @@
|
||||
#import <boost/filesystem.hpp>
|
||||
#import "string_cast.h"
|
||||
#import "PsfLoader.h"
|
||||
#import "TimeToString.h"
|
||||
|
||||
@implementation PlaylistViewController
|
||||
|
||||
@ -11,6 +12,9 @@
|
||||
-(void)viewDidLoad
|
||||
{
|
||||
m_playlist = nullptr;
|
||||
m_playlistDiscoveryService = new CPlaylistDiscoveryService();
|
||||
m_playingItemIndex = -1;
|
||||
[NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(onUpdateDiscoveryItems) userInfo: nil repeats: YES];
|
||||
[super viewDidLoad];
|
||||
}
|
||||
|
||||
@ -25,6 +29,7 @@
|
||||
{
|
||||
delete m_playlist;
|
||||
m_playlist = new CPlaylist();
|
||||
m_playlistDiscoveryService->ResetRun();
|
||||
|
||||
{
|
||||
auto path = boost::filesystem::path([selectedPlaylistPath fileSystemRepresentation]);
|
||||
@ -42,7 +47,9 @@
|
||||
newItem.title = string_cast<std::wstring>(newItem.path);
|
||||
newItem.length = 0;
|
||||
newItem.archiveId = archiveId;
|
||||
m_playlist->InsertItem(newItem);
|
||||
unsigned int itemId = m_playlist->InsertItem(newItem);
|
||||
|
||||
m_playlistDiscoveryService->AddItemInRun(filePath, path, itemId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -56,7 +63,33 @@
|
||||
}
|
||||
}
|
||||
|
||||
-(NSInteger)numberOfSectionsInTableView: (UITableView *)tableView
|
||||
-(void)setPlayingItemIndex: (unsigned int)playingItemIndex
|
||||
{
|
||||
m_playingItemIndex = playingItemIndex;
|
||||
[m_tableView reloadData];
|
||||
}
|
||||
|
||||
-(void)onUpdateDiscoveryItems
|
||||
{
|
||||
if(m_playlist)
|
||||
{
|
||||
bool hasUpdate = false;
|
||||
auto onItemUpdateConnection = m_playlist->OnItemUpdate.connect(
|
||||
[&hasUpdate](unsigned int itemId, const CPlaylist::ITEM& item)
|
||||
{
|
||||
hasUpdate = true;
|
||||
});
|
||||
m_playlistDiscoveryService->ProcessPendingItems(*m_playlist);
|
||||
onItemUpdateConnection.disconnect();
|
||||
//NSLog(@"Updating %d", hasUpdate);
|
||||
if(hasUpdate)
|
||||
{
|
||||
[m_tableView reloadData];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-(NSInteger)numberOfSectionsInTableView: (UITableView *)tableView
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
@ -81,14 +114,24 @@
|
||||
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
|
||||
if (cell == nil)
|
||||
{
|
||||
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
|
||||
cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: CellIdentifier] autorelease];
|
||||
}
|
||||
|
||||
if(m_playlist != NULL)
|
||||
{
|
||||
const CPlaylist::ITEM& item(m_playlist->GetItem(indexPath.row));
|
||||
std::string convString = Framework::Utf8::ConvertTo(item.title);
|
||||
cell.textLabel.text = [NSString stringWithUTF8String: convString.c_str()];
|
||||
std::string titleString = Framework::Utf8::ConvertTo(item.title);
|
||||
std::string lengthString = TimeToString<std::string>(item.length);
|
||||
cell.textLabel.text = [NSString stringWithUTF8String: titleString.c_str()];
|
||||
if(m_playingItemIndex == indexPath.row)
|
||||
{
|
||||
[cell.textLabel setFont: [UIFont boldSystemFontOfSize: 16]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[cell.textLabel setFont: [UIFont systemFontOfSize: 16]];
|
||||
}
|
||||
cell.detailTextLabel.text = [NSString stringWithUTF8String: lengthString.c_str()];
|
||||
}
|
||||
|
||||
return cell;
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4488.2" systemVersion="12E55" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="2lX-p5-oXO">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F45" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="2lX-p5-oXO">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3715.3"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Playlist View Controller - Playlist-->
|
||||
@ -29,7 +29,7 @@
|
||||
</navigationItem>
|
||||
</items>
|
||||
</navigationBar>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="c5g-s0-gFt">
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="c5g-s0-gFt">
|
||||
<rect key="frame" x="0.0" y="64" width="320" height="454"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
@ -41,7 +41,7 @@
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<tabBarItem key="tabBarItem" title="Playlist" id="jbq-Jw-8Cs"/>
|
||||
<tabBarItem key="tabBarItem" title="Playlist" image="PlaylistBarIcon.png" id="jbq-Jw-8Cs"/>
|
||||
<connections>
|
||||
<outlet property="m_tableView" destination="c5g-s0-gFt" id="uk9-R5-wmx"/>
|
||||
</connections>
|
||||
@ -62,7 +62,7 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="dPb-OQ-fnl">
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="dPb-OQ-fnl">
|
||||
<rect key="frame" x="-1" y="64" width="320" height="504"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
@ -125,7 +125,7 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="awv-Vz-Sjp">
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="awv-Vz-Sjp">
|
||||
<rect key="frame" x="0.0" y="64" width="320" height="358"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
@ -161,7 +161,6 @@
|
||||
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="DsI-5z-9ZN">
|
||||
<rect key="frame" x="137" y="59" width="46" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="15"/>
|
||||
<state key="normal" title="Pause">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
@ -172,7 +171,6 @@
|
||||
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tES-Xf-SP7">
|
||||
<rect key="frame" x="20" y="59" width="46" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="15"/>
|
||||
<state key="normal" title="Prev">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
@ -183,7 +181,6 @@
|
||||
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="1lX-iH-uZ1">
|
||||
<rect key="frame" x="254" y="59" width="46" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="15"/>
|
||||
<state key="normal" title="Next">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
@ -197,7 +194,7 @@
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<tabBarItem key="tabBarItem" title="Track Info" id="NxE-GN-Cp7"/>
|
||||
<tabBarItem key="tabBarItem" title="Track Info" image="TrackInfoBarIcon.png" id="NxE-GN-Cp7"/>
|
||||
<connections>
|
||||
<outlet property="m_playButton" destination="DsI-5z-9ZN" id="r2t-2e-pkl"/>
|
||||
<outlet property="m_tagsTable" destination="awv-Vz-Sjp" id="5Uo-3u-zb6"/>
|
||||
@ -210,6 +207,10 @@
|
||||
<point key="canvasLocation" x="398" y="982"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="PlaylistBarIcon.png" width="32" height="22"/>
|
||||
<image name="TrackInfoBarIcon.png" width="32" height="22"/>
|
||||
</resources>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
|
BIN
tools/PsfPlayer/Source/ios_ui/TrackInfoBarIcon.png
Normal file
BIN
tools/PsfPlayer/Source/ios_ui/TrackInfoBarIcon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 990 B |
BIN
tools/PsfPlayer/Source/ios_ui/TrackInfoBarIcon@2x.png
Normal file
BIN
tools/PsfPlayer/Source/ios_ui/TrackInfoBarIcon@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
@ -37,7 +37,13 @@
|
||||
708FE7E417C0B8BE00BFCDB2 /* PlaylistViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 708FE7DA17C0B8BE00BFCDB2 /* PlaylistViewController.mm */; };
|
||||
708FE7E517C0B8BE00BFCDB2 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 708FE7DD17C0B8BE00BFCDB2 /* AppDelegate.mm */; };
|
||||
70934F0B17D2ECB8000D9831 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70934F0A17D2ECB8000D9831 /* MediaPlayer.framework */; };
|
||||
70BA8D2E180C724900A73E9E /* PlaylistBarIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 70BA8D2C180C724900A73E9E /* PlaylistBarIcon.png */; };
|
||||
70BA8D2F180C724900A73E9E /* PlaylistBarIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 70BA8D2D180C724900A73E9E /* PlaylistBarIcon@2x.png */; };
|
||||
70BA8D35180C733500A73E9E /* TrackInfoBarIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 70BA8D33180C733500A73E9E /* TrackInfoBarIcon.png */; };
|
||||
70BA8D36180C733500A73E9E /* TrackInfoBarIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 70BA8D34180C733500A73E9E /* TrackInfoBarIcon@2x.png */; };
|
||||
70C37E6E17C769DD00D18224 /* MainTabBarController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 70C37E6D17C769DD00D18224 /* MainTabBarController.mm */; };
|
||||
70D2317D1809EAC80008351C /* PlaylistDiscoveryService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 70D2317B1809EAC80008351C /* PlaylistDiscoveryService.cpp */; };
|
||||
70D23185180BBADF0008351C /* NSStringUtils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 70D23183180BBADF0008351C /* NSStringUtils.mm */; };
|
||||
7E1A77140F8993CE0082129E /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E1A77130F8993CE0082129E /* OpenAL.framework */; };
|
||||
7E27214A1213B38D00C0DEBF /* MipsJitter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E2721481213B38D00C0DEBF /* MipsJitter.cpp */; };
|
||||
7E2721CC1213B6D300C0DEBF /* PsxBios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E2721CA1213B6D300C0DEBF /* PsxBios.cpp */; };
|
||||
@ -202,8 +208,18 @@
|
||||
708FE7DC17C0B8BE00BFCDB2 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ../Source/ios_ui/AppDelegate.h; sourceTree = "<group>"; };
|
||||
708FE7DD17C0B8BE00BFCDB2 /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = ../Source/ios_ui/AppDelegate.mm; sourceTree = "<group>"; };
|
||||
70934F0A17D2ECB8000D9831 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };
|
||||
70BA8D2C180C724900A73E9E /* PlaylistBarIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PlaylistBarIcon.png; path = ../Source/ios_ui/PlaylistBarIcon.png; sourceTree = "<group>"; };
|
||||
70BA8D2D180C724900A73E9E /* PlaylistBarIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "PlaylistBarIcon@2x.png"; path = "../Source/ios_ui/PlaylistBarIcon@2x.png"; sourceTree = "<group>"; };
|
||||
70BA8D33180C733500A73E9E /* TrackInfoBarIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TrackInfoBarIcon.png; path = ../Source/ios_ui/TrackInfoBarIcon.png; sourceTree = "<group>"; };
|
||||
70BA8D34180C733500A73E9E /* TrackInfoBarIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "TrackInfoBarIcon@2x.png"; path = "../Source/ios_ui/TrackInfoBarIcon@2x.png"; sourceTree = "<group>"; };
|
||||
70C37E6C17C7698000D18224 /* MainTabBarController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainTabBarController.h; path = ../Source/ios_ui/MainTabBarController.h; sourceTree = "<group>"; };
|
||||
70C37E6D17C769DD00D18224 /* MainTabBarController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MainTabBarController.mm; path = ../Source/ios_ui/MainTabBarController.mm; sourceTree = "<group>"; };
|
||||
70D2317B1809EAC80008351C /* PlaylistDiscoveryService.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PlaylistDiscoveryService.cpp; path = ../Source/PlaylistDiscoveryService.cpp; sourceTree = "<group>"; };
|
||||
70D2317C1809EAC80008351C /* PlaylistDiscoveryService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaylistDiscoveryService.h; path = ../Source/PlaylistDiscoveryService.h; sourceTree = "<group>"; };
|
||||
70D231811809EC2F0008351C /* LockFreeQueue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LockFreeQueue.h; path = ../Source/LockFreeQueue.h; sourceTree = "<group>"; };
|
||||
70D23182180A70E50008351C /* TimeToString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TimeToString.h; path = ../Source/TimeToString.h; sourceTree = "<group>"; };
|
||||
70D23183180BBADF0008351C /* NSStringUtils.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = NSStringUtils.mm; path = ../Source/ios_ui/NSStringUtils.mm; sourceTree = "<group>"; };
|
||||
70D23184180BBADF0008351C /* NSStringUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSStringUtils.h; path = ../Source/ios_ui/NSStringUtils.h; sourceTree = "<group>"; };
|
||||
7E1A77130F8993CE0082129E /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = /System/Library/Frameworks/OpenAL.framework; sourceTree = "<absolute>"; };
|
||||
7E2721481213B38D00C0DEBF /* MipsJitter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MipsJitter.cpp; path = ../../../Source/MipsJitter.cpp; sourceTree = SOURCE_ROOT; };
|
||||
7E2721491213B38D00C0DEBF /* MipsJitter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MipsJitter.h; path = ../../../Source/MipsJitter.h; sourceTree = SOURCE_ROOT; };
|
||||
@ -409,20 +425,22 @@
|
||||
29B97317FDCFA39411CA2CEA /* iOS UI */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
708FE7D217C0B8BE00BFCDB2 /* FileInfoViewController.mm */,
|
||||
708FE7DC17C0B8BE00BFCDB2 /* AppDelegate.h */,
|
||||
708FE7DD17C0B8BE00BFCDB2 /* AppDelegate.mm */,
|
||||
708FE7D117C0B8BE00BFCDB2 /* FileInfoViewController.h */,
|
||||
708FE7D217C0B8BE00BFCDB2 /* FileInfoViewController.mm */,
|
||||
701B479B17C71B7D00330B83 /* images */,
|
||||
708FE7D417C0B8BE00BFCDB2 /* Info.plist */,
|
||||
708FE7D517C0B8BE00BFCDB2 /* main.mm */,
|
||||
70C37E6D17C769DD00D18224 /* MainTabBarController.mm */,
|
||||
70C37E6C17C7698000D18224 /* MainTabBarController.h */,
|
||||
708FE7D817C0B8BE00BFCDB2 /* PlaylistSelectViewController.m */,
|
||||
70C37E6D17C769DD00D18224 /* MainTabBarController.mm */,
|
||||
70D23183180BBADF0008351C /* NSStringUtils.mm */,
|
||||
70D23184180BBADF0008351C /* NSStringUtils.h */,
|
||||
708FE7D717C0B8BE00BFCDB2 /* PlaylistSelectViewController.h */,
|
||||
708FE7DA17C0B8BE00BFCDB2 /* PlaylistViewController.mm */,
|
||||
708FE7D817C0B8BE00BFCDB2 /* PlaylistSelectViewController.m */,
|
||||
708FE7D917C0B8BE00BFCDB2 /* PlaylistViewController.h */,
|
||||
708FE7DA17C0B8BE00BFCDB2 /* PlaylistViewController.mm */,
|
||||
708FE7DB17C0B8BE00BFCDB2 /* PsfPlayer_Prefix.pch */,
|
||||
708FE7DD17C0B8BE00BFCDB2 /* AppDelegate.mm */,
|
||||
708FE7DC17C0B8BE00BFCDB2 /* AppDelegate.h */,
|
||||
7016682917C72969003504E0 /* Storyboard.storyboard */,
|
||||
);
|
||||
name = "iOS UI";
|
||||
@ -448,9 +466,13 @@
|
||||
701B479B17C71B7D00330B83 /* images */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
701B479C17C71BDA00330B83 /* Launch.png */,
|
||||
701B479A17C71B7700330B83 /* Launch-4inch.png */,
|
||||
708FE7D317C0B8BE00BFCDB2 /* Icon.png */,
|
||||
701B479A17C71B7700330B83 /* Launch-4inch.png */,
|
||||
701B479C17C71BDA00330B83 /* Launch.png */,
|
||||
70BA8D2C180C724900A73E9E /* PlaylistBarIcon.png */,
|
||||
70BA8D2D180C724900A73E9E /* PlaylistBarIcon@2x.png */,
|
||||
70BA8D33180C733500A73E9E /* TrackInfoBarIcon.png */,
|
||||
70BA8D34180C733500A73E9E /* TrackInfoBarIcon@2x.png */,
|
||||
);
|
||||
name = images;
|
||||
sourceTree = "<group>";
|
||||
@ -557,9 +579,12 @@
|
||||
708FE79A17C0B66700BFCDB2 /* Debuggable.h */,
|
||||
708FE79B17C0B66700BFCDB2 /* Iop_PsfSubSystem.cpp */,
|
||||
708FE79C17C0B66700BFCDB2 /* Iop_PsfSubSystem.h */,
|
||||
70D231811809EC2F0008351C /* LockFreeQueue.h */,
|
||||
708FE79D17C0B66700BFCDB2 /* path_uncomplete.h */,
|
||||
708FE79E17C0B66700BFCDB2 /* Playlist.cpp */,
|
||||
708FE79F17C0B66700BFCDB2 /* Playlist.h */,
|
||||
70D2317B1809EAC80008351C /* PlaylistDiscoveryService.cpp */,
|
||||
70D2317C1809EAC80008351C /* PlaylistDiscoveryService.h */,
|
||||
7E2721CD1213B6D700C0DEBF /* ps2 */,
|
||||
708FE7A017C0B66700BFCDB2 /* PsfArchive.cpp */,
|
||||
708FE7A117C0B66700BFCDB2 /* PsfArchive.h */,
|
||||
@ -583,6 +608,7 @@
|
||||
708FE7B317C0B66700BFCDB2 /* SH_OpenAL.cpp */,
|
||||
708FE7B417C0B66700BFCDB2 /* SH_OpenAL.h */,
|
||||
708FE7B517C0B66700BFCDB2 /* SoundHandler.h */,
|
||||
70D23182180A70E50008351C /* TimeToString.h */,
|
||||
);
|
||||
name = "PsfPlayer Core";
|
||||
sourceTree = "<group>";
|
||||
@ -813,7 +839,11 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
708FE7DF17C0B8BE00BFCDB2 /* Icon.png in Resources */,
|
||||
70BA8D2E180C724900A73E9E /* PlaylistBarIcon.png in Resources */,
|
||||
7016687117C7307E003504E0 /* Storyboard.storyboard in Resources */,
|
||||
70BA8D35180C733500A73E9E /* TrackInfoBarIcon.png in Resources */,
|
||||
70BA8D2F180C724900A73E9E /* PlaylistBarIcon@2x.png in Resources */,
|
||||
70BA8D36180C733500A73E9E /* TrackInfoBarIcon@2x.png in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -828,6 +858,7 @@
|
||||
7E4B3CC20F9E994E00675ED7 /* ELF.cpp in Sources */,
|
||||
7E4B3CC30F9E994E00675ED7 /* ElfFile.cpp in Sources */,
|
||||
7E4B3CEF0F9E99A500675ED7 /* Log.cpp in Sources */,
|
||||
70D2317D1809EAC80008351C /* PlaylistDiscoveryService.cpp in Sources */,
|
||||
7E4B3CF00F9E99A500675ED7 /* MA_MIPSIV.cpp in Sources */,
|
||||
708FE7C017C0B82400BFCDB2 /* PsfVm.cpp in Sources */,
|
||||
708FE7BC17C0B82400BFCDB2 /* PsfLoader.cpp in Sources */,
|
||||
@ -843,6 +874,7 @@
|
||||
7E4B3CF80F9E99A500675ED7 /* MIPSAnalysis.cpp in Sources */,
|
||||
7E4B3CF90F9E99A500675ED7 /* MIPSArchitecture.cpp in Sources */,
|
||||
7E4B3CFA0F9E99A500675ED7 /* MIPSAssembler.cpp in Sources */,
|
||||
70D23185180BBADF0008351C /* NSStringUtils.mm in Sources */,
|
||||
7E4B3CFB0F9E99A500675ED7 /* MipsAssemblerDefinitions.cpp in Sources */,
|
||||
7E4B3CFD0F9E99A500675ED7 /* MIPSCoprocessor.cpp in Sources */,
|
||||
708FE7E517C0B8BE00BFCDB2 /* AppDelegate.mm in Sources */,
|
||||
|
Loading…
x
Reference in New Issue
Block a user