After _recover_capture reopens the microphone, _run left self._cap pointing at the closed capture, so _halt_thread could no longer abort a blocking read wedged in the reopened stream. Re-arm self._cap on every successful recovery.
After _recover_capture reopens the microphone, _run left self._cap pointing at the closed capture, so _halt_thread could no longer abort a blocking read wedged in the reopened stream. Re-arm self._cap on every successful recovery.