Reading from I2S using Adafruit_ZeroI2S
enableRx throughout the repository (and also on the Web) effectively just yields the results Search · enableRx · GitHub, pointing to the dma_passthrough.ino example file.
This effectively will also pull in the ZeroDMA library, which actually does not sound bad either.
If you want to actually follow this route: My plan would be to produce a minimum working example by stripping all tx-related things from dma_passthrough.ino and then try to mix in some details from zerodma_memcpy.ino to actually synchronize your code with the DMA transfer and being able to actually do something with the data after the transfer completed.
By working on that level, you see that you are more directly working with the hardware there: I believe the ArduinoSound library already implements things like double buffering on top of that (which is where things are currently going wrong with your setup re. the observed starvation/stalling behavior).
On the other hand, you might detour to a completely different route. We will be happy to hear about your next findings and observations.
P.S.: Saying that, reading about DMA I2S callback not triggering at high frequency · Issue #294 · arduino/ArduinoCore-samd · GitHub and having a look at GitHub - fablabbcn/smartcitizen-kit-audio: Audio analysis library for the digital I2S microphone on the smartcitizen-kit 2.0 again, it looks like others are also struggling. So, I’m glad you already opened I2S.end() hangs · Issue #386 · arduino/ArduinoCore-samd · GitHub - they might even find something what we are missing ;].