mirror of
				https://github.com/cjcliffe/CubicSDR.git
				synced 2025-11-03 21:20:21 -05: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,6 +116,7 @@ void WaterfallCanvas::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->BeginDraw(0,0,0);
 | 
					    glContext->BeginDraw(0,0,0);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user