What's the "right way" to call rtlsdr_* functions while receiving samples via rtlsdr_read_async()? e.g. to change frequency or gain mid-run.
You can't call them directly from the async callback as you're within a libusb callback at that point and libusb will self-deadlock if you do anything that needs a synchronous transfer. Plus even without the self-deadlock you really don't want a recursive callback happening if another bulk transfer turns up..
You can't call them from a separate thread because librtlsdr isn't threadsafe.
The only way I've found that's reliable is to call rtlsdr_cancel_async() from within the async callback, wait for rtlsdr_read_async() to return, do your work, then call rtlsdr_read_async() again. This is ugly and can drop samples. rtlsdr_read_async() is also a bit buggy in that sometimes it will take up to a second after cancellation has completed before it returns (it calls into libusb to handle more events even if all xfers have completed cancellation, and then you've got to wait for that to time out..)
What's the right way to do this?
Oliver
On 15 February 2015 at 13:38, Oliver Jowett oliver.jowett@gmail.com wrote:
What's the "right way" to call rtlsdr_* functions while receiving samples via rtlsdr_read_async()? e.g. to change frequency or gain mid-run.
Some work in this area:
https://github.com/mutability/librtlsdr/tree/async-rearrangements - Rearranging rtlsdr_read_async() so that rtlsdr callbacks are not done from within the libusb callback. This allows you to safely call rtlsdr_* from within the async callback.
https://github.com/mutability/librtlsdr/tree/thread-safety - makes device access threadsafe (in theory), so you can safely call rtlsdr_* from multiple threads (including while rtlsdr_read_async is running)
Oliver