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 "pskcoeff.h" | ||||
| #include "pskvaricode.h" | ||||
| #include "viewpsk.h" | ||||
| #include "pskeval.h" | ||||
| 
 | ||||
| //=====================================================================
 | ||||
| #define	PskSampleRate	(8000) | ||||
|  | @ -87,6 +89,9 @@ private: | |||
| 	complex			quality; | ||||
| 	int				acquire; | ||||
| 
 | ||||
| 	viewpsk*		pskviewer; | ||||
| 	pskeval*		evalpsk; | ||||
| 
 | ||||
| 	void			rx_symbol(complex symbol); | ||||
| 	void 			rx_bit(int bit); | ||||
| 	void			rx_qpsk(int bits); | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ | |||
| #include "trx.h" | ||||
| #include "filters.h" | ||||
| #include "fldigi-config.h" | ||||
| #include "pskeval.h" | ||||
| 
 | ||||
| //=====================================================================
 | ||||
| #define	VPSKSAMPLERATE	(8000) | ||||
|  | @ -69,6 +70,8 @@ private: | |||
| 	time_t			now; | ||||
| 	time_t			timeout[MAXCHANNELS]; | ||||
| 
 | ||||
| 	pskeval*		evalpsk; | ||||
| 
 | ||||
| 	void			rx_symbol(int ch, complex symbol); | ||||
| 	void 			rx_bit(int ch, int bit); | ||||
| 
 | ||||
|  | @ -76,7 +79,7 @@ private: | |||
| 	void			afc(int); | ||||
| 	 | ||||
| public: | ||||
| 	viewpsk(trx_mode mode); | ||||
| 	viewpsk(pskeval* eval, trx_mode mode); | ||||
| 	~viewpsk(); | ||||
| 	void init(); | ||||
| 	void restart(trx_mode mode); | ||||
|  |  | |||
|  | @ -60,7 +60,6 @@ extern waterfall *wf; | |||
| 
 | ||||
| char pskmsg[80]; | ||||
| viewpsk *pskviewer = (viewpsk *)0; | ||||
| pskeval *evalpsk = (pskeval *)0; | ||||
| 
 | ||||
| void psk::tx_init(SoundBase *sc) | ||||
| { | ||||
|  | @ -92,9 +91,7 @@ void psk::rx_init() | |||
| 
 | ||||
| void psk::restart() | ||||
| { | ||||
| 	if (!pskviewer) pskviewer = new viewpsk(mode); | ||||
| 	else		    pskviewer->restart(mode); | ||||
| 	if (!evalpsk) evalpsk = new pskeval; | ||||
| 	pskviewer->restart(mode); | ||||
| 	evalpsk->setbw(bandwidth); | ||||
| } | ||||
| 
 | ||||
|  | @ -118,6 +115,10 @@ psk::~psk() | |||
| 	if (fir2) delete fir2; | ||||
| 	if (snfilt) delete snfilt; | ||||
| 	if (imdfilt) delete imdfilt; | ||||
| 	if (::pskviewer == pskviewer) | ||||
| 		::pskviewer = 0; | ||||
| 	delete pskviewer; | ||||
| 	delete evalpsk; | ||||
| } | ||||
| 
 | ||||
| psk::psk(trx_mode pskmode) : modem() | ||||
|  | @ -236,6 +237,9 @@ psk::psk(trx_mode pskmode) : modem() | |||
| 	E1 = E2 = E3 = 0.0; | ||||
| 	acquire = 0; | ||||
| 
 | ||||
| 	evalpsk = new pskeval; | ||||
| 	::pskviewer = pskviewer = new viewpsk(evalpsk, mode); | ||||
| 
 | ||||
| 	init(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -43,20 +43,20 @@ | |||
| #include "qrunner.h" | ||||
| 
 | ||||
| extern waterfall *wf; | ||||
| extern pskeval *evalpsk; | ||||
| 
 | ||||
| //=====================================================================
 | ||||
| // Change the following for DCD low pass filter adjustment
 | ||||
| #define SQLCOEFF 0.01 | ||||
| //=====================================================================
 | ||||
| 
 | ||||
| viewpsk::viewpsk(trx_mode pskmode) | ||||
| viewpsk::viewpsk(pskeval* eval, trx_mode pskmode) | ||||
| { | ||||
| 	for (int i = 0; i < MAXCHANNELS; i++) { | ||||
| 		fir1[i] = (C_FIR_filter *)0; | ||||
| 		fir2[i] = (C_FIR_filter *)0; | ||||
| 	} | ||||
| 
 | ||||
| 	evalpsk = eval; | ||||
| 	viewmode = MODE_PREV;	 | ||||
| 	restart(pskmode); | ||||
| } | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Stelios Bounanos
						Stelios Bounanos