14 # error "Wrong implementation included for this platform"
19 #if MOZZI_IS(MOZZI_ANALOG_READ, MOZZI_ANALOG_READ_STANDARD)
20 #error not yet implemented
22 #define getADCReading() 0
23 #define channelNumToIndex(channel) channel
24 uint8_t adcPinToChannelNum(uint8_t pin) {
27 void adcStartConversion(uint8_t channel) {
29 void startSecondADCReadOnCurrentChannel() {
31 void setupMozziADC(int8_t speed) {
33 void setupFastAnalogRead(int8_t speed) {
42 #if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_I2S_DAC) || MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PDM_VIA_I2S)
45 #include<driver/i2s_std.h>
49 #if SOC_I2S_HW_VERSION_2
50 #undef I2S_STD_CLK_DEFAULT_CONFIG
51 #define I2S_STD_CLK_DEFAULT_CONFIG(rate) \
52 { .sample_rate_hz = rate, .clk_src = I2S_CLK_SRC_DEFAULT, .ext_clk_freq_hz = 0, .mclk_multiple = I2S_MCLK_MULTIPLE_256, }
66 #if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_I2S_DAC) || MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PDM_VIA_I2S)
67 const i2s_port_t i2s_num = MOZZI_I2S_PORT;
68 static i2s_chan_handle_t tx_handle;
73 static bool _esp32_can_buffer_next =
true;
75 # if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_INTERNAL_DAC)
76 static uint8_t _esp32_prev_sample[2];
77 # define ESP_SAMPLE_SIZE (sizeof(uint8_t))
78 # elif MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_I2S_DAC)
79 # define ESP_SAMPLE_SIZE I2S_DATA_BIT_WIDTH_16BIT
80 static int16_t _esp32_prev_sample[2];
81 # elif MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PDM_VIA_I2S)
82 static uint32_t _esp32_prev_sample[MOZZI_PDM_RESOLUTION];
83 # define ESP_SAMPLE_SIZE I2S_DATA_BIT_WIDTH_16BIT
88 inline bool esp32_tryWriteSample() {
91 #if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_I2S_DAC)
92 i2s_channel_write(tx_handle,_esp32_prev_sample, 2*
sizeof(_esp32_prev_sample[0]), &bytes_written, 0);
93 #elif MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PDM_VIA_I2S)
94 i2s_channel_write(tx_handle,_esp32_prev_sample, MOZZI_PDM_RESOLUTION*
sizeof(_esp32_prev_sample[0]), &bytes_written, 0);
99 return (bytes_written != 0);
102 inline bool canBufferAudioOutput() {
103 if (_esp32_can_buffer_next)
return true;
104 _esp32_can_buffer_next = esp32_tryWriteSample();
105 return _esp32_can_buffer_next;
109 # if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_I2S_DAC) || MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PDM_VIA_I2S) || MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_INTERNAL_DAC) || MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PWM)
111 # if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_INTERNAL_DAC)
112 dacWrite(25, f.l() + MOZZI_AUDIO_BIAS);
113 # if (MOZZI_AUDIO_CHANNELS > 1)
114 dacWrite(26, f.r() + MOZZI_AUDIO_BIAS);
117 # elif MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PWM)
119 # if (MOZZI_AUDIO_CHANNELS > 1)
120 ledcWrite(MOZZI_AUDIO_PIN_2,(f.r()+MOZZI_AUDIO_BIAS));
123 # elif MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PDM_VIA_I2S)
124 for (uint8_t i=0; i<MOZZI_PDM_RESOLUTION; ++i) {
125 _esp32_prev_sample[i] = pdmCode32(f.l() + MOZZI_AUDIO_BIAS);
129 _esp32_prev_sample[0] = f.l();
130 # if (MOZZI_AUDIO_CHANNELS > 1)
131 _esp32_prev_sample[1] = f.r();
133 _esp32_prev_sample[1] = 0;
136 # if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_I2S_DAC) || MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PDM_VIA_I2S)
137 _esp32_can_buffer_next = esp32_tryWriteSample();
145 #if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_EXTERNAL_TIMED, MOZZI_OUTPUT_INTERNAL_DAC, MOZZI_OUTPUT_PWM)
146 #include <driver/gptimer.h>
148 bool CACHED_FUNCTION_ATTR timer_on_alarm_cb(gptimer_handle_t timer,
const gptimer_alarm_event_data_t *edata,
void *user_ctx)
150 defaultAudioOutput();
155 static void startAudio() {
158 #if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_EXTERNAL_TIMED, MOZZI_OUTPUT_INTERNAL_DAC, MOZZI_OUTPUT_PWM)
160 gptimer_handle_t gptimer = NULL;
161 gptimer_config_t timer_config = {
162 .clk_src = GPTIMER_CLK_SRC_DEFAULT,
163 .direction = GPTIMER_COUNT_UP,
164 .resolution_hz = 40 * 1000 * 1000,
167 gptimer_new_timer(&timer_config, &gptimer);
169 gptimer_alarm_config_t alarm_config;
170 alarm_config.reload_count = 0;
172 alarm_config.flags.auto_reload_on_alarm =
true;
174 gptimer_set_alarm_action(gptimer, &alarm_config);
176 gptimer_event_callbacks_t cbs = {
177 .on_alarm = timer_on_alarm_cb,
181 gptimer_register_event_callbacks(gptimer,&cbs,NULL);
182 gptimer_enable(gptimer);
183 gptimer_start(gptimer);
185 # if MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PWM)
187 # if (MOZZI_AUDIO_CHANNELS > 1)
192 # elif MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_I2S_DAC) || MOZZI_IS(MOZZI_AUDIO_MODE, MOZZI_OUTPUT_PDM_VIA_I2S)
194 static i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(MOZZI_I2S_PORT, I2S_ROLE_MASTER);
195 i2s_new_channel(&chan_cfg, &tx_handle, NULL);
197 i2s_std_config_t std_cfg = {
198 .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(
MOZZI_AUDIO_RATE * MOZZI_PDM_RESOLUTION),
199 # if MOZZI_IS(MOZZI_I2S_FORMAT, MOZZI_I2S_FORMAT_PLAIN)
200 # if (MOZZI_AUDIO_CHANNELS > 1)
201 .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(ESP_SAMPLE_SIZE, I2S_SLOT_MODE_STEREO),
203 .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(ESP_SAMPLE_SIZE, I2S_SLOT_MODE_STEREO),
205 # elif MOZZI_IS(MOZZI_I2S_FORMAT, MOZZI_I2S_FORMAT_LSBJ)
206 # if (MOZZI_AUDIO_CHANNELS > 1)
207 .slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(ESP_SAMPLE_SIZE, I2S_SLOT_MODE_STEREO),
209 .slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(ESP_SAMPLE_SIZE, I2S_SLOT_MODE_STEREO),
213 .mclk = gpio_num_t(MOZZI_I2S_PIN_MCLK),
214 .bclk = gpio_num_t(MOZZI_I2S_PIN_BCK),
215 .ws = gpio_num_t(MOZZI_I2S_PIN_WS),
216 .dout = gpio_num_t(MOZZI_I2S_PIN_DATA),
217 .din = I2S_GPIO_UNUSED,
219 .mclk_inv = MOZZI_I2S_MBCK_INV,
220 .bclk_inv = MOZZI_I2S_BCK_INV,
221 .ws_inv = MOZZI_I2S_WS_INV,
233 i2s_channel_init_std_mode(tx_handle, &std_cfg);
234 i2s_channel_enable(tx_handle);
259 void MozziRandPrivate::autoSeed() {
266 #undef ESP_SAMPLE_SIZE
#define MOZZI_AUDIO_BITS
Output resolution of audio samples.
#define MOZZI_AUDIO_PIN_1
Only for MOZZI_AUDIO_MODE s MOZZI_OUTPUT_PWM and MOZZI_OUTPUT_2PIN_PWM: The IO pin to use as (first) ...
#define MOZZI_AUDIO_RATE
Defines the audio rate, i.e.
void stopMozzi()
Stops audio and control interrupts and restores the timers to the values they had before Mozzi was st...
This struct encapsulates one frame of mono audio output.