OpenRSP

An open-source driver stack for RSP-family SDR receivers

Compatibility

OpenRSP implements SDRplay API version 3.15 exactly. An application written for that API runs on OpenRSP without being recompiled, relinked or reconfigured.

What "drop-in" means here

Applications

Anything that uses SDRplay API 3.x should work, either directly or through SoapySDR. The following have been run against OpenRSP unchanged:

Deliberate differences

OpenRSP aims for no observable difference, with a short list of exceptions. Each one replaces a crash, a hang or unwanted behaviour in the proprietary stack:

AreaProprietary stackOpenRSP
NetworkThe service sends each device's serial number and chip ID to the vendor's server over plain HTTP.Never opens a network connection or looks up a host name, under any condition.
FirmwareUploads the vendor's closed bridge firmware.Uploads OpenRSP's own open-source firmware, with the same upload protocol. It fixes seven bugs found in the original.
Invalid call sequencesAbout a dozen out-of-order or invalid calls crash the library or the service.Returns an error code instead of crashing. All valid behaviour is unchanged.
Service stopped mid-streamThe client spins at 100% CPU forever.The client reports the device as removed and returns "service not responding".
Stopping the serviceSometimes ignores the stop request and hangs for 90 seconds.Stops promptly and cleanly.
AGC after a sample-rate changeUnder a particular timing the AGC stops working until the stream is restarted.The AGC carries on.
Android transfers(No Android support.)The Android driver uses USB bulk transfers at every rate, because many phone USB controllers drop high-bandwidth isochronous packets.

For application developers

Install OpenRSP from the Downloads page, then write against the standard API 3.15 headers as you would today. The same source code builds for Linux, Windows, macOS, Android and iPadOS. On Android, an app can either embed the driver or use the OpenRSP driver app, which owns the receiver and shares it with other apps; see Android & iPad.

#include <sdrplay_api.h>

sdrplay_api_Open();
sdrplay_api_LockDeviceApi();
sdrplay_api_GetDevices(devs, &numDevs, SDRPLAY_MAX_DEVICES);
sdrplay_api_SelectDevice(&devs[0]);
sdrplay_api_UnlockDeviceApi();
sdrplay_api_Init(devs[0].dev, &callbacks, NULL);   /* stream as usual */