void DSDDemod::applySettings(const DSDDemodSettings& settings, bool force) { qDebug() << "DSDDemod::applySettings: " << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset << " m_rfBandwidth: " << settings.m_rfBandwidth << " m_fmDeviation: " << settings.m_fmDeviation << " m_demodGain: " << settings.m_demodGain << " m_volume: " << settings.m_volume << " m_baudRate: " << settings.m_baudRate << " m_squelchGate" << settings.m_squelchGate << " m_squelch: " << settings.m_squelch << " m_audioMute: " << settings.m_audioMute << " m_enableCosineFiltering: " << settings.m_enableCosineFiltering << " m_syncOrConstellation: " << settings.m_syncOrConstellation << " m_slot1On: " << settings.m_slot1On << " m_slot2On: " << settings.m_slot2On << " m_tdmaStereo: " << settings.m_tdmaStereo << " m_pllLock: " << settings.m_pllLock << " m_highPassFilter: "<< settings.m_highPassFilter << " m_audioDeviceName: " << settings.m_audioDeviceName << " m_traceLengthMutliplier: " << settings.m_traceLengthMutliplier << " m_traceStroke: " << settings.m_traceStroke << " m_traceDecay: " << settings.m_traceDecay << " force: " << force; QList<QString> reverseAPIKeys; if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { reverseAPIKeys.append("inputFrequencyOffset"); } if ((settings.m_demodGain != m_settings.m_demodGain) || force) { reverseAPIKeys.append("demodGain"); } if ((settings.m_audioMute != m_settings.m_audioMute) || force) { reverseAPIKeys.append("audioMute"); } if ((settings.m_syncOrConstellation != m_settings.m_syncOrConstellation) || force) { reverseAPIKeys.append("syncOrConstellation"); } if ((settings.m_slot1On != m_settings.m_slot1On) || force) { reverseAPIKeys.append("slot1On"); } if ((settings.m_slot2On != m_settings.m_slot2On) || force) { reverseAPIKeys.append("slot2On"); } if ((settings.m_demodGain != m_settings.m_demodGain) || force) { reverseAPIKeys.append("demodGain"); } if ((settings.m_traceLengthMutliplier != m_settings.m_traceLengthMutliplier) || force) { reverseAPIKeys.append("traceLengthMutliplier"); } if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { reverseAPIKeys.append("rfBandwidth"); m_settingsMutex.lock(); m_interpolator.create(16, m_inputSampleRate, (settings.m_rfBandwidth) / 2.2); m_interpolatorDistanceRemain = 0; m_interpolatorDistance = (Real) m_inputSampleRate / (Real) 48000; //m_phaseDiscri.setFMScaling((float) settings.m_rfBandwidth / (float) settings.m_fmDeviation); m_settingsMutex.unlock(); } if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { reverseAPIKeys.append("fmDeviation"); m_phaseDiscri.setFMScaling(48000.0f / (2.0f*settings.m_fmDeviation)); } if ((settings.m_squelchGate != m_settings.m_squelchGate) || force) { reverseAPIKeys.append("squelchGate"); m_squelchGate = 480 * settings.m_squelchGate; // gate is given in 10s of ms at 48000 Hz audio sample rate m_squelchCount = 0; // reset squelch open counter } if ((settings.m_squelch != m_settings.m_squelch) || force) { reverseAPIKeys.append("squelch"); // input is a value in dB m_squelchLevel = std::pow(10.0, settings.m_squelch / 10.0); } if ((settings.m_volume != m_settings.m_volume) || force) { reverseAPIKeys.append("volume"); m_dsdDecoder.setAudioGain(settings.m_volume); } if ((settings.m_baudRate != m_settings.m_baudRate) || force) { reverseAPIKeys.append("baudRate"); m_dsdDecoder.setBaudRate(settings.m_baudRate); } if ((settings.m_enableCosineFiltering != m_settings.m_enableCosineFiltering) || force) { reverseAPIKeys.append("enableCosineFiltering"); m_dsdDecoder.enableCosineFiltering(settings.m_enableCosineFiltering); } if ((settings.m_tdmaStereo != m_settings.m_tdmaStereo) || force) { reverseAPIKeys.append("tdmaStereo"); m_dsdDecoder.setTDMAStereo(settings.m_tdmaStereo); } if ((settings.m_pllLock != m_settings.m_pllLock) || force) { reverseAPIKeys.append("pllLock"); m_dsdDecoder.setSymbolPLLLock(settings.m_pllLock); } if ((settings.m_highPassFilter != m_settings.m_highPassFilter) || force) { reverseAPIKeys.append("highPassFilter"); m_dsdDecoder.useHPMbelib(settings.m_highPassFilter); } if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) { reverseAPIKeys.append("audioDeviceName"); AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); audioDeviceManager->addAudioSink(&m_audioFifo1, getInputMessageQueue(), audioDeviceIndex); audioDeviceManager->addAudioSink(&m_audioFifo2, getInputMessageQueue(), audioDeviceIndex); uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); if (m_audioSampleRate != audioSampleRate) { applyAudioSampleRate(audioSampleRate); } } if (settings.m_useReverseAPI) { bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); } m_settings = settings; }