From bd67d553ea7fcc41be85e5467e01cfe6dc3e7d48 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 1 Nov 2024 10:32:39 +0100 Subject: [PATCH] Main server: wait for set sample source/sink/MIMO to complete before loading the device settings. For #2294 --- sdrsrv/mainserver.cpp | 51 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/sdrsrv/mainserver.cpp b/sdrsrv/mainserver.cpp index ae6ed5e0e..4e517ecac 100644 --- a/sdrsrv/mainserver.cpp +++ b/sdrsrv/mainserver.cpp @@ -495,11 +495,20 @@ void MainServer::changeSampleSource(int deviceSetIndex, int selectedDeviceIndex) DeviceSampleSource *source = deviceSet->m_deviceAPI->getPluginInterface()->createSampleSourcePluginInstance( deviceSet->m_deviceAPI->getSamplingDeviceId(), deviceSet->m_deviceAPI); deviceSet->m_deviceAPI->setSampleSource(source); - - deviceSet->m_deviceAPI->loadSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // load new API settings - - // Notify - emit m_mainCore->deviceChanged(deviceSetIndex); + // wait for sample source to be set, before loading settings + auto connection = new QMetaObject::Connection(); + *connection = connect( + deviceSet->m_deviceSourceEngine, + &DSPDeviceSourceEngine::sampleSet, + this, + [=]() { + deviceSet->m_deviceAPI->loadSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // load new API settings + // Notify + emit m_mainCore->deviceChanged(deviceSetIndex); + QObject::disconnect(*connection); + delete connection; + } + ); } } @@ -566,8 +575,20 @@ void MainServer::changeSampleSink(int deviceSetIndex, int selectedDeviceIndex) DeviceSampleSink *sink = deviceSet->m_deviceAPI->getPluginInterface()->createSampleSinkPluginInstance( deviceSet->m_deviceAPI->getSamplingDeviceId(), deviceSet->m_deviceAPI); deviceSet->m_deviceAPI->setSampleSink(sink); - - deviceSet->m_deviceAPI->loadSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // load new API settings + // wait for sample source to be set, before loading settings + auto connection = new QMetaObject::Connection(); + *connection = connect( + deviceSet->m_deviceSourceEngine, + &DSPDeviceSourceEngine::sampleSet, + this, + [=]() { + deviceSet->m_deviceAPI->loadSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // load new API settings + // Notify + emit m_mainCore->deviceChanged(deviceSetIndex); + QObject::disconnect(*connection); + delete connection; + } + ); } } @@ -620,8 +641,20 @@ void MainServer::changeSampleMIMO(int deviceSetIndex, int selectedDeviceIndex) DeviceSampleMIMO *mimo = deviceSet->m_deviceAPI->getPluginInterface()->createSampleMIMOPluginInstance( deviceSet->m_deviceAPI->getSamplingDeviceId(), deviceSet->m_deviceAPI); deviceSet->m_deviceAPI->setSampleMIMO(mimo); - - deviceSet->m_deviceAPI->loadSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // load new API settings + // wait for sample source to be set, before loading settings + auto connection = new QMetaObject::Connection(); + *connection = connect( + deviceSet->m_deviceSourceEngine, + &DSPDeviceSourceEngine::sampleSet, + this, + [=]() { + deviceSet->m_deviceAPI->loadSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // load new API settings + // Notify + emit m_mainCore->deviceChanged(deviceSetIndex); + QObject::disconnect(*connection); + delete connection; + } + ); } }