Solved! (with high probability)
TL;DR:
It seems that functions i2s_read and i2s_write are interacting with an on-going interrupt process (maybe even using DMA as the ESP32 has it), and not initiating discrete actions like I assumed. To be able to do calculations with the input like I was trying to do, I should have immediately copied the read buffer into another buffer and then examined that data. I haven’t had a chance to go back and test this, and am not sure if I will. However, the write up below (and much better the video in the first link) should make it clear why I think this is the case.
JRemington said it above:
"If you don’t process the incoming data quickly enough, samples will be dropped.”
Bottom line: I’m back on track working through the material in Prof Tretter’s University of Maryland DSP for Communications text book and labs (link above), as well as Sophocles J. Orfanidis wonderful material from his class at Rutgers (links below).
Thank you all.
The rest of the story:
My first step before trying to do anything more with the WM8906 (which I really like!) was getting an STM32 board and the pmod I2S2 codec board, and implemented the very nice solution Phil has here:
[#5] IIR Filters - Audio DSP On STM32 with I2S (24 Bit / 96 kHz) https://www.youtube.com/watch?v=lNBrGOk0XzE.
This example is exactly what I was looking for, as it shows how to insert some digital signal processing between the ADC input and the DAC output. Worth watching even if you aren’t going to do it yourself. Working through the example’s interrupt routine it’s clear that the I2S keeps getting data and the DMA keeps writing it to the buffer. So a copy needs to be made immediately before the buffer is overwritten.
And please: before anyone comments about the approach in this video not being how “real DSP” would be done, please note that a) its circular buffer, one point at a time is a very straight forward way to understand/think about the processing, and 2) his video
[#15] CMSIS DSP Library - Audio DSP On STM32 (24 Bit / 48 kHz) https://www.youtube.com/watch?v=vCcALaGNlyw
goes on to do it with a larger buffer to improve throughput. I am now a big fan of Phil’s and plan to keep working through his videos.
As an aside, since a circular buffer is used with two interrupts (one for each half) there can be some interesting “artifacts” if you put a break point in one interrupt service routine and leave the other running!
The second step was with the WM8906, which is great board! (vastly more capable than the pmod I2S). Someone was kind enough to share their c code performing the I2C register configurations for the WM8906, and I’ve got it running on an STM32 board.
I hope the reference material above is of interest. I’m having a lot of fun with it.