| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  | #ifndef MODULATOR_HPP__ | 
					
						
							|  |  |  | #define MODULATOR_HPP__ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QAudio> | 
					
						
							|  |  |  | #include <QPointer> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "AudioDevice.hpp" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SoundOutput; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Input device that generates PCM audio frames that encode a message | 
					
						
							|  |  |  | // and an optional CW ID. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Output can be muted while underway, preserving waveform timing when | 
					
						
							|  |  |  | // transmission is resumed. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | class Modulator | 
					
						
							|  |  |  |   : public AudioDevice | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Q_OBJECT; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   enum ModulatorState {Synchronizing, Active, Idle}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Modulator (unsigned frameRate, unsigned periodLengthInSeconds, QObject * parent = nullptr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void close () override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool isTuning () const {return m_tuning;} | 
					
						
							|  |  |  |   double frequency () const {return m_frequency;} | 
					
						
							|  |  |  |   bool isActive () const {return m_state != Idle;} | 
					
						
							|  |  |  |   void setSpread(double s) {m_fSpread=s;} | 
					
						
							| 
									
										
										
										
											2018-08-05 11:33:30 -04:00
										 |  |  |   void setTRPeriod(unsigned p) {m_period=p;} | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |   void set_nsym(int n) {m_symbolsLength=n;} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Q_SLOT void start (unsigned symbolsLength, double framesPerSymbol, double frequency, | 
					
						
							|  |  |  |                      double toneSpacing, SoundOutput *, Channel = Mono, | 
					
						
							|  |  |  |                      bool synchronize = true, bool fastMode = false, | 
					
						
							|  |  |  |                      double dBSNR = 99., int TRperiod=60); | 
					
						
							|  |  |  |   Q_SLOT void stop (bool quick = false); | 
					
						
							|  |  |  |   Q_SLOT void tune (bool newState = true); | 
					
						
							|  |  |  |   Q_SLOT void setFrequency (double newFrequency) {m_frequency = newFrequency;} | 
					
						
							|  |  |  |   Q_SIGNAL void stateChanged (ModulatorState) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  |   qint64 readData (char * data, qint64 maxSize) override; | 
					
						
							|  |  |  |   qint64 writeData (char const * /* data */, qint64 /* maxSize */) override | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return -1;			// we don't consume data | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   qint16 postProcessSample (qint16 sample) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   QPointer<SoundOutput> m_stream; | 
					
						
							|  |  |  |   bool m_quickClose; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   unsigned m_symbolsLength; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static double constexpr m_twoPi = 2.0 * 3.141592653589793238462; | 
					
						
							|  |  |  |   unsigned m_nspd = 2048 + 512; // CW ID WPM factor = 22.5 WPM | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   double m_phi; | 
					
						
							|  |  |  |   double m_dphi; | 
					
						
							|  |  |  |   double m_amp; | 
					
						
							|  |  |  |   double m_nsps; | 
					
						
							|  |  |  |   double volatile m_frequency; | 
					
						
							|  |  |  |   double m_frequency0; | 
					
						
							|  |  |  |   double m_snr; | 
					
						
							|  |  |  |   double m_fac; | 
					
						
							|  |  |  |   double m_toneSpacing; | 
					
						
							|  |  |  |   double m_fSpread; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   qint64 m_silentFrames; | 
					
						
							|  |  |  |   qint32 m_TRperiod; | 
					
						
							|  |  |  |   qint16 m_ramp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   unsigned m_frameRate; | 
					
						
							|  |  |  |   unsigned m_period; | 
					
						
							|  |  |  |   ModulatorState volatile m_state; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool volatile m_tuning; | 
					
						
							|  |  |  |   bool m_addNoise; | 
					
						
							|  |  |  |   bool m_bFastMode; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool m_cwLevel; | 
					
						
							|  |  |  |   unsigned m_ic; | 
					
						
							|  |  |  |   unsigned m_isym0; | 
					
						
							|  |  |  |   int m_j0; | 
					
						
							|  |  |  |   double m_toneFrequency0; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif |