| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 | 
							- #include "BufferedAudioSink.h"
 
- #include "driver/i2s.h"
 
- #include "freertos/ringbuf.h"
 
- #include "freertos/task.h"
 
- RingbufHandle_t dataBuffer;
 
- static void i2sFeed(void* pvParameters) {
 
-   while (true) {
 
-     size_t itemSize;
 
-     char* item = (char*)xRingbufferReceiveUpTo(dataBuffer, &itemSize,
 
-                                                portMAX_DELAY, 512);
 
-     if (item != NULL) {
 
-       size_t written = 0;
 
-       while (written < itemSize) {
 
-         i2s_write((i2s_port_t)0, item, itemSize, &written, portMAX_DELAY);
 
-       }
 
-       vRingbufferReturnItem(dataBuffer, (void*)item);
 
-     }
 
-   }
 
- }
 
- void BufferedAudioSink::startI2sFeed(size_t buf_size) {
 
-   dataBuffer = xRingbufferCreate(buf_size, RINGBUF_TYPE_BYTEBUF);
 
-   xTaskCreatePinnedToCore(&i2sFeed, "i2sFeed", 4096, NULL, 10, NULL,
 
-                           tskNO_AFFINITY);
 
- }
 
- void BufferedAudioSink::feedPCMFrames(const uint8_t* buffer, size_t bytes) {
 
-   feedPCMFramesInternal(buffer, bytes);
 
- }
 
- void BufferedAudioSink::feedPCMFramesInternal(const void* pvItem,
 
-                                               size_t xItemSize) {
 
-   xRingbufferSend(dataBuffer, pvItem, xItemSize, portMAX_DELAY);
 
- }
 
- bool BufferedAudioSink::setParams(uint32_t sampleRate, uint8_t channelCount,
 
-                                   uint8_t bitDepth) {
 
-   // TODO override this for sinks with custom mclk
 
-   i2s_set_clk((i2s_port_t)0, sampleRate, (i2s_bits_per_sample_t)bitDepth,
 
-               (i2s_channel_t)channelCount);
 
-   return true;
 
- }
 
 
  |