Hi,
I'm looking for an example that creates a set of ring buffers in memory and then plays them through the i2s using the esp-adf libraries.
Once it starts playing, there would be a call-back to allow the program to refill the buffer.
The goal is to play a on-the-fly generated waveform
Like a signal generator or synthesizer.
I'm using a ESP32-LyraT-mini
ring_buffer-->i2s_stream-->[codec_chip]
Re: ring_buffer-->i2s_stream-->[codec_chip]
I figured it out.
I created a function static void fillBufferTask(void *para)
In it I write from my buffer into the ring buffer in a tight loop. The call to raw_stream_write blocks until it has transferred all the data. When it returns it swaps to the other buffer and start writing it.
while (bytesToSend > 0)
{
bytesToSend -= raw_stream_write(RB, (char *)buffer, bytesToSend);
if (bytesToSend > 0)
{
vTaskDelay(1);
ESP_LOGI(THREAD, "Delay");
}
}
The vTaskDelay is never called.
In the main program it is kicked off like this
xTaskCreate(fillBufferTask, "fill_buffer", 4096, raw_write, 1, NULL);
The pipeline is set up like this
ESP_LOGI(TAG, "[2.1] Create i2s stream to write data to codec chip and read data from codec chip");
i2s_stream_cfg_t i2s_cfg1 = I2S_STREAM_CFG_DEFAULT();
i2s_cfg1.type = AUDIO_STREAM_WRITER;
i2s_stream_writer = i2s_stream_init(&i2s_cfg1);
ESP_LOGI(TAG, "[2.2] Create raw write stream");
raw_stream_cfg_t raw_cfg = RAW_STREAM_CFG_DEFAULT();
raw_cfg.type = AUDIO_STREAM_WRITER;
raw_write = raw_stream_init(&raw_cfg);
ESP_LOGI(TAG, "[3.0] Register all elements to audio pipeline");
audio_pipeline_register(pipeline_d, raw_write, "raw_w");
audio_pipeline_register(pipeline_d, i2s_stream_writer, "i2s_w");
ESP_LOGI(TAG, "[3.1] Link it together raw_writer-->i2s_stream_writer-->[codec_chip]");
const char *link_d[2] = {"raw_w", "i2s_w"};
audio_pipeline_link(pipeline_d, &link_d[0], 2);
I created a function static void fillBufferTask(void *para)
In it I write from my buffer into the ring buffer in a tight loop. The call to raw_stream_write blocks until it has transferred all the data. When it returns it swaps to the other buffer and start writing it.
while (bytesToSend > 0)
{
bytesToSend -= raw_stream_write(RB, (char *)buffer, bytesToSend);
if (bytesToSend > 0)
{
vTaskDelay(1);
ESP_LOGI(THREAD, "Delay");
}
}
The vTaskDelay is never called.
In the main program it is kicked off like this
xTaskCreate(fillBufferTask, "fill_buffer", 4096, raw_write, 1, NULL);
The pipeline is set up like this
ESP_LOGI(TAG, "[2.1] Create i2s stream to write data to codec chip and read data from codec chip");
i2s_stream_cfg_t i2s_cfg1 = I2S_STREAM_CFG_DEFAULT();
i2s_cfg1.type = AUDIO_STREAM_WRITER;
i2s_stream_writer = i2s_stream_init(&i2s_cfg1);
ESP_LOGI(TAG, "[2.2] Create raw write stream");
raw_stream_cfg_t raw_cfg = RAW_STREAM_CFG_DEFAULT();
raw_cfg.type = AUDIO_STREAM_WRITER;
raw_write = raw_stream_init(&raw_cfg);
ESP_LOGI(TAG, "[3.0] Register all elements to audio pipeline");
audio_pipeline_register(pipeline_d, raw_write, "raw_w");
audio_pipeline_register(pipeline_d, i2s_stream_writer, "i2s_w");
ESP_LOGI(TAG, "[3.1] Link it together raw_writer-->i2s_stream_writer-->[codec_chip]");
const char *link_d[2] = {"raw_w", "i2s_w"};
audio_pipeline_link(pipeline_d, &link_d[0], 2);
Who is online
Users browsing this forum: No registered users and 46 guests