mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-04-25 12:58:38 -04:00
Frame rate limiter for Windows, Untested OSX / Linux
This commit is contained in:
parent
679ad64a1f
commit
a3fac1e932
@ -200,6 +200,7 @@ SET (cubicsdr_sources
|
||||
src/util/Gradient.cpp
|
||||
src/util/Timer.cpp
|
||||
src/util/MouseTracker.cpp
|
||||
src/util/GLExt.cpp
|
||||
src/util/GLFont.cpp
|
||||
src/util/DataTree.cpp
|
||||
src/visual/ColorTheme.cpp
|
||||
@ -242,6 +243,7 @@ SET (cubicsdr_headers
|
||||
src/util/Timer.h
|
||||
src/util/ThreadQueue.h
|
||||
src/util/MouseTracker.h
|
||||
src/util/GLExt.h
|
||||
src/util/GLFont.h
|
||||
src/util/DataTree.h
|
||||
src/visual/ColorTheme.h
|
||||
|
@ -42,7 +42,15 @@ wxFrame(NULL, wxID_ANY, CUBICSDR_TITLE), activeDemodulator(NULL) {
|
||||
wxBoxSizer *demodTray = new wxBoxSizer(wxHORIZONTAL);
|
||||
wxBoxSizer *demodScopeTray = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
demodModeSelector = new ModeSelectorCanvas(this, NULL);
|
||||
int attribList[] = {
|
||||
WX_GL_RGBA,
|
||||
WX_GL_STENCIL_SIZE, 8,
|
||||
WX_GL_BUFFER_SIZE, 24,
|
||||
WX_GL_DOUBLEBUFFER,
|
||||
0
|
||||
};
|
||||
|
||||
demodModeSelector = new ModeSelectorCanvas(this, attribList);
|
||||
demodModeSelector->addChoice(DEMOD_TYPE_FM, "FM");
|
||||
demodModeSelector->addChoice(DEMOD_TYPE_AM, "AM");
|
||||
demodModeSelector->addChoice(DEMOD_TYPE_LSB, "LSB");
|
||||
@ -53,14 +61,14 @@ wxFrame(NULL, wxID_ANY, CUBICSDR_TITLE), activeDemodulator(NULL) {
|
||||
|
||||
// demodTray->AddSpacer(2);
|
||||
|
||||
demodSpectrumCanvas = new SpectrumCanvas(this, NULL);
|
||||
demodSpectrumCanvas = new SpectrumCanvas(this, attribList);
|
||||
demodSpectrumCanvas->setup(1024);
|
||||
demodSpectrumCanvas->setView(DEFAULT_FREQ, 300000);
|
||||
demodVisuals->Add(demodSpectrumCanvas, 3, wxEXPAND | wxALL, 0);
|
||||
|
||||
demodVisuals->AddSpacer(1);
|
||||
|
||||
demodWaterfallCanvas = new WaterfallCanvas(this, NULL);
|
||||
demodWaterfallCanvas = new WaterfallCanvas(this, attribList);
|
||||
demodWaterfallCanvas->setup(1024, 128);
|
||||
demodWaterfallCanvas->setView(DEFAULT_FREQ, 300000);
|
||||
demodWaterfallCanvas->attachSpectrumCanvas(demodSpectrumCanvas);
|
||||
@ -71,19 +79,19 @@ wxFrame(NULL, wxID_ANY, CUBICSDR_TITLE), activeDemodulator(NULL) {
|
||||
|
||||
demodTray->AddSpacer(1);
|
||||
|
||||
demodSignalMeter = new MeterCanvas(this, NULL);
|
||||
demodSignalMeter = new MeterCanvas(this, attribList);
|
||||
demodSignalMeter->setMax(0.5);
|
||||
demodSignalMeter->setHelpTip("Current Signal Level. Click / Drag to set Squelch level.");
|
||||
demodTray->Add(demodSignalMeter, 1, wxEXPAND | wxALL, 0);
|
||||
|
||||
demodTray->AddSpacer(1);
|
||||
|
||||
scopeCanvas = new ScopeCanvas(this, NULL);
|
||||
scopeCanvas = new ScopeCanvas(this, attribList);
|
||||
demodScopeTray->Add(scopeCanvas, 8, wxEXPAND | wxALL, 0);
|
||||
|
||||
demodScopeTray->AddSpacer(1);
|
||||
|
||||
demodTuner = new TuningCanvas(this, NULL);
|
||||
demodTuner = new TuningCanvas(this, attribList);
|
||||
demodTuner->setHelpTip("Testing tuner");
|
||||
demodScopeTray->Add(demodTuner, 1, wxEXPAND | wxALL, 0);
|
||||
|
||||
@ -91,18 +99,18 @@ wxFrame(NULL, wxID_ANY, CUBICSDR_TITLE), activeDemodulator(NULL) {
|
||||
|
||||
demodTray->AddSpacer(1);
|
||||
|
||||
demodGainMeter = new MeterCanvas(this, NULL);
|
||||
demodGainMeter = new MeterCanvas(this, attribList);
|
||||
demodGainMeter->setMax(2.0);
|
||||
demodGainMeter->setHelpTip("Current Demodulator Gain Level. Click / Drag to set Gain level.");
|
||||
demodTray->Add(demodGainMeter, 1, wxEXPAND | wxALL, 0);
|
||||
|
||||
vbox->Add(demodTray, 12, wxEXPAND | wxALL, 0);
|
||||
vbox->AddSpacer(1);
|
||||
spectrumCanvas = new SpectrumCanvas(this, NULL);
|
||||
spectrumCanvas = new SpectrumCanvas(this, attribList);
|
||||
spectrumCanvas->setup(2048);
|
||||
vbox->Add(spectrumCanvas, 5, wxEXPAND | wxALL, 0);
|
||||
vbox->AddSpacer(1);
|
||||
waterfallCanvas = new WaterfallCanvas(this, NULL);
|
||||
waterfallCanvas = new WaterfallCanvas(this, attribList);
|
||||
waterfallCanvas->setup(2048, 512);
|
||||
waterfallCanvas->attachSpectrumCanvas(spectrumCanvas);
|
||||
waterfallCanvas->attachWaterfallCanvas(demodWaterfallCanvas);
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
#include <thread>
|
||||
|
||||
#include "wx/glcanvas.h"
|
||||
#include "GLExt.h"
|
||||
#include "PrimaryGLContext.h"
|
||||
|
||||
#include "ThreadQueue.h"
|
||||
|
66
src/util/GLExt.cpp
Normal file
66
src/util/GLExt.cpp
Normal file
@ -0,0 +1,66 @@
|
||||
#include "GLExt.h"
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
PFNWGLGETEXTENSIONSSTRINGEXTPROC wglGetExtensionsStringEXT = NULL;
|
||||
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
|
||||
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = NULL;
|
||||
|
||||
bool GLExtSupported(const char *extension_name) {
|
||||
const GLubyte *extensions = glGetString(GL_EXTENSIONS);
|
||||
|
||||
return (std::strstr((const char *)extensions, extension_name) != NULL);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
bool GLExt_initialized = false;
|
||||
|
||||
void initGLExtensions() {
|
||||
if (GLExt_initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
const GLubyte *extensions = glGetString(GL_EXTENSIONS);
|
||||
|
||||
std::cout << "Supported GL Extensions: " << extensions << std::endl;
|
||||
|
||||
int interval = 2;
|
||||
|
||||
#ifdef _WIN32
|
||||
if (GLExtSupported("WGL_EXT_swap_control")) {
|
||||
std::cout << "Initializing WGL swap control extensions.." << std::endl;
|
||||
wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT");
|
||||
wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) wglGetProcAddress("wglGetSwapIntervalEXT");
|
||||
|
||||
wglSwapIntervalEXT(interval);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
long l_interval= interval;
|
||||
CGLSetParameter (CGLGetCurrentContext(), kCGLCPSwapInterval, &l_interval);
|
||||
#endif
|
||||
|
||||
/*
|
||||
#ifdef LINUX
|
||||
char* pcDummy = NULL;
|
||||
|
||||
glXSwapIntervalSGIFunc glXSwapIntervalSGI = 0;
|
||||
glXSwapIntervalMESAFunc glXSwapIntervalMESA = 0;
|
||||
|
||||
pcDummy = (char*)glXQueryExtensionsString (glXGetCurrentDisplay(), 0);
|
||||
if (strstr (pcDummy, "GLX_SGI_swap_control") != NULL) {
|
||||
glXSwapIntervalSGI = (glXSwapIntervalSGIFunc) dlsym(RTLD_DEFAULT,"glXSwapIntervalSGI") && glXSwapIntervalSGI (interval);
|
||||
|
||||
} else if (strstr(pcDummy, "GLX_MESA_swap_control") != NULL) {
|
||||
glXSwapIntervalMESA = (glXSwapIntervalMESAFunc) dlsym(RTLD_DEFAULT,"glXSwapIntervalMESA") && glXSwapIntervalMESA (interval);
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
GLExt_initialized = true;
|
||||
}
|
20
src/util/GLExt.h
Normal file
20
src/util/GLExt.h
Normal file
@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
#include "wx/glcanvas.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <gl/wglext.h>
|
||||
|
||||
extern PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglGetExtensionsStringEXT;
|
||||
extern PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
|
||||
extern PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT;
|
||||
|
||||
bool GLExtSupported(const char *extension_name);
|
||||
|
||||
#endif
|
||||
|
||||
extern bool GLExt_initialized;
|
||||
|
||||
void initGLExtensions();
|
||||
|
@ -63,6 +63,8 @@ void MeterCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
||||
const wxSize ClientSize = GetClientSize();
|
||||
|
||||
glContext->SetCurrent(*this);
|
||||
initGLExtensions();
|
||||
|
||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||
|
||||
glContext->DrawBegin();
|
||||
|
@ -50,6 +50,8 @@ void ModeSelectorCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
||||
const wxSize ClientSize = GetClientSize();
|
||||
|
||||
glContext->SetCurrent(*this);
|
||||
initGLExtensions();
|
||||
|
||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||
|
||||
glContext->DrawBegin();
|
||||
|
@ -67,6 +67,8 @@ void ScopeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
||||
}
|
||||
|
||||
glContext->SetCurrent(*this);
|
||||
initGLExtensions();
|
||||
|
||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||
|
||||
glContext->DrawBegin();
|
||||
|
@ -70,6 +70,8 @@ void SpectrumCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
||||
const wxSize ClientSize = GetClientSize();
|
||||
|
||||
glContext->SetCurrent(*this);
|
||||
initGLExtensions();
|
||||
|
||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||
|
||||
glContext->BeginDraw(ThemeMgr::mgr.currentTheme->fftBackground.r, ThemeMgr::mgr.currentTheme->fftBackground.g, ThemeMgr::mgr.currentTheme->fftBackground.b);
|
||||
|
@ -39,6 +39,7 @@ void TuningCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
||||
const wxSize ClientSize = GetClientSize();
|
||||
|
||||
glContext->SetCurrent(*this);
|
||||
initGLExtensions();
|
||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||
|
||||
glContext->DrawBegin();
|
||||
|
@ -116,7 +116,8 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
||||
}
|
||||
|
||||
glContext->SetCurrent(*this);
|
||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||
initGLExtensions();
|
||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||
|
||||
glContext->BeginDraw(0,0,0);
|
||||
glContext->Draw(spectrum_points);
|
||||
|
Loading…
Reference in New Issue
Block a user