#include <Audio.h>
// GUItool: begin automatically generated code
AudioSynthWaveform wav; //xy=1294,387
AudioRecordQueue queue; //xy=1452,289
AudioOutputI2S i2sOut; //xy=1506,364
AudioOutputUSB usbOut; //xy=1531,423
AudioConnection patchCord1(wav, 0, i2sOut, 0);
AudioConnection patchCord2(wav, 0, i2sOut, 1);
AudioConnection patchCord3(wav, 0, usbOut, 0);
AudioConnection patchCord4(wav, 0, usbOut, 1);
AudioConnection patchCord5(wav, queue);
// GUItool: end automatically generated code
bool led = true;
int count;
void setup()
{
AudioMemory(40);
pinMode(LED_BUILTIN,OUTPUT);
digitalWrite(LED_BUILTIN,led);
wav.begin(1.0f,441.0f,WAVEFORM_SINE);
queue.begin();
while (!Serial)
;
// Hacky diagnostic of which library is in use:
#if defined(USB_AUDIO_NO_CHANNELS_480)
Serial.printf("Improved audio library in use: %d channels",USB_AUDIO_NO_CHANNELS_480);
#else
Serial.println("Stock audio library in use: 2 channels");
#endif // defined(USB_AUDIO_NO_CHANNELS_480)
// figure out timing source and sample rate
uint32_t cycles = IMXRT_PIT_CHANNELS->LDVAL;
if (0 == cycles || cycles > 1'000'000'000)
{
// Retrieve exact register settings rather than relying on
// correct setup - someone might have fiddled things!
float nmult = CCM_ANALOG_PLL_AUDIO_NUM & CCM_ANALOG_PLL_AUDIO_NUM_MASK,
ndiv = CCM_ANALOG_PLL_AUDIO_DENOM & CCM_ANALOG_PLL_AUDIO_DENOM_MASK,
nfact = CCM_ANALOG_PLL_AUDIO & CCM_ANALOG_PLL_AUDIO_DIV_SELECT(0xFFFFFFFF),
n1 = 1+(CCM_CS1CDR & CCM_CS1CDR_SAI1_CLK_PRED(0xFFFFFFFF))/CCM_CS1CDR_SAI1_CLK_PRED(1),
n2 = 1+(CCM_CS1CDR & CCM_CS1CDR_SAI1_CLK_PODF(0xFFFFFFFF));
float rate = 24'000'000.0f * (nfact + nmult/ndiv) / n1 / n2 / 256.0f;
Serial.printf("Using I²S timing at %.2fHz (%.2fHz)\n",rate,AUDIO_SAMPLE_RATE_EXACT);
}
else
Serial.printf("Using IntervalTimer at %.2fHz (%d cycles)\n",128*24'000'000.0f/cycles,cycles);
}
void loop()
{
// monitor whether audio updates are
// occurring, just in case
if (queue.available())
{
count++;
queue.readBuffer();
queue.freeBuffer();
if (count > 100)
{
count = 0;
led = !led;
digitalWrite(LED_BUILTIN,led);
}
}
}