summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2013-09-16 20:31:07 +0000
committerSND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2013-09-16 20:31:07 +0000
commita5a97b02c0205f0cc98327389ec88672ddd769f2 (patch)
treee1b7254679180d8e9413c3b10fb8b2e3c91691aa
parent481101a05a77e2cc5b22cc94a5319748aeb5c031 (diff)
downloadpcsxr-a5a97b02c0205f0cc98327389ec88672ddd769f2.tar.gz
Wait for a new physical CD to be inserted when ejecting the CD on OS X.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@87220 e17a0e51-4ae3-4d35-97c3-1a29b211df97
-rw-r--r--macosx/English.lproj/PCSXR.xib30
-rw-r--r--macosx/Pcsxr.xcodeproj/project.pbxproj4
-rwxr-xr-xmacosx/PcsxrController.m75
-rwxr-xr-xmacosx/plugins/DFCdrom/macsrc/PluginConfigController.m28
-rwxr-xr-xmacosx/plugins/DFCdrom/macsrc/cdr-macosx.c76
-rwxr-xr-xmacosx/plugins/DFCdrom/macsrc/cfg.c4
6 files changed, 119 insertions, 98 deletions
diff --git a/macosx/English.lproj/PCSXR.xib b/macosx/English.lproj/PCSXR.xib
index a0217067..99f831d6 100644
--- a/macosx/English.lproj/PCSXR.xib
+++ b/macosx/English.lproj/PCSXR.xib
@@ -2,7 +2,7 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1070</int>
- <string key="IBDocument.SystemVersion">12E55</string>
+ <string key="IBDocument.SystemVersion">12F37</string>
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
<string key="IBDocument.AppKitVersion">1187.39</string>
<string key="IBDocument.HIToolboxVersion">626.00</string>
@@ -985,18 +985,6 @@
<object class="NSCustomObject" id="113826207">
<string key="NSClassName">PcsxrController</string>
</object>
- <object class="NSMenuItem" id="126713148">
- <string key="NSTitle">Menu</string>
- <string key="NSKeyEquiv"/>
- <int key="NSMnemonicLoc">2147483647</int>
- <reference key="NSOnImage" ref="926047672"/>
- <reference key="NSMixedImage" ref="645484985"/>
- <string key="NSAction">submenuAction:</string>
- <object class="NSMenu" key="NSSubmenu" id="37407557">
- <string key="NSTitle">Menu</string>
- <array class="NSMutableArray" key="NSMenuItems"/>
- </object>
- </object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords">
@@ -1920,20 +1908,6 @@
<reference key="parent" ref="689397059"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">369</int>
- <reference key="object" ref="126713148"/>
- <array class="NSMutableArray" key="children">
- <reference ref="37407557"/>
- </array>
- <reference key="parent" ref="0"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">370</int>
- <reference key="object" ref="37407557"/>
- <array class="NSMutableArray" key="children"/>
- <reference key="parent" ref="126713148"/>
- </object>
- <object class="IBObjectRecord">
<int key="objectID">371</int>
<reference key="object" ref="392373865"/>
<reference key="parent" ref="164090988"/>
@@ -2334,8 +2308,6 @@
<string key="330.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="366.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="367.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="369.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string key="370.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="385.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="386.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
diff --git a/macosx/Pcsxr.xcodeproj/project.pbxproj b/macosx/Pcsxr.xcodeproj/project.pbxproj
index 3bfe47c8..38954a39 100644
--- a/macosx/Pcsxr.xcodeproj/project.pbxproj
+++ b/macosx/Pcsxr.xcodeproj/project.pbxproj
@@ -206,6 +206,7 @@
55BBA69914953887003B2CEC /* PcsxrDiscHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 55BBA69814953887003B2CEC /* PcsxrDiscHandler.m */; };
55BBA69C1495839A003B2CEC /* PcsxrFreezeStateHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 55BBA69B1495839A003B2CEC /* PcsxrFreezeStateHandler.m */; };
55C7A214148B2B3800C22ABC /* PcsxrMemCardDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55C7A216148B2B3800C22ABC /* PcsxrMemCardDocument.xib */; };
+ 55CA586B17E799E6007424D5 /* DiskArbitration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55CA586A17E799E6007424D5 /* DiskArbitration.framework */; };
55E0ACE0178B69620005C945 /* LaunchArg.m in Sources */ = {isa = PBXBuildFile; fileRef = 55E0ACDF178B69600005C945 /* LaunchArg.m */; };
55EC05FB1788B1230053AC23 /* PcsxrMemCardArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 55EC05FA1788B1230053AC23 /* PcsxrMemCardArray.m */; };
55EC05FE178916E80053AC23 /* MemBadgeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 55EC05FD178916E70053AC23 /* MemBadgeView.m */; };
@@ -684,6 +685,7 @@
55BBA69A14958399003B2CEC /* PcsxrFreezeStateHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PcsxrFreezeStateHandler.h; sourceTree = "<group>"; };
55BBA69B1495839A003B2CEC /* PcsxrFreezeStateHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PcsxrFreezeStateHandler.m; sourceTree = "<group>"; usesTabs = 1; };
55C7A215148B2B3800C22ABC /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/PcsxrMemCardDocument.xib; sourceTree = "<group>"; };
+ 55CA586A17E799E6007424D5 /* DiskArbitration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiskArbitration.framework; path = System/Library/Frameworks/DiskArbitration.framework; sourceTree = SDKROOT; };
55E0ACDE178B695F0005C945 /* LaunchArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LaunchArg.h; sourceTree = "<group>"; };
55E0ACDF178B69600005C945 /* LaunchArg.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LaunchArg.m; sourceTree = "<group>"; usesTabs = 1; };
55EC05F91788B1230053AC23 /* PcsxrMemCardArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PcsxrMemCardArray.h; sourceTree = "<group>"; };
@@ -754,6 +756,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 55CA586B17E799E6007424D5 /* DiskArbitration.framework in Frameworks */,
551A76D9178696810052D185 /* libz.dylib in Frameworks */,
551A76D61786960C0052D185 /* Cocoa.framework in Frameworks */,
551A76D7178696110052D185 /* IOKit.framework in Frameworks */,
@@ -1008,6 +1011,7 @@
isa = PBXGroup;
children = (
554FD70817C6A13E0056CF66 /* SDL2.framework */,
+ 55CA586A17E799E6007424D5 /* DiskArbitration.framework */,
551A774217869BD40052D185 /* AudioUnit.framework */,
551A774317869BD50052D185 /* CoreAudio.framework */,
551A7723178699250052D185 /* OpenAL.framework */,
diff --git a/macosx/PcsxrController.m b/macosx/PcsxrController.m
index a2d6ba93..f517ba3d 100755
--- a/macosx/PcsxrController.m
+++ b/macosx/PcsxrController.m
@@ -9,6 +9,8 @@
#import "PcsxrFreezeStateHandler.h"
#import "PcsxrCheatHandler.h"
#import "LaunchArg.h"
+#include <DiskArbitration/DiskArbitration.h>
+#include <IOKit/storage/IOCDMedia.h>
#include "psxcommon.h"
#include "plugins.h"
#include "misc.h"
@@ -52,6 +54,7 @@ void ShowHelpAndExit(FILE* output, int exitCode)
@property (strong) NSMutableArray *skipFiles;
@property (strong) NSWindow *preferenceWindow;
@property (strong) NSWindow *cheatWindow;
+@property (nonatomic) DASessionRef diskSession;
@end
@implementation PcsxrController
@@ -91,13 +94,43 @@ void ShowHelpAndExit(FILE* output, int exitCode)
PSXflags.wasPausedBeforeBGSwitch = wasPausedBeforeBGSwitch;
}
-- (IBAction)ejectCD:(id)sender
+@synthesize diskSession = _diskSession;
+- (void)setDiskSession:(DASessionRef)diskSession
{
- NSMutableString *deviceName;
- NSTask *ejectTask;
- NSRange rdiskRange;
+ if (diskSession == _diskSession) {
+ return;
+ }
+ if (_diskSession) {
+ CFRelease(_diskSession);
+ }if (diskSession) {
+ _diskSession = diskSession;
+ CFRetain(diskSession);
+ }
+}
- BOOL wasPaused = [EmuThread pauseSafe];
+static BOOL wasPaused;
+static void PSXDiscAppearedCallback(DADiskRef disk, void *context)
+{
+ PcsxrController *theSelf = (__bridge PcsxrController*)context;
+
+ SetCdOpenCaseTime(time(NULL) + 2);
+ LidInterrupt();
+
+ /* and open new cd */
+ if ([EmuThread active])
+ CDR_open();
+
+ if (!wasPaused) {
+ [EmuThread resume];
+ }
+
+ DASessionUnscheduleFromRunLoop(theSelf.diskSession, CFRunLoopGetMain(), kCFRunLoopCommonModes);
+ theSelf.diskSession = NULL;
+}
+
+- (IBAction)ejectCD:(id)sender
+{
+ wasPaused = [EmuThread pauseSafe];
/* close connection to current cd */
if ([EmuThread active])
@@ -117,10 +150,20 @@ void ShowHelpAndExit(FILE* output, int exitCode)
SetCdOpenCaseTime(time(NULL) + 2);
LidInterrupt();
}
+
+ if ([EmuThread active])
+ CDR_open();
+
+ if (!wasPaused) {
+ [EmuThread resume];
+ }
} else {
- char *driveLetter = CDR_getDriveLetter();
+ NSMutableString *deviceName;
+ NSTask *ejectTask;
+ NSRange rdiskRange;
+ char *driveLetter = CDR_getDriveLetter();
- if (driveLetter != nil) {
+ if (driveLetter != NULL) {
deviceName = [NSMutableString stringWithString:[[NSFileManager defaultManager] stringWithFileSystemRepresentation:driveLetter length:strlen(driveLetter)]];
// delete the 'r' in 'rdisk'
@@ -133,14 +176,16 @@ void ShowHelpAndExit(FILE* output, int exitCode)
ejectTask = [NSTask launchedTaskWithLaunchPath:@"/usr/bin/hdiutil" arguments:@[@"eject", deviceName]];
[ejectTask waitUntilExit];
}
- }
-
- /* and open new cd */
- if ([EmuThread active])
- CDR_open();
-
- if (!wasPaused) {
- [EmuThread resume];
+ DASessionRef tmpSession = DASessionCreate(kCFAllocatorDefault);
+ CFDictionaryRef match = CFBridgingRetain(@{(NSString*)kDADiskDescriptionMediaKindKey : @(kIOCDMediaClass),
+ (NSString*)kDADiskDescriptionMediaWholeKey : @YES});
+ DARegisterDiskAppearedCallback(tmpSession, match, PSXDiscAppearedCallback, (__bridge void*)self);
+ CFRelease(match);
+
+ DASessionScheduleWithRunLoop(tmpSession, CFRunLoopGetMain(), kCFRunLoopCommonModes);
+
+ self.diskSession = tmpSession;
+ CFRelease(tmpSession);
}
}
diff --git a/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m
index df20efb2..6417a102 100755
--- a/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m
+++ b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m
@@ -91,11 +91,11 @@ void ReadConfig()
NSDictionary *keyValues;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:@{PrefsKey: @{@"Threaded": @YES,
- @"Cache Size": @64,
- @"Speed": @0}}];
-
+ @"Cache Size": @64,
+ @"Speed": @0}}];
+
keyValues = [defaults dictionaryForKey:PrefsKey];
-
+
ReadMode = ([keyValues[@"Threaded"] boolValue] ? THREADED : NORMAL);
CacheSize = [keyValues[@"Cache Size"] intValue];
CdrSpeed = [keyValues[@"Speed"] integerValue];
@@ -113,12 +113,12 @@ void ReadConfig()
- (IBAction)ok:(id)sender
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-
+
NSMutableDictionary *writeDic = [keyValues mutableCopy];
-
+
writeDic[@"Threaded"] = ([Cached intValue] ? @YES : @NO);
writeDic[@"Cache Size"] = @([CacheSize integerValue]);
-
+
switch ([CdSpeed indexOfSelectedItem]) {
case 1: writeDic[@"Speed"] = @1; break;
case 2: writeDic[@"Speed"] = @2; break;
@@ -128,11 +128,11 @@ void ReadConfig()
case 6: writeDic[@"Speed"] = @32; break;
default: writeDic[@"Speed"] = @0; break;
}
-
+
// write to defaults
[defaults setObject:writeDic forKey:PrefsKey];
[defaults synchronize];
-
+
// and set global values accordingly
ReadConfig();
@@ -143,15 +143,15 @@ void ReadConfig()
- (void)loadValues
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-
+
ReadConfig();
-
+
// load from preferences
- self.keyValues = [NSMutableDictionary dictionaryWithDictionary:[defaults dictionaryForKey:PrefsKey]];
-
+ self.keyValues = [[NSMutableDictionary alloc] initWithDictionary:[defaults dictionaryForKey:PrefsKey]];
+
[Cached setIntValue:[keyValues[@"Threaded"] intValue]];
[CacheSize setIntegerValue:[keyValues[@"Cache Size"] integerValue]];
-
+
switch ([keyValues[@"Speed"] intValue]) {
case 1: [CdSpeed selectItemAtIndex:1]; break;
case 2: [CdSpeed selectItemAtIndex:2]; break;
diff --git a/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c b/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c
index 94cf8996..7c423757 100755
--- a/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c
+++ b/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c
@@ -38,29 +38,29 @@ static int IsPsxDisc(const char *dev) {
int fd;
char buf[CD_FRAMESIZE_RAW];
dk_cd_read_t r;
-
+
fd = open(dev, O_RDONLY, 0);
if (fd < 0) return 0;
-
+
memset(&r, 0, sizeof(r));
-
+
r.offset = msf_to_lba(0, 2, 4) * CD_FRAMESIZE_RAW;
r.sectorArea = 0xF8;
r.sectorType = kCDSectorTypeUnknown;
r.bufferLength = CD_FRAMESIZE_RAW;
r.buffer = buf;
-
+
if (ioctl(fd, DKIOCCDREAD, &r) != kIOReturnSuccess) {
close(fd);
return 0;
}
-
+
close(fd);
-
+
if (strncmp(buf + 56, "Sony Computer Entertainment", 27) == 0) {
return 1;
}
-
+
return 0;
}
@@ -70,45 +70,45 @@ static void FindCdDevice(char *dev) {
io_iterator_t media_iterator;
CFMutableDictionaryRef classes_to_match;
const char *name, *cd = kIOCDMediaClass, *dvd = kIODVDMediaClass;
-
+
dev[0] = '\0';
name = cd;
-
+
start:
classes_to_match = IOServiceMatching(name);
if (classes_to_match == NULL) goto end;
-
+
CFDictionarySetValue(classes_to_match, CFSTR(kIOMediaEjectableKey),
- kCFBooleanTrue);
-
- kern_result = IOServiceGetMatchingServices(kIOMasterPortDefault,
- classes_to_match, &media_iterator);
-
+ kCFBooleanTrue);
+
+ kern_result = IOServiceGetMatchingServices(kIOMasterPortDefault,
+ classes_to_match, &media_iterator);
+
if (kern_result != KERN_SUCCESS) goto end;
-
+
next_media = IOIteratorNext(media_iterator);
if (next_media != 0) {
char psz_buf[0x32];
size_t dev_path_length;
CFTypeRef str_bsd_path;
-
+
do {
str_bsd_path = IORegistryEntryCreateCFProperty(next_media,
- CFSTR(kIOBSDNameKey), kCFAllocatorDefault, 0);
-
+ CFSTR(kIOBSDNameKey), kCFAllocatorDefault, 0);
+
if (str_bsd_path == NULL) {
IOObjectRelease(next_media);
continue;
}
-
+
strcpy(psz_buf, "/dev/r");
dev_path_length = strlen(psz_buf);
-
+
if (CFStringGetCString(str_bsd_path, (char *)&psz_buf + dev_path_length,
- sizeof(psz_buf) - dev_path_length, kCFStringEncodingASCII))
+ sizeof(psz_buf) - dev_path_length, kCFStringEncodingASCII))
{
strcpy(dev, psz_buf);
-
+
if (IsPsxDisc(dev)) {
CFRelease(str_bsd_path);
IOObjectRelease(next_media);
@@ -116,14 +116,14 @@ start:
return;
}
}
-
+
CFRelease(str_bsd_path);
IOObjectRelease(next_media);
} while ((next_media = IOIteratorNext(media_iterator)) != 0);
}
-
+
IOObjectRelease(media_iterator);
-
+
end:
if (dev[0] == '\0') {
if (name == cd) {
@@ -136,15 +136,15 @@ end:
int OpenCdHandle(const char *dev) {
if (dev != NULL && dev[0] != '\0') strcpy(cdDevice, dev);
else if (cdDevice[0] == '\0') FindCdDevice(cdDevice);
-
+
cdHandle = open(cdDevice, O_RDONLY, 0);
if (cdHandle < 0) return -1;
-
+
if (CdrSpeed > 0) {
u_int16_t speed = kCDSpeedMin * CdrSpeed;
ioctl(cdHandle, DKIOCCDSETSPEED, &speed);
}
-
+
return 0;
}
@@ -183,23 +183,23 @@ long ReadSector(crdata *cr) {
int lba;
dk_cd_read_t r;
char buf[CD_FRAMESIZE_RAW];
-
+
if (cdHandle < 0) return -1;
-
+
lba = msf_to_lba(cr->msf.cdmsf_min0, cr->msf.cdmsf_sec0, cr->msf.cdmsf_frame0);
-
+
memset(&r, 0, sizeof(r));
-
+
r.offset = lba * CD_FRAMESIZE_RAW;
r.sectorArea = 0xF8;
r.sectorType = kCDSectorTypeUnknown;
r.bufferLength = CD_FRAMESIZE_RAW;
r.buffer = buf; // ??? Why using cr->buf directly does not work in threaded mode?
-
+
if (ioctl(cdHandle, DKIOCCDREAD, &r) != kIOReturnSuccess) {
return -1;
}
-
+
memcpy(cr->buf, buf, CD_FRAMESIZE_RAW);
return 0;
}
@@ -215,7 +215,7 @@ long StopCDDA() {
long GetStatus(int playing, struct CdrStat *stat) {
memset(stat, 0, sizeof(struct CdrStat));
stat->Type = 0x01;
-
+
// Close and reopen the CD handle. If opening failed,
// then there is no CD in drive.
// Note that this WILL be screwed if user inserted another
@@ -225,7 +225,7 @@ long GetStatus(int playing, struct CdrStat *stat) {
close(cdHandle);
cdHandle = -1;
}
-
+
cdHandle = open(cdDevice, O_RDONLY, 0);
if (cdHandle < 0) {
// No CD in drive
@@ -237,7 +237,7 @@ long GetStatus(int playing, struct CdrStat *stat) {
ioctl(cdHandle, DKIOCCDSETSPEED, &speed);
}
}
-
+
return 0;
}
diff --git a/macosx/plugins/DFCdrom/macsrc/cfg.c b/macosx/plugins/DFCdrom/macsrc/cfg.c
index 6b5c1513..21a9be2b 100755
--- a/macosx/plugins/DFCdrom/macsrc/cfg.c
+++ b/macosx/plugins/DFCdrom/macsrc/cfg.c
@@ -39,7 +39,7 @@ void LoadConf() {
CacheSize = 64;
CdrSpeed = 0;
SpinDown = SPINDOWN_VENDOR_SPECIFIC;
-
+
ReadConfig();
}
@@ -50,4 +50,4 @@ long CDRconfigure() {
void CDRabout() {
AboutDlgProc();
-} \ No newline at end of file
+}