mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-07-05 19:25:16 -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/Gradient.cpp
|
||||||
src/util/Timer.cpp
|
src/util/Timer.cpp
|
||||||
src/util/MouseTracker.cpp
|
src/util/MouseTracker.cpp
|
||||||
|
src/util/GLExt.cpp
|
||||||
src/util/GLFont.cpp
|
src/util/GLFont.cpp
|
||||||
src/util/DataTree.cpp
|
src/util/DataTree.cpp
|
||||||
src/visual/ColorTheme.cpp
|
src/visual/ColorTheme.cpp
|
||||||
@ -242,6 +243,7 @@ SET (cubicsdr_headers
|
|||||||
src/util/Timer.h
|
src/util/Timer.h
|
||||||
src/util/ThreadQueue.h
|
src/util/ThreadQueue.h
|
||||||
src/util/MouseTracker.h
|
src/util/MouseTracker.h
|
||||||
|
src/util/GLExt.h
|
||||||
src/util/GLFont.h
|
src/util/GLFont.h
|
||||||
src/util/DataTree.h
|
src/util/DataTree.h
|
||||||
src/visual/ColorTheme.h
|
src/visual/ColorTheme.h
|
||||||
|
@ -42,7 +42,15 @@ wxFrame(NULL, wxID_ANY, CUBICSDR_TITLE), activeDemodulator(NULL) {
|
|||||||
wxBoxSizer *demodTray = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *demodTray = new wxBoxSizer(wxHORIZONTAL);
|
||||||
wxBoxSizer *demodScopeTray = new wxBoxSizer(wxVERTICAL);
|
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_FM, "FM");
|
||||||
demodModeSelector->addChoice(DEMOD_TYPE_AM, "AM");
|
demodModeSelector->addChoice(DEMOD_TYPE_AM, "AM");
|
||||||
demodModeSelector->addChoice(DEMOD_TYPE_LSB, "LSB");
|
demodModeSelector->addChoice(DEMOD_TYPE_LSB, "LSB");
|
||||||
@ -53,14 +61,14 @@ wxFrame(NULL, wxID_ANY, CUBICSDR_TITLE), activeDemodulator(NULL) {
|
|||||||
|
|
||||||
// demodTray->AddSpacer(2);
|
// demodTray->AddSpacer(2);
|
||||||
|
|
||||||
demodSpectrumCanvas = new SpectrumCanvas(this, NULL);
|
demodSpectrumCanvas = new SpectrumCanvas(this, attribList);
|
||||||
demodSpectrumCanvas->setup(1024);
|
demodSpectrumCanvas->setup(1024);
|
||||||
demodSpectrumCanvas->setView(DEFAULT_FREQ, 300000);
|
demodSpectrumCanvas->setView(DEFAULT_FREQ, 300000);
|
||||||
demodVisuals->Add(demodSpectrumCanvas, 3, wxEXPAND | wxALL, 0);
|
demodVisuals->Add(demodSpectrumCanvas, 3, wxEXPAND | wxALL, 0);
|
||||||
|
|
||||||
demodVisuals->AddSpacer(1);
|
demodVisuals->AddSpacer(1);
|
||||||
|
|
||||||
demodWaterfallCanvas = new WaterfallCanvas(this, NULL);
|
demodWaterfallCanvas = new WaterfallCanvas(this, attribList);
|
||||||
demodWaterfallCanvas->setup(1024, 128);
|
demodWaterfallCanvas->setup(1024, 128);
|
||||||
demodWaterfallCanvas->setView(DEFAULT_FREQ, 300000);
|
demodWaterfallCanvas->setView(DEFAULT_FREQ, 300000);
|
||||||
demodWaterfallCanvas->attachSpectrumCanvas(demodSpectrumCanvas);
|
demodWaterfallCanvas->attachSpectrumCanvas(demodSpectrumCanvas);
|
||||||
@ -71,19 +79,19 @@ wxFrame(NULL, wxID_ANY, CUBICSDR_TITLE), activeDemodulator(NULL) {
|
|||||||
|
|
||||||
demodTray->AddSpacer(1);
|
demodTray->AddSpacer(1);
|
||||||
|
|
||||||
demodSignalMeter = new MeterCanvas(this, NULL);
|
demodSignalMeter = new MeterCanvas(this, attribList);
|
||||||
demodSignalMeter->setMax(0.5);
|
demodSignalMeter->setMax(0.5);
|
||||||
demodSignalMeter->setHelpTip("Current Signal Level. Click / Drag to set Squelch level.");
|
demodSignalMeter->setHelpTip("Current Signal Level. Click / Drag to set Squelch level.");
|
||||||
demodTray->Add(demodSignalMeter, 1, wxEXPAND | wxALL, 0);
|
demodTray->Add(demodSignalMeter, 1, wxEXPAND | wxALL, 0);
|
||||||
|
|
||||||
demodTray->AddSpacer(1);
|
demodTray->AddSpacer(1);
|
||||||
|
|
||||||
scopeCanvas = new ScopeCanvas(this, NULL);
|
scopeCanvas = new ScopeCanvas(this, attribList);
|
||||||
demodScopeTray->Add(scopeCanvas, 8, wxEXPAND | wxALL, 0);
|
demodScopeTray->Add(scopeCanvas, 8, wxEXPAND | wxALL, 0);
|
||||||
|
|
||||||
demodScopeTray->AddSpacer(1);
|
demodScopeTray->AddSpacer(1);
|
||||||
|
|
||||||
demodTuner = new TuningCanvas(this, NULL);
|
demodTuner = new TuningCanvas(this, attribList);
|
||||||
demodTuner->setHelpTip("Testing tuner");
|
demodTuner->setHelpTip("Testing tuner");
|
||||||
demodScopeTray->Add(demodTuner, 1, wxEXPAND | wxALL, 0);
|
demodScopeTray->Add(demodTuner, 1, wxEXPAND | wxALL, 0);
|
||||||
|
|
||||||
@ -91,18 +99,18 @@ wxFrame(NULL, wxID_ANY, CUBICSDR_TITLE), activeDemodulator(NULL) {
|
|||||||
|
|
||||||
demodTray->AddSpacer(1);
|
demodTray->AddSpacer(1);
|
||||||
|
|
||||||
demodGainMeter = new MeterCanvas(this, NULL);
|
demodGainMeter = new MeterCanvas(this, attribList);
|
||||||
demodGainMeter->setMax(2.0);
|
demodGainMeter->setMax(2.0);
|
||||||
demodGainMeter->setHelpTip("Current Demodulator Gain Level. Click / Drag to set Gain level.");
|
demodGainMeter->setHelpTip("Current Demodulator Gain Level. Click / Drag to set Gain level.");
|
||||||
demodTray->Add(demodGainMeter, 1, wxEXPAND | wxALL, 0);
|
demodTray->Add(demodGainMeter, 1, wxEXPAND | wxALL, 0);
|
||||||
|
|
||||||
vbox->Add(demodTray, 12, wxEXPAND | wxALL, 0);
|
vbox->Add(demodTray, 12, wxEXPAND | wxALL, 0);
|
||||||
vbox->AddSpacer(1);
|
vbox->AddSpacer(1);
|
||||||
spectrumCanvas = new SpectrumCanvas(this, NULL);
|
spectrumCanvas = new SpectrumCanvas(this, attribList);
|
||||||
spectrumCanvas->setup(2048);
|
spectrumCanvas->setup(2048);
|
||||||
vbox->Add(spectrumCanvas, 5, wxEXPAND | wxALL, 0);
|
vbox->Add(spectrumCanvas, 5, wxEXPAND | wxALL, 0);
|
||||||
vbox->AddSpacer(1);
|
vbox->AddSpacer(1);
|
||||||
waterfallCanvas = new WaterfallCanvas(this, NULL);
|
waterfallCanvas = new WaterfallCanvas(this, attribList);
|
||||||
waterfallCanvas->setup(2048, 512);
|
waterfallCanvas->setup(2048, 512);
|
||||||
waterfallCanvas->attachSpectrumCanvas(spectrumCanvas);
|
waterfallCanvas->attachSpectrumCanvas(spectrumCanvas);
|
||||||
waterfallCanvas->attachWaterfallCanvas(demodWaterfallCanvas);
|
waterfallCanvas->attachWaterfallCanvas(demodWaterfallCanvas);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
#include "wx/glcanvas.h"
|
#include "GLExt.h"
|
||||||
#include "PrimaryGLContext.h"
|
#include "PrimaryGLContext.h"
|
||||||
|
|
||||||
#include "ThreadQueue.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();
|
const wxSize ClientSize = GetClientSize();
|
||||||
|
|
||||||
glContext->SetCurrent(*this);
|
glContext->SetCurrent(*this);
|
||||||
|
initGLExtensions();
|
||||||
|
|
||||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||||
|
|
||||||
glContext->DrawBegin();
|
glContext->DrawBegin();
|
||||||
|
@ -50,6 +50,8 @@ void ModeSelectorCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
|||||||
const wxSize ClientSize = GetClientSize();
|
const wxSize ClientSize = GetClientSize();
|
||||||
|
|
||||||
glContext->SetCurrent(*this);
|
glContext->SetCurrent(*this);
|
||||||
|
initGLExtensions();
|
||||||
|
|
||||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||||
|
|
||||||
glContext->DrawBegin();
|
glContext->DrawBegin();
|
||||||
|
@ -67,6 +67,8 @@ void ScopeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
glContext->SetCurrent(*this);
|
glContext->SetCurrent(*this);
|
||||||
|
initGLExtensions();
|
||||||
|
|
||||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||||
|
|
||||||
glContext->DrawBegin();
|
glContext->DrawBegin();
|
||||||
|
@ -70,6 +70,8 @@ void SpectrumCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
|||||||
const wxSize ClientSize = GetClientSize();
|
const wxSize ClientSize = GetClientSize();
|
||||||
|
|
||||||
glContext->SetCurrent(*this);
|
glContext->SetCurrent(*this);
|
||||||
|
initGLExtensions();
|
||||||
|
|
||||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||||
|
|
||||||
glContext->BeginDraw(ThemeMgr::mgr.currentTheme->fftBackground.r, ThemeMgr::mgr.currentTheme->fftBackground.g, ThemeMgr::mgr.currentTheme->fftBackground.b);
|
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();
|
const wxSize ClientSize = GetClientSize();
|
||||||
|
|
||||||
glContext->SetCurrent(*this);
|
glContext->SetCurrent(*this);
|
||||||
|
initGLExtensions();
|
||||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||||
|
|
||||||
glContext->DrawBegin();
|
glContext->DrawBegin();
|
||||||
|
@ -116,7 +116,8 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
glContext->SetCurrent(*this);
|
glContext->SetCurrent(*this);
|
||||||
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
initGLExtensions();
|
||||||
|
glViewport(0, 0, ClientSize.x, ClientSize.y);
|
||||||
|
|
||||||
glContext->BeginDraw(0,0,0);
|
glContext->BeginDraw(0,0,0);
|
||||||
glContext->Draw(spectrum_points);
|
glContext->Draw(spectrum_points);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user