diff --git a/src/blackcore/afv/audio/callsignsampleprovider.cpp b/src/blackcore/afv/audio/callsignsampleprovider.cpp index c84e56432..999a69b16 100644 --- a/src/blackcore/afv/audio/callsignsampleprovider.cpp +++ b/src/blackcore/afv/audio/callsignsampleprovider.cpp @@ -11,6 +11,7 @@ #include "callsignsampleprovider.h" #include "callsigndelaycache.h" #include "blacksound/sampleprovider/samples.h" +#include "blackcore/afv/audio/receiversampleprovider.h" #include #include @@ -22,9 +23,10 @@ namespace BlackCore { namespace Audio { - CallsignSampleProvider::CallsignSampleProvider(const QAudioFormat &audioFormat, QObject *parent) : + CallsignSampleProvider::CallsignSampleProvider(const QAudioFormat &audioFormat, const CReceiverSampleProvider *receiver, QObject *parent) : ISampleProvider(parent), m_audioFormat(audioFormat), + m_receiver(receiver), m_decoder(audioFormat.sampleRate(), 1) { Q_ASSERT(audioFormat.channelCount() == 1); @@ -36,6 +38,9 @@ namespace BlackCore m_whiteNoise = new CResourceSoundSampleProvider(Samples::instance().whiteNoise(), m_mixer); m_whiteNoise->setLooping(true); m_whiteNoise->setGain(0.0); + m_hfWhiteNoise = new CResourceSoundSampleProvider(Samples::instance().hfWhiteNoise(), m_mixer); + m_hfWhiteNoise->setLooping(true); + m_hfWhiteNoise->setGain(0.0); m_acBusNoise = new CSawToothGenerator(400, m_mixer); m_audioInput = new CBufferedWaveProvider(audioFormat, m_mixer); @@ -48,6 +53,7 @@ namespace BlackCore m_mixer->addMixerInput(m_whiteNoise); m_mixer->addMixerInput(m_acBusNoise); + m_mixer->addMixerInput(m_hfWhiteNoise); m_mixer->addMixerInput(m_voiceEq); m_timer.setInterval(100); @@ -165,23 +171,41 @@ namespace BlackCore { m_crackleSoundProvider->setGain(0.0); m_whiteNoise->setGain(0.0); + m_hfWhiteNoise->setGain(0.0); m_acBusNoise->setGain(0.0); m_simpleCompressorEffect->setEnabled(false); m_voiceEq->setBypassEffects(true); } else { - double crackleFactor = static_cast(((qExp(m_distanceRatio) * qPow(m_distanceRatio, -4.0)) / 350) - 0.00776652); + if (m_receiver->getFrequencyHz() < 30000000) + { + float crackleFactor = (float)(((qExp(m_distanceRatio) * qPow(m_distanceRatio, -4.0)) / 350) - 0.00776652); - if (crackleFactor < 0.00) { crackleFactor = 0.0f; } - if (crackleFactor > 0.20) { crackleFactor = 0.20f; } + if (crackleFactor < 0.0f) { crackleFactor = 0.0f; } + if (crackleFactor > 0.20f) { crackleFactor = 0.20f; } - m_crackleSoundProvider->setGain(crackleFactor * 2); - m_whiteNoise->setGain(m_whiteNoiseGainMin); - m_acBusNoise->setGain(m_acBusGainMin); - m_simpleCompressorEffect->setEnabled(true); - m_voiceEq->setBypassEffects(false); - m_voiceEq->setOutputGain(1.0 - crackleFactor * 3.7); + m_hfWhiteNoise->setGain(m_hfWhiteNoiseGainMin); + m_acBusNoise->setGain(m_acBusGainMin + 0.001f); + m_simpleCompressorEffect->setEnabled(true); + m_voiceEq->setBypassEffects(false); + m_voiceEq->setOutputGain(0.38f); + m_whiteNoise->setGain(0.0); + } + else + { + float crackleFactor = (float)(((qExp(m_distanceRatio) * qPow(m_distanceRatio, -4.0)) / 350) - 0.00776652); + + if (crackleFactor < 0.0f) { crackleFactor = 0.0f; } + if (crackleFactor > 0.20f) { crackleFactor = 0.20f; } + + m_crackleSoundProvider->setGain(crackleFactor * 2); + m_whiteNoise->setGain(m_whiteNoiseGainMin); + m_acBusNoise->setGain(m_acBusGainMin); + m_simpleCompressorEffect->setEnabled(true); + m_voiceEq->setBypassEffects(false); + m_voiceEq->setOutputGain(1.0 - crackleFactor * 3.7); + } } } diff --git a/src/blackcore/afv/audio/callsignsampleprovider.h b/src/blackcore/afv/audio/callsignsampleprovider.h index cba72e79f..9a32bfd6c 100644 --- a/src/blackcore/afv/audio/callsignsampleprovider.h +++ b/src/blackcore/afv/audio/callsignsampleprovider.h @@ -33,6 +33,8 @@ namespace BlackCore { namespace Audio { + class CReceiverSampleProvider; + //! Callsign provide class CallsignSampleProvider : public BlackSound::SampleProvider::ISampleProvider { @@ -40,7 +42,7 @@ namespace BlackCore public: //! Ctor - CallsignSampleProvider(const QAudioFormat &audioFormat, QObject *parent = nullptr); + CallsignSampleProvider(const QAudioFormat &audioFormat, const BlackCore::Afv::Audio::CReceiverSampleProvider *receiver, QObject *parent = nullptr); int readSamples(QVector &samples, qint64 count) override; @@ -70,6 +72,7 @@ namespace BlackCore QAudioFormat m_audioFormat; const double m_whiteNoiseGainMin = 0.17; //0.01; + const double m_hfWhiteNoiseGainMin = 0.6; //0.01; const double m_acBusGainMin = 0.0028; //0.002; const int m_frameCount = 960; const int m_idleTimeoutMs = 500; @@ -82,9 +85,11 @@ namespace BlackCore float m_distanceRatio = 1.0; + const CReceiverSampleProvider *m_receiver = nullptr; BlackSound::SampleProvider::CMixingSampleProvider *m_mixer = nullptr; BlackSound::SampleProvider::CResourceSoundSampleProvider *m_crackleSoundProvider = nullptr; BlackSound::SampleProvider::CResourceSoundSampleProvider *m_whiteNoise = nullptr; + BlackSound::SampleProvider::CResourceSoundSampleProvider *m_hfWhiteNoise = nullptr; BlackSound::SampleProvider::CSawToothGenerator *m_acBusNoise = nullptr; BlackSound::SampleProvider::CSimpleCompressorEffect *m_simpleCompressorEffect = nullptr; BlackSound::SampleProvider::CEqualizerSampleProvider *m_voiceEq = nullptr; diff --git a/src/blackcore/afv/audio/receiversampleprovider.cpp b/src/blackcore/afv/audio/receiversampleprovider.cpp index a301f73ab..6b4ee5575 100644 --- a/src/blackcore/afv/audio/receiversampleprovider.cpp +++ b/src/blackcore/afv/audio/receiversampleprovider.cpp @@ -31,7 +31,7 @@ namespace BlackCore for (int i = 0; i < voiceInputNumber; i++) { - auto voiceInput = new CallsignSampleProvider(audioFormat, m_mixer); + auto voiceInput = new CallsignSampleProvider(audioFormat, this, m_mixer); m_voiceInputs.push_back(voiceInput); m_mixer->addMixerInput(voiceInput); } @@ -198,8 +198,10 @@ namespace BlackCore } } - - + uint CReceiverSampleProvider::getFrequencyHz() const + { + return m_frequencyHz; + } } // ns } // ns diff --git a/src/blackcore/afv/audio/receiversampleprovider.h b/src/blackcore/afv/audio/receiversampleprovider.h index 6378fd43f..6c055efbf 100644 --- a/src/blackcore/afv/audio/receiversampleprovider.h +++ b/src/blackcore/afv/audio/receiversampleprovider.h @@ -72,6 +72,9 @@ namespace BlackCore //! \remark those callsigns are transmitting and "I do receive them" const BlackMisc::Aviation::CCallsignSet &getReceivingCallsigns() { return m_receivingCallsigns; } + //! Get frequency in Hz + uint getFrequencyHz() const; + signals: //! Receving callsigns have changed void receivingCallsignsChanged(const TransceiverReceivingCallsignsChangedArgs &args); diff --git a/src/blackcore/afv/clients/afvclient.cpp b/src/blackcore/afv/clients/afvclient.cpp index 337981260..63774ebd3 100644 --- a/src/blackcore/afv/clients/afvclient.cpp +++ b/src/blackcore/afv/clients/afvclient.cpp @@ -93,7 +93,7 @@ namespace BlackCore if (m_connection->isConnected()) { emit this->connectionStatusChanged(Connected); } else { emit this->connectionStatusChanged(Disconnected); } - m_connection->getAllAliasedStations(); + m_aliasedStations = m_connection->getAllAliasedStations(); } void CAfvClient::disconnectFrom() @@ -225,6 +225,17 @@ namespace BlackCore // Fix rounding issues like 128074999 Hz -> 128075000 Hz quint32 roundedFrequencyHz = static_cast(qRound(frequencyHz / 1000.0)) * 1000; + auto it = std::find_if(m_aliasedStations.begin(), m_aliasedStations.end(), [roundedFrequencyHz](const StationDto & d) + { + return d.frequencyAlias == roundedFrequencyHz; + }); + + if (it != m_aliasedStations.end()) + { + qDebug() << "Aliasing" << frequencyHz << "Hz [VHF] to" << it->frequency << "Hz [HF]"; + roundedFrequencyHz = it->frequency; + } + if (m_transceivers.size() >= id + 1) { if (m_transceivers[id].frequencyHz != roundedFrequencyHz) diff --git a/src/blackcore/afv/clients/afvclient.h b/src/blackcore/afv/clients/afvclient.h index ae84d6434..5ade19ea5 100644 --- a/src/blackcore/afv/clients/afvclient.h +++ b/src/blackcore/afv/clients/afvclient.h @@ -232,6 +232,7 @@ namespace BlackCore QTimer m_voiceServerPositionTimer; QVector m_transceivers; QSet m_enabledTransceivers; + QVector m_aliasedStations; Audio::InputVolumeStreamArgs m_inputVolumeStream; Audio::OutputVolumeStreamArgs m_outputVolumeStream; diff --git a/src/blacksound/sampleprovider/samples.cpp b/src/blacksound/sampleprovider/samples.cpp index 9058db846..be979b67b 100644 --- a/src/blacksound/sampleprovider/samples.cpp +++ b/src/blacksound/sampleprovider/samples.cpp @@ -26,7 +26,8 @@ namespace BlackSound Samples::Samples() : m_crackle(CFileUtils::soundFilePathAndFileName(fnCrackle())), m_click(CFileUtils::soundFilePathAndFileName(fnClick())), - m_whiteNoise(CFileUtils::soundFilePathAndFileName(fnWhiteNoise())) + m_whiteNoise(CFileUtils::soundFilePathAndFileName(fnWhiteNoise())), + m_hfWhiteNoise(CFileUtils::soundFilePathAndFileName(fnHfWhiteNoise())) { this->initSounds(); } diff --git a/src/blacksound/sampleprovider/samples.h b/src/blacksound/sampleprovider/samples.h index b2ab2ef54..c107546be 100644 --- a/src/blacksound/sampleprovider/samples.h +++ b/src/blacksound/sampleprovider/samples.h @@ -36,6 +36,7 @@ namespace BlackSound const CResourceSound &crackle() const { return m_crackle; } const CResourceSound &click() const { return m_click; } const CResourceSound &whiteNoise() const { return m_whiteNoise; } + const CResourceSound hfWhiteNoise() const { return m_hfWhiteNoise; } //! @} //! Play the click sound @@ -45,6 +46,7 @@ namespace BlackSound static const QString &fnCrackle() { static const QString f = "afv_crackle_f32.wav"; return f; } static const QString &fnClick() { static const QString f = "afv_click_f32.wav"; return f; } static const QString &fnWhiteNoise() { static const QString f = "afv_whitenoise_f32.wav"; return f; } + static const QString &fnHfWhiteNoise() { static const QString f = "afv_hf_whiteNoise_f32.wav"; return f; } //! @} private: @@ -54,6 +56,7 @@ namespace BlackSound CResourceSound m_crackle; CResourceSound m_click; CResourceSound m_whiteNoise; + CResourceSound m_hfWhiteNoise; BlackMisc::CSetting m_audioSettings { this, &Samples::onSettingsChanged }; diff --git a/src/blacksound/share/sounds/afv_hf_whiteNoise_f32.wav b/src/blacksound/share/sounds/afv_hf_whiteNoise_f32.wav new file mode 100644 index 000000000..64b53ee65 Binary files /dev/null and b/src/blacksound/share/sounds/afv_hf_whiteNoise_f32.wav differ