1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-29 12:50:28 +00:00

Attempted further to improve latency; added view adjustment for non-4:3 output aspect ratios. The 4:3 is currently hardcoded, so further work will be required.

This commit is contained in:
Thomas Harte 2016-01-18 23:55:52 -05:00
parent 90eef1df74
commit 956b90e203
3 changed files with 16 additions and 8 deletions

View File

@ -248,6 +248,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
switch(_frameCycles) switch(_frameCycles)
{ {
case 64*128: case 64*128:
case 196*128:
update_audio(); update_audio();
break; break;
@ -256,10 +257,6 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
signal_interrupt(InterruptRealTimeClock); signal_interrupt(InterruptRealTimeClock);
break; break;
case 196*128:
update_audio();
break;
case 284*128: case 284*128:
update_audio(); update_audio();
signal_interrupt(InterruptDisplayEnd); signal_interrupt(InterruptDisplayEnd);

View File

@ -37,6 +37,8 @@
CSCathodeRayViewSignalType _signalType; CSCathodeRayViewSignalType _signalType;
int32_t _signalDecoderGeneration; int32_t _signalDecoderGeneration;
int32_t _compiledSignalDecoderGeneration; int32_t _compiledSignalDecoderGeneration;
CGRect _aspectRatioCorrectedBounds;
} }
- (GLuint)textureForImageNamed:(NSString *)name - (GLuint)textureForImageNamed:(NSString *)name
@ -155,14 +157,23 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt
{ {
if(_shaderProgram) if(_shaderProgram)
{ {
NSPoint viewSize = [self backingViewSize];
if(_windowSizeUniform >= 0) if(_windowSizeUniform >= 0)
{ {
NSPoint viewSize = [self backingViewSize];
glUniform2f(_windowSizeUniform, (GLfloat)viewSize.x, (GLfloat)viewSize.y); glUniform2f(_windowSizeUniform, (GLfloat)viewSize.x, (GLfloat)viewSize.y);
} }
if(_boundsOriginUniform >= 0) glUniform2f(_boundsOriginUniform, (GLfloat)_frameBounds.origin.x, (GLfloat)_frameBounds.origin.y); CGFloat outputAspectRatioMultiplier = (viewSize.x / viewSize.y) / (4.0 / 3.0);
if(_boundsSizeUniform >= 0) glUniform2f(_boundsSizeUniform, (GLfloat)_frameBounds.size.width, (GLfloat)_frameBounds.size.height);
// NSLog(@"%0.2f v %0.2f", outputAspectRatio, desiredOutputAspectRatio);
_aspectRatioCorrectedBounds = _frameBounds;
CGFloat bonusWidth = (outputAspectRatioMultiplier - 1.0f) * _frameBounds.size.width;
_aspectRatioCorrectedBounds.origin.x -= bonusWidth * 0.5f * _aspectRatioCorrectedBounds.size.width;
_aspectRatioCorrectedBounds.size.width *= outputAspectRatioMultiplier;
if(_boundsOriginUniform >= 0) glUniform2f(_boundsOriginUniform, (GLfloat)_aspectRatioCorrectedBounds.origin.x, (GLfloat)_aspectRatioCorrectedBounds.origin.y);
if(_boundsSizeUniform >= 0) glUniform2f(_boundsSizeUniform, (GLfloat)_aspectRatioCorrectedBounds.size.width, (GLfloat)_aspectRatioCorrectedBounds.size.height);
} }
} }

View File

@ -54,7 +54,7 @@
} }
- (BOOL)setSpeakerDelegate:(Outputs::Speaker::Delegate *)delegate sampleRate:(int)sampleRate { - (BOOL)setSpeakerDelegate:(Outputs::Speaker::Delegate *)delegate sampleRate:(int)sampleRate {
_electron.get_speaker()->set_output_rate(sampleRate, 512); _electron.get_speaker()->set_output_rate(sampleRate, 256);
_electron.get_speaker()->set_output_quality(15); _electron.get_speaker()->set_output_quality(15);
_electron.get_speaker()->set_delegate(delegate); _electron.get_speaker()->set_delegate(delegate);
return YES; return YES;