diff options
| author | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-09-16 20:31:07 +0000 |
|---|---|---|
| committer | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-09-16 20:31:07 +0000 |
| commit | a5a97b02c0205f0cc98327389ec88672ddd769f2 (patch) | |
| tree | e1b7254679180d8e9413c3b10fb8b2e3c91691aa | |
| parent | 481101a05a77e2cc5b22cc94a5319748aeb5c031 (diff) | |
| download | pcsxr-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.xib | 30 | ||||
| -rw-r--r-- | macosx/Pcsxr.xcodeproj/project.pbxproj | 4 | ||||
| -rwxr-xr-x | macosx/PcsxrController.m | 75 | ||||
| -rwxr-xr-x | macosx/plugins/DFCdrom/macsrc/PluginConfigController.m | 28 | ||||
| -rwxr-xr-x | macosx/plugins/DFCdrom/macsrc/cdr-macosx.c | 76 | ||||
| -rwxr-xr-x | macosx/plugins/DFCdrom/macsrc/cfg.c | 4 |
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 +} |
