-
Notifications
You must be signed in to change notification settings - Fork 531
Description
For the WASM port, we need to ensure that there is no blocking on the main thread, otherwise SDRangel will hang.
This is described more in the Qt docs here https://doc.qt.io/qt-6/wasm.html under "Multithreading" and here in the Emscripten docs https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread
So far, I see two main areas that need to change in SDRangel:
- DSPDeviceSourceEngine::startAcquisition/stopAcquistion
When a device start button is pressed, DSPDeviceSourceEngine::startAcquisition is eventually called and is executed on the main/GUI thread. Its code blocks the thread until the device is started:
DSPAcquisitionStart cmd;
return m_syncMessenger.sendWait(cmd) == StRunning;
However, on WASM, USB devices will unable to start, because libusb calls get deferred to the main thread, so we get a deadlock.
As a workaround, it seems the blocking can be removed with:
DSPAcquisitionStart *cmd = new DSPAcquisitionStart();
m_inputMessageQueue.push(cmd);
return true;
and the RTLSDR driver (and a few others I've quickly looked at) don't appear to require it to block.
Removing this blocking would potentially have a small benefit for all platforms - as it would remove the small GUI freeze that can sometimes be seen when one device is already running and the start button is pressed on another device that takes a little while to initialize.
The above might not be the best way to implement this change - it's just the first thing I tried - and similar would also need to be implemented for TX and MIMO devices - and also for the stopAcquistion method.
- DeviceInput::applySettings
Currently DeviceInput::applySettings is also often called from the main/GUI thread, and the libusb calls result in a hang. I worked around this in RTLSDRInput::applySettings by moving all of the rtlsdr driver calls in to a separate thread. Similar would need to be done for other devices.
Again, this change is probably beneficial to all platforms, as discussed a while back in this issue: #1522