<div dir="ltr">What's the "right way" to call rtlsdr_* functions while receiving samples via rtlsdr_read_async()?<div>e.g. to change frequency or gain mid-run.</div><div><br></div><div>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..</div><div><br></div><div>You can't call them from a separate thread because librtlsdr isn't threadsafe.</div><div><br></div><div>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..)</div><div><br></div><div>What's the right way to do this?</div><div><br></div><div>Oliver</div><div><br></div></div>