#ifndef MODULATOR_HPP__ #define MODULATOR_HPP__ #include #include #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;} void setPeriod(unsigned p) {m_period=p;} 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 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