16 #include "driver/i2s.h"
17 #include "freertos/queue.h"
21 typedef void (*flite_callback)(
size_t size, int16_t *values);
24 extern "C" int arduino_audio_stream_chunk(
const cst_wave *w,
int start,
int size,
int last, cst_audio_streaming_info_struct *user);
36 virtual cst_audiodev * open(
int sps,
int channels, cst_audiofmt fmt) {
37 LOG(
"FliteOutputBase::open: %d, %d, %d", sps, channels, fmt);
39 audiodev = cst_alloc(cst_audiodev, 1);
40 audiodev->real_sps = audiodev->sps = sps;
41 audiodev->real_channels = audiodev->channels = channels;
42 audiodev->real_fmt = audiodev->fmt = fmt;
43 audiodev->platform_data = (
void *)
this;
61 virtual int write(
void *buff,
int sample_count) = 0;
64 return audiodev!=
nullptr ? audiodev->channels : 0;
68 return audiodev!=
nullptr ? audiodev->real_sps : 0;
73 if (audiodev!=
nullptr){
74 switch(audiodev->real_fmt){
80 Serial.println(
"Unsupported Audio Format");
91 cst_audiodev* info() {
97 cst_audiodev *audiodev =
nullptr;
110 virtual int write(
void *buffer,
int sample_count) {
111 LOG(
"FliteOutputCallback::write: %d", sample_count);
112 int size = sample_count;
113 callback(size, (int16_t*) buffer);
118 flite_callback callback;
129 this->i2s_num = i2s_num;
130 setupDefaultConfig();
135 this->i2s_num = i2s_num;
136 this->i2s_config = cfg;
140 FliteOutputI2S( i2s_port_t i2s_num, i2s_config_t cfg, i2s_pin_config_t pins ){
141 this->i2s_num = i2s_num;
142 this->i2s_config = cfg;
143 this->pin_config = pins;
146 virtual cst_audiodev * open(
int sample_rate,
int channels, cst_audiofmt fmt) {
148 LOG(
"setting sample rate for I2S: %d", sample_rate);
149 i2s_config.sample_rate = sample_rate;
151 if (i2s_driver_install(i2s_num, &i2s_config, 0, NULL)!=ESP_OK){
152 ESP_LOGE(TAG,
"Failed to install i2s");
154 if (i2s_config.mode & I2S_MODE_DAC_BUILT_IN) {
156 LOG(
"i2s_set_pin: %s",
"internal DAC");
157 if (i2s_set_pin(i2s_num, NULL)!=ESP_OK){
158 ESP_LOGE(TAG,
"Failed to set i2s pins");
162 LOG(
"i2s_set_pin: %s",
"external DAC");
163 if (i2s_set_pin(i2s_num, &pin_config)!=ESP_OK){
164 ESP_LOGE(TAG,
"Failed to set i2s pins");
167 return FliteOutputBase::open(sample_rate, channels, fmt);
170 virtual int close() {
171 if (i2s_driver_uninstall(i2s_num) != ESP_OK){
172 ESP_LOGE(TAG,
"Failed to uninstall i2s");
175 return FliteOutputBase::close();
179 i2s_zero_dma_buffer(i2s_num);
183 virtual int write(
void *buffer,
int sample_count) {
184 LOG(
"FliteOutputI2S::write: %d", sample_count);
185 size_t i2s_bytes_write;
187 LOG(
"i2s_write: %s",
"simple call");
188 if (i2s_write(i2s_num, buffer, sample_count*
sizeof(int16_t), &i2s_bytes_write, portMAX_DELAY)!=ESP_OK){
189 ESP_LOGE(TAG,
"i2s_write failed!");
192 LOG(
"i2s_write: %s",
"generate data for 2 channels");
195 int16_t *ptr = (int16_t *) buffer;
196 for (
int j=0;j<sample_count;j++){
197 int16_t data[2] = {ptr[j], ptr[j]};
198 if (i2s_write(i2s_num, data,
sizeof(int16_t)*2, &i2s_bytes_write, portMAX_DELAY)==ESP_OK){
199 total += i2s_bytes_write;
201 ESP_LOGE(TAG,
"i2s_write failed!");
204 LOG(
"i2s_write - bytes written: %d",total);
211 i2s_config_t i2s_config;
212 i2s_pin_config_t pin_config;
213 const char *TAG =
"FliteOutputI2S";
215 void setupDefaultConfig() {
216 const i2s_config_t i2s_config_default = {
217 .mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_TX),
218 .sample_rate = this->sampleRate(),
219 .bits_per_sample = (i2s_bits_per_sample_t)16,
220 .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
221 .communication_format = (i2s_comm_format_t) (I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
222 .intr_alloc_flags = 0,
227 this->i2s_config = i2s_config_default;
230 void setupDefaultPins() {
231 static const i2s_pin_config_t pin_config_default = {
235 .data_in_num = I2S_PIN_NO_CHANGE
237 this->pin_config = pin_config_default;
250 this->out_ptr = &out;
265 virtual int write(
void *buffer,
int sample_count) {
266 LOG(
"FliteOutput::write: %d", sample_count);
267 out_ptr->write((
const uint8_t *) buffer, sample_count*
sizeof(int16_t));
284 virtual int write(
void *buffer,
int sample_count) {
285 LOG(
"FlitePrintStream::write: %d", sample_count);
287 int16_t *ptr = (int16_t *) buffer;
288 for (
int j=0;j<sample_count;j++){
289 out_ptr->println(ptr[j]);
Base Output Class with common functionality.
Definition: flite_out_arduino.h:31
Output via Callback method.
Definition: flite_out_arduino.h:104
Output using Arduino Print class.
Definition: flite_out_arduino.h:247
Output to I2S for ESP32.
Definition: flite_out_arduino.h:126
Write readable string to Arduino Print class.
Definition: flite_out_arduino.h:279
Configuration settings for Arduino.
int arduino_audio_stream_chunk(const cst_wave *w, int start, int size, int last, cst_audio_streaming_info_struct *user)
flite streaming callback method
Definition: flite_out_arduino.cpp:21