sensorium / Mozzi

sound synthesis library for Arduino
https://sensorium.github.io/Mozzi/
GNU Lesser General Public License v2.1
1.07k stars 186 forks source link

EXTERNAL_AUDIO_OUTPUT not working on RP2040? #166

Closed tomcombriat closed 1 year ago

tomcombriat commented 1 year ago

Apparently, according to: https://groups.google.com/g/mozzi-users/c/csMUSbZjnf8

Will try to reproduce.

tomcombriat commented 1 year ago

I confirm this bug, at least when trying to use I2S via an external audio output function. Weird things:

Any idea?

tfry-git commented 1 year ago

So what you tested is essentially that you took the code for EXTERNAL_DAC_VIA_I2S but placed it in a custom audioOutput(), instead? And in that case is does not work? Weird.

One idea: Could it be that the speed of the I2S does not quite match the rate at which audioOutput() gets called? Perhaps the buffer is getting overcrowed, eventually resulting in a hang? If that is the issue, checking i2s.availableForWrite() should help.

tomcombriat commented 1 year ago

So what you tested is essentially that you took the code for EXTERNAL_DAC_VIA_I2S but placed it in a custom audioOutput(), instead? And in that case is does not work? Weird.

Yup.

I do not really care about getting it to work with I2S (as this is already implemented in "hardware") but there was a report of a similar problem on the forum with I2C, which triggered me to test the EXTERNAL_AUDIO_OUTPUT on RP2040 (did you try?). That being said, I2C is usually too slow to sustain an AUDIO_RATE, so it might be the same problem. Will try one of these days with SPI emulating I2S (without buffer) to see if this error remains.

tomcombriat commented 1 year ago

Okay, using i2s.availableForWrite() as a crude test seems to work (with a few glitches because of the two buffers probably not running exactly at the same time, that is not an optimal situation).

So closing this for now.

tfry-git commented 1 year ago

Ok, actually, I think setting BYPASS_MOZZI_OUTPUT_BUFFER is the "clean" way to go in this situation, then. That makes sense, too, as the whole trouble is that there already is another buffer at work.

tomcombriat commented 1 year ago

Yeah, but I think there is no need to have this work cleanly with I2S as it is ported already. This was just a mockup test to see if the EXTERNAL_AUDIO was working (and I had this DAC wired on my breadboard ;) ).

tfry-git commented 1 year ago

Sure, I was just saying this for completeness (and because I had sort of forgotten that we already have a ready solution for dealing with the case of an independent output buffer somewhere).