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:
jpd002 2013-10-15 02:37:50 +00:00
parent 336d4f7343
commit 544fc681e0
18 changed files with 319 additions and 52 deletions

View File

@ -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

View File

@ -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

View 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));
}
}

View 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;
};

View File

@ -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));
}

View File

@ -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');

View File

@ -18,6 +18,7 @@ enum REPEAT_MODE
uint64 m_frames;
bool m_playing;
PlaylistViewController* m_playlistViewController;
FileInfoViewController* m_fileInfoViewController;
CPlaylist* m_playlist;

View File

@ -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)

View File

@ -0,0 +1,7 @@
#pragma once
#import <UIKit/UIKit.h>
#import <string>
NSString* stringWithWchar(const std::wstring& input);

View 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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

View File

@ -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

View File

@ -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;

View File

@ -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"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 990 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -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 */,