From db3375ca3edc1e5cca48dab2815a19c4c6ed0e36 Mon Sep 17 00:00:00 2001 From: f4exb Date: Wed, 14 Dec 2016 13:52:46 +0100 Subject: [PATCH] SSB Modulator: implemented audio mute, binaural and flip channels --- plugins/channeltx/modssb/ssbmod.cpp | 59 +++++++++++++++++++++++--- plugins/channeltx/modssb/ssbmodgui.cpp | 10 +++++ plugins/channeltx/modssb/ssbmodgui.h | 2 + 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/plugins/channeltx/modssb/ssbmod.cpp b/plugins/channeltx/modssb/ssbmod.cpp index dc3183008..b44056a50 100644 --- a/plugins/channeltx/modssb/ssbmod.cpp +++ b/plugins/channeltx/modssb/ssbmod.cpp @@ -189,6 +189,13 @@ void SSBMod::modulateSample() void SSBMod::pullAF(Complex& sample) { + if (m_running.m_audioMute) + { + sample.real(0.0f); + sample.imag(0.0f); + return; + } + int16_t audioSample[2]; Complex ci; fftfilt::cmplx *filtered; @@ -216,8 +223,12 @@ void SSBMod::pullAF(Complex& sample) } break; case SSBModInputFile: + // Monaural (mono): // sox f4exb_call.wav --encoding float --endian little f4exb_call.raw // ffplay -f f32le -ar 48k -ac 1 f4exb_call.raw + // Binaural (stereo): + // sox f4exb_call.wav --encoding float --endian little f4exb_call.raw + // ffplay -f f32le -ar 48k -ac 2 f4exb_call.raw if (m_ifstream.is_open()) { if (m_ifstream.eof()) @@ -236,10 +247,28 @@ void SSBMod::pullAF(Complex& sample) } else { - Real real; - m_ifstream.read(reinterpret_cast(&real), sizeof(Real)); - ci.real(real * m_running.m_volumeFactor); - ci.imag(0.0f); + if (m_running.m_audioBinaural) + { + Complex c; + m_ifstream.read(reinterpret_cast(&c), sizeof(Complex)); + + if (m_running.m_audioFlipChannels) + { + ci.real(c.imag() * m_running.m_volumeFactor); + ci.imag(c.real() * m_running.m_volumeFactor); + } + else + { + ci = c * m_running.m_volumeFactor; + } + } + else + { + Real real; + m_ifstream.read(reinterpret_cast(&real), sizeof(Real)); + ci.real(real * m_running.m_volumeFactor); + ci.imag(0.0f); + } } } else @@ -250,8 +279,26 @@ void SSBMod::pullAF(Complex& sample) break; case SSBModInputAudio: m_audioFifo.read(reinterpret_cast(audioSample), 1, 10); - ci.real(((audioSample[0] + audioSample[1]) / 65536.0f) * m_running.m_volumeFactor); - ci.imag(0.0f); + + if (m_running.m_audioBinaural) + { + if (m_running.m_audioFlipChannels) + { + ci.real((audioSample[1] / 32768.0f) * m_running.m_volumeFactor); + ci.imag((audioSample[0] / 32768.0f) * m_running.m_volumeFactor); + } + else + { + ci.real((audioSample[0] / 32768.0f) * m_running.m_volumeFactor); + ci.imag((audioSample[1] / 32768.0f) * m_running.m_volumeFactor); + } + } + else + { + ci.real(((audioSample[0] + audioSample[1]) / 65536.0f) * m_running.m_volumeFactor); + ci.imag(0.0f); + } + break; case SSBModInputCWTone: if (m_cwKeyer.getSample()) diff --git a/plugins/channeltx/modssb/ssbmodgui.cpp b/plugins/channeltx/modssb/ssbmodgui.cpp index d8652a3c9..460072e33 100644 --- a/plugins/channeltx/modssb/ssbmodgui.cpp +++ b/plugins/channeltx/modssb/ssbmodgui.cpp @@ -264,6 +264,16 @@ void SSBModGUI::on_dsb_toggled(bool checked) setNewRate(m_spanLog2); } +void SSBModGUI::on_audioBinaural_toggled(bool checked) +{ + applySettings(); +} + +void SSBModGUI::on_audioFlipChannels_toggled(bool checked) +{ + applySettings(); +} + void SSBModGUI::on_spanLog2_valueChanged(int value) { if (setNewRate(value)) diff --git a/plugins/channeltx/modssb/ssbmodgui.h b/plugins/channeltx/modssb/ssbmodgui.h index 03e2f8968..b9b61089c 100644 --- a/plugins/channeltx/modssb/ssbmodgui.h +++ b/plugins/channeltx/modssb/ssbmodgui.h @@ -62,6 +62,8 @@ private slots: void on_deltaFrequency_changed(quint64 value); void on_deltaMinus_toggled(bool minus); void on_dsb_toggled(bool checked); + void on_audioBinaural_toggled(bool checked); + void on_audioFlipChannels_toggled(bool checked); void on_spanLog2_valueChanged(int value); void on_BW_valueChanged(int value); void on_lowCut_valueChanged(int value);