kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Fix PSK viewer crash
The psk ctor was calling psk::restart() which in turn called the global pskviewer's restart(), possibly deallocating memory in use by another psk instance. This would happen when changing PSK modes with the Viewer window visible, as a new modem is constructed before the old one is destroyed. Add a psk class viewpsk member and make the global pskviewer point to it.pull/2/head
rodzic
708ac48c3f
commit
433a3c5629
|
|
@ -31,6 +31,8 @@
|
||||||
#include "filters.h"
|
#include "filters.h"
|
||||||
#include "pskcoeff.h"
|
#include "pskcoeff.h"
|
||||||
#include "pskvaricode.h"
|
#include "pskvaricode.h"
|
||||||
|
#include "viewpsk.h"
|
||||||
|
#include "pskeval.h"
|
||||||
|
|
||||||
//=====================================================================
|
//=====================================================================
|
||||||
#define PskSampleRate (8000)
|
#define PskSampleRate (8000)
|
||||||
|
|
@ -87,6 +89,9 @@ private:
|
||||||
complex quality;
|
complex quality;
|
||||||
int acquire;
|
int acquire;
|
||||||
|
|
||||||
|
viewpsk* pskviewer;
|
||||||
|
pskeval* evalpsk;
|
||||||
|
|
||||||
void rx_symbol(complex symbol);
|
void rx_symbol(complex symbol);
|
||||||
void rx_bit(int bit);
|
void rx_bit(int bit);
|
||||||
void rx_qpsk(int bits);
|
void rx_qpsk(int bits);
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
#include "trx.h"
|
#include "trx.h"
|
||||||
#include "filters.h"
|
#include "filters.h"
|
||||||
#include "fldigi-config.h"
|
#include "fldigi-config.h"
|
||||||
|
#include "pskeval.h"
|
||||||
|
|
||||||
//=====================================================================
|
//=====================================================================
|
||||||
#define VPSKSAMPLERATE (8000)
|
#define VPSKSAMPLERATE (8000)
|
||||||
|
|
@ -69,6 +70,8 @@ private:
|
||||||
time_t now;
|
time_t now;
|
||||||
time_t timeout[MAXCHANNELS];
|
time_t timeout[MAXCHANNELS];
|
||||||
|
|
||||||
|
pskeval* evalpsk;
|
||||||
|
|
||||||
void rx_symbol(int ch, complex symbol);
|
void rx_symbol(int ch, complex symbol);
|
||||||
void rx_bit(int ch, int bit);
|
void rx_bit(int ch, int bit);
|
||||||
|
|
||||||
|
|
@ -76,7 +79,7 @@ private:
|
||||||
void afc(int);
|
void afc(int);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
viewpsk(trx_mode mode);
|
viewpsk(pskeval* eval, trx_mode mode);
|
||||||
~viewpsk();
|
~viewpsk();
|
||||||
void init();
|
void init();
|
||||||
void restart(trx_mode mode);
|
void restart(trx_mode mode);
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,6 @@ extern waterfall *wf;
|
||||||
|
|
||||||
char pskmsg[80];
|
char pskmsg[80];
|
||||||
viewpsk *pskviewer = (viewpsk *)0;
|
viewpsk *pskviewer = (viewpsk *)0;
|
||||||
pskeval *evalpsk = (pskeval *)0;
|
|
||||||
|
|
||||||
void psk::tx_init(SoundBase *sc)
|
void psk::tx_init(SoundBase *sc)
|
||||||
{
|
{
|
||||||
|
|
@ -92,9 +91,7 @@ void psk::rx_init()
|
||||||
|
|
||||||
void psk::restart()
|
void psk::restart()
|
||||||
{
|
{
|
||||||
if (!pskviewer) pskviewer = new viewpsk(mode);
|
pskviewer->restart(mode);
|
||||||
else pskviewer->restart(mode);
|
|
||||||
if (!evalpsk) evalpsk = new pskeval;
|
|
||||||
evalpsk->setbw(bandwidth);
|
evalpsk->setbw(bandwidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -118,6 +115,10 @@ psk::~psk()
|
||||||
if (fir2) delete fir2;
|
if (fir2) delete fir2;
|
||||||
if (snfilt) delete snfilt;
|
if (snfilt) delete snfilt;
|
||||||
if (imdfilt) delete imdfilt;
|
if (imdfilt) delete imdfilt;
|
||||||
|
if (::pskviewer == pskviewer)
|
||||||
|
::pskviewer = 0;
|
||||||
|
delete pskviewer;
|
||||||
|
delete evalpsk;
|
||||||
}
|
}
|
||||||
|
|
||||||
psk::psk(trx_mode pskmode) : modem()
|
psk::psk(trx_mode pskmode) : modem()
|
||||||
|
|
@ -235,7 +236,10 @@ psk::psk(trx_mode pskmode) : modem()
|
||||||
syncbuf[i] = 0.0;
|
syncbuf[i] = 0.0;
|
||||||
E1 = E2 = E3 = 0.0;
|
E1 = E2 = E3 = 0.0;
|
||||||
acquire = 0;
|
acquire = 0;
|
||||||
|
|
||||||
|
evalpsk = new pskeval;
|
||||||
|
::pskviewer = pskviewer = new viewpsk(evalpsk, mode);
|
||||||
|
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,20 +43,20 @@
|
||||||
#include "qrunner.h"
|
#include "qrunner.h"
|
||||||
|
|
||||||
extern waterfall *wf;
|
extern waterfall *wf;
|
||||||
extern pskeval *evalpsk;
|
|
||||||
|
|
||||||
//=====================================================================
|
//=====================================================================
|
||||||
// Change the following for DCD low pass filter adjustment
|
// Change the following for DCD low pass filter adjustment
|
||||||
#define SQLCOEFF 0.01
|
#define SQLCOEFF 0.01
|
||||||
//=====================================================================
|
//=====================================================================
|
||||||
|
|
||||||
viewpsk::viewpsk(trx_mode pskmode)
|
viewpsk::viewpsk(pskeval* eval, trx_mode pskmode)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAXCHANNELS; i++) {
|
for (int i = 0; i < MAXCHANNELS; i++) {
|
||||||
fir1[i] = (C_FIR_filter *)0;
|
fir1[i] = (C_FIR_filter *)0;
|
||||||
fir2[i] = (C_FIR_filter *)0;
|
fir2[i] = (C_FIR_filter *)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
evalpsk = eval;
|
||||||
viewmode = MODE_PREV;
|
viewmode = MODE_PREV;
|
||||||
restart(pskmode);
|
restart(pskmode);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Ładowanie…
Reference in New Issue