Cocoa Port: Add the ability for the user to set a fixed frame skip value, just like in the Windows port. This is in addition to the existing automatic frame skip setting.
This commit is contained in:
parent
67fa412144
commit
0df858f2e8
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2017-2018 DeSmuME team
|
Copyright (C) 2017-2021 DeSmuME team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -99,6 +99,7 @@ ClientExecutionControl::ClientExecutionControl()
|
||||||
_settingsPending.executionSpeed = SPEED_SCALAR_NORMAL;
|
_settingsPending.executionSpeed = SPEED_SCALAR_NORMAL;
|
||||||
|
|
||||||
_settingsPending.enableFrameSkip = true;
|
_settingsPending.enableFrameSkip = true;
|
||||||
|
_settingsPending.framesToSkipSetting = 0; // A value of 0 is interpreted as 'automatic'.
|
||||||
_settingsPending.frameJumpRelativeTarget = 60;
|
_settingsPending.frameJumpRelativeTarget = 60;
|
||||||
_settingsPending.frameJumpTarget = 60;
|
_settingsPending.frameJumpTarget = 60;
|
||||||
|
|
||||||
|
@ -744,6 +745,29 @@ void ClientExecutionControl::ResetFramesToSkip()
|
||||||
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec);
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t ClientExecutionControl::GetFramesToSkipSetting()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnExecutionLoopStart);
|
||||||
|
const uint8_t framesToSkipSetting = this->_settingsPending.framesToSkipSetting;
|
||||||
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnExecutionLoopStart);
|
||||||
|
|
||||||
|
return framesToSkipSetting;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t ClientExecutionControl::GetFramesToSkipSettingApplied()
|
||||||
|
{
|
||||||
|
return this->_settingsApplied.framesToSkipSetting;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientExecutionControl::SetFramesToSkipSetting(uint8_t numFrames)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnExecutionLoopStart);
|
||||||
|
this->_settingsPending.framesToSkipSetting = numFrames;
|
||||||
|
|
||||||
|
this->_newSettingsPendingOnExecutionLoopStart = true;
|
||||||
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnExecutionLoopStart);
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t ClientExecutionControl::GetFrameJumpRelativeTarget()
|
uint64_t ClientExecutionControl::GetFrameJumpRelativeTarget()
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&this->_mutexSettingsPendingOnExecutionLoopStart);
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnExecutionLoopStart);
|
||||||
|
@ -1068,6 +1092,7 @@ void ClientExecutionControl::ApplySettingsOnExecutionLoopStart()
|
||||||
const double speedScalar = (this->_settingsPending.executionSpeed > SPEED_SCALAR_MIN) ? this->_settingsPending.executionSpeed : SPEED_SCALAR_MIN;
|
const double speedScalar = (this->_settingsPending.executionSpeed > SPEED_SCALAR_MIN) ? this->_settingsPending.executionSpeed : SPEED_SCALAR_MIN;
|
||||||
this->_settingsApplied.enableExecutionSpeedLimiter = this->_settingsPending.enableExecutionSpeedLimiter;
|
this->_settingsApplied.enableExecutionSpeedLimiter = this->_settingsPending.enableExecutionSpeedLimiter;
|
||||||
this->_settingsApplied.executionSpeed = speedScalar;
|
this->_settingsApplied.executionSpeed = speedScalar;
|
||||||
|
this->_settingsApplied.framesToSkipSetting = this->_settingsPending.framesToSkipSetting;
|
||||||
|
|
||||||
this->_settingsApplied.jumpBehavior = this->_settingsPending.jumpBehavior;
|
this->_settingsApplied.jumpBehavior = this->_settingsPending.jumpBehavior;
|
||||||
this->_settingsApplied.frameJumpRelativeTarget = this->_settingsPending.frameJumpRelativeTarget;
|
this->_settingsApplied.frameJumpRelativeTarget = this->_settingsPending.frameJumpRelativeTarget;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2017-2018 DeSmuME team
|
Copyright (C) 2017-2021 DeSmuME team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -106,6 +106,7 @@ struct ClientExecutionControlSettings
|
||||||
double executionSpeed;
|
double executionSpeed;
|
||||||
|
|
||||||
bool enableFrameSkip;
|
bool enableFrameSkip;
|
||||||
|
uint8_t framesToSkipSetting;
|
||||||
uint64_t frameJumpRelativeTarget;
|
uint64_t frameJumpRelativeTarget;
|
||||||
uint64_t frameJumpTarget;
|
uint64_t frameJumpTarget;
|
||||||
|
|
||||||
|
@ -337,6 +338,10 @@ public:
|
||||||
void SetFramesToSkip(uint8_t numFrames);
|
void SetFramesToSkip(uint8_t numFrames);
|
||||||
void ResetFramesToSkip();
|
void ResetFramesToSkip();
|
||||||
|
|
||||||
|
uint8_t GetFramesToSkipSetting();
|
||||||
|
uint8_t GetFramesToSkipSettingApplied();
|
||||||
|
void SetFramesToSkipSetting(uint8_t numFrames);
|
||||||
|
|
||||||
uint64_t GetFrameJumpRelativeTarget();
|
uint64_t GetFrameJumpRelativeTarget();
|
||||||
void SetFrameJumpRelativeTarget(uint64_t newRelativeTarget);
|
void SetFrameJumpRelativeTarget(uint64_t newRelativeTarget);
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
<true/>
|
<true/>
|
||||||
<key>CoreControl_EnableAutoFrameSkip</key>
|
<key>CoreControl_EnableAutoFrameSkip</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>CoreControl_FramesToSkipSetting</key>
|
||||||
|
<integer>0</integer>
|
||||||
<key>CoreControl_EnableCheats</key>
|
<key>CoreControl_EnableCheats</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>CoreControl_EnableSpeedLimit</key>
|
<key>CoreControl_EnableSpeedLimit</key>
|
||||||
|
|
|
@ -78,6 +78,7 @@ typedef struct
|
||||||
|
|
||||||
@property (assign) BOOL masterExecute;
|
@property (assign) BOOL masterExecute;
|
||||||
@property (assign) BOOL isFrameSkipEnabled;
|
@property (assign) BOOL isFrameSkipEnabled;
|
||||||
|
@property (assign) NSInteger framesToSkipSetting;
|
||||||
@property (assign) NSInteger coreState;
|
@property (assign) NSInteger coreState;
|
||||||
@property (assign) BOOL emulationPaused;
|
@property (assign) BOOL emulationPaused;
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,7 @@ volatile bool execute = true;
|
||||||
|
|
||||||
@dynamic masterExecute;
|
@dynamic masterExecute;
|
||||||
@dynamic isFrameSkipEnabled;
|
@dynamic isFrameSkipEnabled;
|
||||||
|
@dynamic framesToSkipSetting;
|
||||||
@dynamic coreState;
|
@dynamic coreState;
|
||||||
@dynamic emulationPaused;
|
@dynamic emulationPaused;
|
||||||
@dynamic isSpeedLimitEnabled;
|
@dynamic isSpeedLimitEnabled;
|
||||||
|
@ -283,6 +284,25 @@ volatile bool execute = true;
|
||||||
return (enable) ? YES : NO;
|
return (enable) ? YES : NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) setFramesToSkipSetting:(NSInteger)framesToSkip
|
||||||
|
{
|
||||||
|
if (framesToSkip < 0)
|
||||||
|
{
|
||||||
|
framesToSkip = 0; // Actual frame skip values can't be negative.
|
||||||
|
}
|
||||||
|
else if (framesToSkip > MAX_FIXED_FRAMESKIP_VALUE)
|
||||||
|
{
|
||||||
|
framesToSkip = MAX_FIXED_FRAMESKIP_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
execControl->SetFramesToSkipSetting((uint8_t)framesToSkip);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSInteger) framesToSkipSetting
|
||||||
|
{
|
||||||
|
return (NSInteger)execControl->GetFramesToSkipSetting();
|
||||||
|
}
|
||||||
|
|
||||||
- (void) setSpeedScalar:(CGFloat)scalar
|
- (void) setSpeedScalar:(CGFloat)scalar
|
||||||
{
|
{
|
||||||
execControl->SetExecutionSpeed((float)scalar);
|
execControl->SetExecutionSpeed((float)scalar);
|
||||||
|
@ -1359,8 +1379,16 @@ static void* RunCoreThread(void *arg)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const double frameTimeBias = (lastExecutionSpeedDifference > 0.0) ? 1.0 - lastExecutionSpeedDifference : 1.0;
|
const uint8_t framesToSkipSetting = execControl->GetFramesToSkipSettingApplied();
|
||||||
execControl->SetFramesToSkip( execControl->CalculateFrameSkip(startTime, frameTime * frameTimeBias) );
|
if (framesToSkipSetting == 0) // A value of 0 is interpreted as 'automatic'.
|
||||||
|
{
|
||||||
|
const double frameTimeBias = (lastExecutionSpeedDifference > 0.0) ? 1.0 - lastExecutionSpeedDifference : 1.0;
|
||||||
|
execControl->SetFramesToSkip( execControl->CalculateFrameSkip(startTime, frameTime * frameTimeBias) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
execControl->SetFramesToSkip(framesToSkipSetting);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2011 Roger Manuel
|
Copyright (C) 2011 Roger Manuel
|
||||||
Copyright (C) 2012-2018 DeSmuME Team
|
Copyright (C) 2012-2021 DeSmuME Team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -183,6 +183,8 @@
|
||||||
#define MAX_VOLUME 100.0f
|
#define MAX_VOLUME 100.0f
|
||||||
#define MAX_BRIGHTNESS 100.0f
|
#define MAX_BRIGHTNESS 100.0f
|
||||||
|
|
||||||
|
#define MAX_FIXED_FRAMESKIP_VALUE 255
|
||||||
|
|
||||||
#define CHEAT_DESCRIPTION_LENGTH 1024
|
#define CHEAT_DESCRIPTION_LENGTH 1024
|
||||||
|
|
||||||
#define WINDOW_STATUS_BAR_HEIGHT 24 // Height of an emulation window status bar in pixels.
|
#define WINDOW_STATUS_BAR_HEIGHT 24 // Height of an emulation window status bar in pixels.
|
||||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2013-2018 DeSmuME Team
|
Copyright (C) 2013-2021 DeSmuME Team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -209,6 +209,7 @@ class AudioSampleBlockGenerator;
|
||||||
// Emulation Menu
|
// Emulation Menu
|
||||||
- (IBAction) toggleSpeedLimiter:(id)sender;
|
- (IBAction) toggleSpeedLimiter:(id)sender;
|
||||||
- (IBAction) toggleAutoFrameSkip:(id)sender;
|
- (IBAction) toggleAutoFrameSkip:(id)sender;
|
||||||
|
- (IBAction) framesToSkipSetting:(id)sender;
|
||||||
- (IBAction) toggleCheats:(id)sender;
|
- (IBAction) toggleCheats:(id)sender;
|
||||||
- (IBAction) toggleExecutePause:(id)sender;
|
- (IBAction) toggleExecutePause:(id)sender;
|
||||||
- (IBAction) coreExecute:(id)sender;
|
- (IBAction) coreExecute:(id)sender;
|
||||||
|
|
|
@ -643,9 +643,9 @@
|
||||||
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
|
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
|
||||||
NSURL *sramURL = [CocoaDSFile fileURLFromRomURL:[[self currentRom] fileURL] toKind:@"ROM Save"];
|
NSURL *sramURL = [CocoaDSFile fileURLFromRomURL:[[self currentRom] fileURL] toKind:@"ROM Save"];
|
||||||
|
|
||||||
NSFileManager *fileManager = [[NSFileManager alloc] init];
|
//NSFileManager *fileManager = [[NSFileManager alloc] init];
|
||||||
const BOOL exists = [fileManager isReadableFileAtPath:[sramURL path]];
|
//const BOOL exists = [fileManager isReadableFileAtPath:[sramURL path]];
|
||||||
[fileManager release];
|
//[fileManager release];
|
||||||
|
|
||||||
const BOOL isMovieStarted = [cdsCore startReplayRecording:fileURL sramURL:sramURL];
|
const BOOL isMovieStarted = [cdsCore startReplayRecording:fileURL sramURL:sramURL];
|
||||||
[self setStatusText:(isMovieStarted) ? @"Replay recording started." : @"Replay creation failed!"];
|
[self setStatusText:(isMovieStarted) ? @"Replay recording started." : @"Replay creation failed!"];
|
||||||
|
@ -769,6 +769,12 @@
|
||||||
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
|
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (IBAction) framesToSkipSetting:(id)sender
|
||||||
|
{
|
||||||
|
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
|
||||||
|
[cdsCore setFramesToSkipSetting:[CocoaDSUtil getIBActionSenderTag:sender]];
|
||||||
|
}
|
||||||
|
|
||||||
- (IBAction) toggleGPUState:(id)sender
|
- (IBAction) toggleGPUState:(id)sender
|
||||||
{
|
{
|
||||||
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
|
[inputManager dispatchCommandUsingIBAction:_cmd sender:sender];
|
||||||
|
@ -2896,6 +2902,13 @@
|
||||||
enable = NO;
|
enable = NO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (theAction == @selector(framesToSkipSetting:))
|
||||||
|
{
|
||||||
|
if ([(id)theItem isMemberOfClass:[NSMenuItem class]])
|
||||||
|
{
|
||||||
|
[(NSMenuItem*)theItem setState:([cdsCore framesToSkipSetting] == [theItem tag]) ? NSOnState : NSOffState];
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (theAction == @selector(toggleCheats:))
|
else if (theAction == @selector(toggleCheats:))
|
||||||
{
|
{
|
||||||
if ([(id)theItem isMemberOfClass:[NSMenuItem class]])
|
if ([(id)theItem isMemberOfClass:[NSMenuItem class]])
|
||||||
|
|
|
@ -395,6 +395,7 @@
|
||||||
[[NSUserDefaults standardUserDefaults] setDouble:[emuControl lastSetSpeedScalar] forKey:@"CoreControl_SpeedScalar"];
|
[[NSUserDefaults standardUserDefaults] setDouble:[emuControl lastSetSpeedScalar] forKey:@"CoreControl_SpeedScalar"];
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore isSpeedLimitEnabled] forKey:@"CoreControl_EnableSpeedLimit"];
|
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore isSpeedLimitEnabled] forKey:@"CoreControl_EnableSpeedLimit"];
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore isFrameSkipEnabled] forKey:@"CoreControl_EnableAutoFrameSkip"];
|
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore isFrameSkipEnabled] forKey:@"CoreControl_EnableAutoFrameSkip"];
|
||||||
|
[[NSUserDefaults standardUserDefaults] setInteger:[cdsCore framesToSkipSetting] forKey:@"CoreControl_FramesToSkipSetting"];
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore isCheatingEnabled] forKey:@"CoreControl_EnableCheats"];
|
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore isCheatingEnabled] forKey:@"CoreControl_EnableCheats"];
|
||||||
|
|
||||||
#ifdef GDB_STUB
|
#ifdef GDB_STUB
|
||||||
|
@ -543,6 +544,7 @@
|
||||||
[emuControl changeCoreSpeedWithDouble:[[NSUserDefaults standardUserDefaults] doubleForKey:@"CoreControl_SpeedScalar"]];
|
[emuControl changeCoreSpeedWithDouble:[[NSUserDefaults standardUserDefaults] doubleForKey:@"CoreControl_SpeedScalar"]];
|
||||||
[cdsCore setIsSpeedLimitEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableSpeedLimit"]];
|
[cdsCore setIsSpeedLimitEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableSpeedLimit"]];
|
||||||
[cdsCore setIsFrameSkipEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableAutoFrameSkip"]];
|
[cdsCore setIsFrameSkipEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableAutoFrameSkip"]];
|
||||||
|
[cdsCore setFramesToSkipSetting:[[NSUserDefaults standardUserDefaults] integerForKey:@"CoreControl_FramesToSkipSetting"]];
|
||||||
[cdsCore setIsCheatingEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableCheats"]];
|
[cdsCore setIsCheatingEnabled:[[NSUserDefaults standardUserDefaults] boolForKey:@"CoreControl_EnableCheats"]];
|
||||||
|
|
||||||
// Set up the firmware per user preferences.
|
// Set up the firmware per user preferences.
|
||||||
|
|
Loading…
Reference in New Issue