diff --git a/desmume/src/cocoa/openemu/NDSGameCore.h b/desmume/src/cocoa/openemu/NDSGameCore.h index 673dbd7d2..eef706522 100644 --- a/desmume/src/cocoa/openemu/NDSGameCore.h +++ b/desmume/src/cocoa/openemu/NDSGameCore.h @@ -17,21 +17,25 @@ #import #import -#import -#import "OENDSSystemResponderClient.h" -#include "../ringbuffer.h" +#include @class CocoaDSFirmware; @class CocoaDSMic; + @interface NDSGameCore : OEGameCore { bool *input; CocoaDSFirmware *firmware; CocoaDSMic *microphone; + NSInteger displayMode; + OEIntRect displayRect; + + OSSpinLock spinlockDisplayMode; } @property (retain) CocoaDSFirmware *firmware; @property (retain) CocoaDSMic *microphone; +@property (assign) NSInteger displayMode; @end diff --git a/desmume/src/cocoa/openemu/NDSGameCore.mm b/desmume/src/cocoa/openemu/NDSGameCore.mm index e684e2044..bb015cbc5 100644 --- a/desmume/src/cocoa/openemu/NDSGameCore.mm +++ b/desmume/src/cocoa/openemu/NDSGameCore.mm @@ -23,9 +23,9 @@ #import "cocoa_mic.h" #import "cocoa_output.h" #import "OESoundInterface.h" +#import "OENDSSystemResponderClient.h" #include -#include "../../path.h" #include "../../NDSSystem.h" #include "../../render3D.h" #undef BOOL @@ -34,26 +34,30 @@ @synthesize firmware; @synthesize microphone; +@dynamic displayMode; - (id)init { self = [super init]; - if(self == nil) - { + if(self == nil) + { return self; } + // Set up input handling input = (bool *)calloc(sizeof(bool), OENDSButtonCount); - microphone = [[CocoaDSMic alloc] init]; microphone.mode = MICMODE_INTERNAL_NOISE; + // Set up the emulation core CommonSettings.advanced_timing = true; [CocoaDSCore startupCore]; + // Set up the DS firmware using the internal firmware firmware = [[CocoaDSFirmware alloc] init]; [firmware update]; + // Set up the 3D renderer NSUInteger numberCores = [[NSProcessInfo processInfo] activeProcessorCount]; if (numberCores >= 4) { @@ -71,10 +75,9 @@ CommonSettings.num_cores = numberCores; NDS_3D_ChangeCore(CORE3DLIST_SWRASTERIZE); + // Set up the sound core CommonSettings.spu_advanced = true; CommonSettings.spuInterpolationMode = SPUInterpolation_Cosine; - - // Set up the sound core openEmuSoundInterfaceBuffer = [self ringBufferAtIndex:0]; NSInteger result = SPU_ChangeSoundCore(SNDCORE_OPENEMU, (int)SPU_BUFFER_BYTES); @@ -86,6 +89,11 @@ SPU_SetSynchMode(SPU_SYNC_MODE_SYNCHRONOUS, SPU_SYNC_METHOD_P); SPU_SetVolume(100); + // Set up the DS display + displayMode = DS_DISPLAY_TYPE_COMBO; + displayRect = OERectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); + spinlockDisplayMode = OS_SPINLOCK_INIT; + return self; } @@ -103,6 +111,44 @@ [super dealloc]; } +- (NSInteger) displayMode +{ + OSSpinLockLock(&spinlockDisplayMode); + NSInteger theMode = displayMode; + OSSpinLockUnlock(&spinlockDisplayMode); + + return theMode; +} + +- (void) setDisplayMode:(NSInteger)theMode +{ + OEIntRect newDisplayRect; + + switch (theMode) + { + case DS_DISPLAY_TYPE_MAIN: + newDisplayRect = OERectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); + break; + + case DS_DISPLAY_TYPE_TOUCH: + newDisplayRect = OERectMake(0, GPU_DISPLAY_HEIGHT + 1, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT); + break; + + case DS_DISPLAY_TYPE_COMBO: + newDisplayRect = OERectMake(0, 0, GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); + break; + + default: + return; + break; + } + + OSSpinLockLock(&spinlockDisplayMode); + displayMode = theMode; + displayRect = newDisplayRect; + OSSpinLockUnlock(&spinlockDisplayMode); +} + #pragma mark - #pragma mark Execution @@ -135,8 +181,9 @@ } - (BOOL)loadFileAtPath:(NSString*)path -{ - NSURL *openEmuDataURL = [NSURL fileURLWithPath:[self batterySavesDirectoryPath]]; +{ + NSString *openEmuDataPath = [self batterySavesDirectoryPath]; + NSURL *openEmuDataURL = [NSURL fileURLWithPath:openEmuDataPath]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"ROM"]; [CocoaDSFile addURLToURLDictionary:openEmuDataURL groupKey:@PATH_OPEN_EMU fileKind:@"ROM Save"]; @@ -150,6 +197,11 @@ [CocoaDSFile setupAllFilePathsWithURLDictionary:@PATH_OPEN_EMU]; + // Ensure that the OpenEmu data directory exists before loading the ROM. + NSFileManager *fileManager = [[NSFileManager alloc] init]; + [fileManager createDirectoryAtPath:openEmuDataPath withIntermediateDirectories:YES attributes:nil error:NULL]; + [fileManager release]; + return [CocoaDSFile loadRom:[NSURL fileURLWithPath:path]]; } @@ -157,17 +209,21 @@ - (OEIntRect)screenRect { - return (OEIntRect){{}, [self bufferSize]}; + OSSpinLockLock(&spinlockDisplayMode); + OEIntRect theRect = displayRect; + OSSpinLockUnlock(&spinlockDisplayMode); + + return theRect; } - (OEIntSize)bufferSize { - return OESizeMake(256, 384); + return OESizeMake(GPU_DISPLAY_WIDTH, GPU_DISPLAY_HEIGHT * 2); } - (const void *)videoBuffer { - return GPU_screen; + return GPU_screen; } - (GLenum)pixelFormat @@ -209,7 +265,7 @@ - (NSUInteger)channelCountForBuffer:(NSUInteger)buffer { - return [self channelCount]; + return [self channelCount]; } - (NSUInteger)audioBufferSizeForBuffer:(NSUInteger)buffer @@ -219,7 +275,7 @@ - (double)audioSampleRateForBuffer:(NSUInteger)buffer { - return [self audioSampleRate]; + return [self audioSampleRate]; } @@ -295,26 +351,25 @@ - (NSTrackingAreaOptions)mouseTrackingOptions { - return 0; + return 0; } - (void)settingWasSet:(id)aValue forKey:(NSString *)keyName { - DLog(@"keyName = %@", keyName); - //[self doesNotImplementSelector:_cmd]; + DLog(@"keyName = %@", keyName); + //[self doesNotImplementSelector:_cmd]; } #pragma mark Save State - (BOOL)saveStateToFileAtPath:(NSString *)fileName { - return [CocoaDSFile saveState:[NSURL fileURLWithPath:fileName]]; + return [CocoaDSFile saveState:[NSURL fileURLWithPath:fileName]]; } - (BOOL)loadStateFromFileAtPath:(NSString *)fileName { - return [CocoaDSFile loadState:[NSURL fileURLWithPath:fileName]]; + return [CocoaDSFile loadState:[NSURL fileURLWithPath:fileName]]; } - @end diff --git a/desmume/src/cocoa/openemu/OESoundInterface.mm b/desmume/src/cocoa/openemu/OESoundInterface.mm index d810a0b04..832b82bb2 100644 --- a/desmume/src/cocoa/openemu/OESoundInterface.mm +++ b/desmume/src/cocoa/openemu/OESoundInterface.mm @@ -15,9 +15,10 @@ along with the this software. If not, see . */ -#include "OESoundInterface.h" +#import "OESoundInterface.h" + +#import "cocoa_globals.h" -#include "cocoa_globals.h" OERingBuffer *openEmuSoundInterfaceBuffer = nil; @@ -43,7 +44,6 @@ SoundInterface_struct *SNDCoreList[] = { int SNDOpenEmuInit(int buffer_size) { - // Do nothing. The OpenEmu frontend will take care of this. [openEmuSoundInterfaceBuffer setLength:buffer_size]; return 0;