diff --git a/plugins/channeltx/modam/ammod.cpp b/plugins/channeltx/modam/ammod.cpp index fb0f141a2..03dbbf4fc 100644 --- a/plugins/channeltx/modam/ammod.cpp +++ b/plugins/channeltx/modam/ammod.cpp @@ -35,7 +35,11 @@ MESSAGE_CLASS_DEFINITION(AMMod::MsgReportFileSourceStreamTiming, Message) AMMod::AMMod() : - m_settingsMutex(QMutex::Recursive) + m_settingsMutex(QMutex::Recursive), + m_fileSize(0), + m_recordLength(0), + m_sampleRate(48000), + m_afInput(AMModInputNone) { setObjectName("AMMod"); @@ -56,17 +60,20 @@ AMMod::AMMod() : m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_config.m_audioSampleRate); - - m_afInput = AMModInputNone; } AMMod::~AMMod() { } -void AMMod::configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, float modFactor, bool audioMute) +void AMMod::configure(MessageQueue* messageQueue, + Real rfBandwidth, + Real afBandwidth, + float modFactor, + bool audioMute, + bool playLoop) { - Message* cmd = MsgConfigureAMMod::create(rfBandwidth, afBandwidth, modFactor, audioMute); + Message* cmd = MsgConfigureAMMod::create(rfBandwidth, afBandwidth, modFactor, audioMute, playLoop); messageQueue->push(cmd); } @@ -127,13 +134,23 @@ void AMMod::pullAF(Real& sample) // ffplay -f f32le -ar 48k -ac 1 f4exb_call.raw if (m_ifstream.is_open()) { - if (m_ifstream.eof()) // TODO: handle loop playback situation + if (m_ifstream.eof()) { - m_ifstream.clear(); - m_ifstream.seekg(0, std::ios::beg); + if (m_running.m_playLoop) + { + m_ifstream.clear(); + m_ifstream.seekg(0, std::ios::beg); + } } - m_ifstream.read(reinterpret_cast(&sample), sizeof(Real)); + if (m_ifstream.eof()) + { + sample = 0.0f; + } + else + { + m_ifstream.read(reinterpret_cast(&sample), sizeof(Real)); + } } else { @@ -189,6 +206,7 @@ bool AMMod::handleMessage(const Message& cmd) m_config.m_afBandwidth = cfg.getAFBandwidth(); m_config.m_modFactor = cfg.getModFactor(); m_config.m_audioMute = cfg.getAudioMute(); + m_config.m_playLoop = cfg.getPlayLoop(); apply(); @@ -196,7 +214,8 @@ bool AMMod::handleMessage(const Message& cmd) << " m_rfBandwidth: " << m_config.m_rfBandwidth << " m_afBandwidth: " << m_config.m_afBandwidth << " m_modFactor: " << m_config.m_modFactor - << " m_audioMute: " << m_config.m_audioMute; + << " m_audioMute: " << m_config.m_audioMute + << " m_playLoop: " << m_config.m_playLoop; return true; } @@ -224,8 +243,15 @@ bool AMMod::handleMessage(const Message& cmd) } else if (MsgConfigureFileSourceStreamTiming::match(cmd)) { - std::size_t samplesCount = m_ifstream.tellg() / sizeof(Real); - MsgReportFileSourceStreamTiming *report; + std::size_t samplesCount; + + if (m_ifstream.eof()) { + samplesCount = m_fileSize / sizeof(Real); + } else { + samplesCount = m_ifstream.tellg() / sizeof(Real); + } + + MsgReportFileSourceStreamTiming *report; report = MsgReportFileSourceStreamTiming::create(samplesCount); getOutputMessageQueue()->push(report); @@ -274,6 +300,7 @@ void AMMod::apply() m_running.m_modFactor = m_config.m_modFactor; m_running.m_audioSampleRate = m_config.m_audioSampleRate; m_running.m_audioMute = m_config.m_audioMute; + m_running.m_playLoop = m_config.m_playLoop; } void AMMod::openFileStream() @@ -283,14 +310,14 @@ void AMMod::openFileStream() } m_ifstream.open(m_fileName.toStdString().c_str(), std::ios::binary | std::ios::ate); - quint64 fileSize = m_ifstream.tellg(); + m_fileSize = m_ifstream.tellg(); m_ifstream.seekg(0,std::ios_base::beg); m_sampleRate = 48000; // fixed rate - m_recordLength = fileSize / (sizeof(Real) * m_sampleRate); + m_recordLength = m_fileSize / (sizeof(Real) * m_sampleRate); qDebug() << "AMMod::openFileStream: " << m_fileName.toStdString().c_str() - << " fileSize: " << fileSize << "bytes" + << " fileSize: " << m_fileSize << "bytes" << " length: " << m_recordLength << " seconds"; MsgReportFileSourceStreamData *report; diff --git a/plugins/channeltx/modam/ammod.h b/plugins/channeltx/modam/ammod.h index 1a261a0b6..d5e714b6b 100644 --- a/plugins/channeltx/modam/ammod.h +++ b/plugins/channeltx/modam/ammod.h @@ -174,7 +174,7 @@ public: AMMod(); ~AMMod(); - void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, float modFactor, bool audioMute); + void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, float modFactor, bool audioMute, bool playLoop); virtual void pull(Sample& sample); virtual void start(); @@ -193,10 +193,11 @@ private: Real getAFBandwidth() const { return m_afBandwidth; } float getModFactor() const { return m_modFactor; } bool getAudioMute() const { return m_audioMute; } + bool getPlayLoop() const { return m_playLoop; } - static MsgConfigureAMMod* create(Real rfBandwidth, Real afBandwidth, float modFactor, bool audioMute) + static MsgConfigureAMMod* create(Real rfBandwidth, Real afBandwidth, float modFactor, bool audioMute, bool playLoop) { - return new MsgConfigureAMMod(rfBandwidth, afBandwidth, modFactor, audioMute); + return new MsgConfigureAMMod(rfBandwidth, afBandwidth, modFactor, audioMute, playLoop); } private: @@ -204,13 +205,15 @@ private: Real m_afBandwidth; float m_modFactor; bool m_audioMute; + bool m_playLoop; - MsgConfigureAMMod(Real rfBandwidth, Real afBandwidth, float modFactor, bool audioMute) : + MsgConfigureAMMod(Real rfBandwidth, Real afBandwidth, float modFactor, bool audioMute, bool playLoop) : Message(), m_rfBandwidth(rfBandwidth), m_afBandwidth(afBandwidth), m_modFactor(modFactor), - m_audioMute(audioMute) + m_audioMute(audioMute), + m_playLoop(playLoop) { } }; @@ -235,6 +238,7 @@ private: float m_modFactor; quint32 m_audioSampleRate; bool m_audioMute; + bool m_playLoop; Config() : m_outputSampleRate(-1), @@ -243,7 +247,8 @@ private: m_afBandwidth(-1), m_modFactor(0.2f), m_audioSampleRate(0), - m_audioMute(false) + m_audioMute(false), + m_playLoop(false) { } }; @@ -274,6 +279,7 @@ private: std::ifstream m_ifstream; QString m_fileName; + quint64 m_fileSize; //!< raw file size (bytes) quint32 m_recordLength; //!< record length in seconds computed from file size int m_sampleRate; diff --git a/plugins/channeltx/modam/ammodgui.cpp b/plugins/channeltx/modam/ammodgui.cpp index 4ef32d544..dc3045531 100644 --- a/plugins/channeltx/modam/ammodgui.cpp +++ b/plugins/channeltx/modam/ammodgui.cpp @@ -74,7 +74,7 @@ void AMModGUI::resetToDefaults() { blockApplySettings(true); - ui->rfBW->setValue(4); + ui->rfBW->setValue(6); ui->afBW->setValue(3); ui->modPercent->setValue(20); ui->deltaFrequency->setValue(0); @@ -226,7 +226,7 @@ void AMModGUI::on_audioMute_toggled(bool checked) void AMModGUI::on_playLoop_toggled(bool checked) { - // TODO: do something about it! + applySettings(); } void AMModGUI::on_play_toggled(bool checked) @@ -391,7 +391,8 @@ void AMModGUI::applySettings() m_rfBW[ui->rfBW->value()], ui->afBW->value() * 1000.0, ui->modPercent->value() / 100.0f, - ui->audioMute->isChecked()); + ui->audioMute->isChecked(), + ui->playLoop->isChecked()); } }