BufferedAudioSink.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include "BufferedAudioSink.h"
  2. #include "driver/i2s.h"
  3. #include "freertos/task.h"
  4. #include "freertos/ringbuf.h"
  5. RingbufHandle_t dataBuffer;
  6. static void i2sFeed(void *pvParameters)
  7. {
  8. while (true)
  9. {
  10. size_t itemSize;
  11. char *item = (char *)xRingbufferReceiveUpTo(dataBuffer, &itemSize, portMAX_DELAY, 512);
  12. if (item != NULL)
  13. {
  14. size_t written = 0;
  15. while (written < itemSize)
  16. {
  17. i2s_write((i2s_port_t)0, item, itemSize, &written, portMAX_DELAY);
  18. }
  19. vRingbufferReturnItem(dataBuffer, (void *)item);
  20. }
  21. }
  22. }
  23. void BufferedAudioSink::startI2sFeed(size_t buf_size)
  24. {
  25. dataBuffer = xRingbufferCreate(buf_size, RINGBUF_TYPE_BYTEBUF);
  26. xTaskCreatePinnedToCore(&i2sFeed, "i2sFeed", 4096, NULL, 10, NULL, tskNO_AFFINITY);
  27. }
  28. void BufferedAudioSink::feedPCMFrames(const uint8_t *buffer, size_t bytes)
  29. {
  30. feedPCMFramesInternal(buffer, bytes);
  31. }
  32. void BufferedAudioSink::feedPCMFramesInternal(const void *pvItem, size_t xItemSize)
  33. {
  34. xRingbufferSend(dataBuffer, pvItem, xItemSize, portMAX_DELAY);
  35. }
  36. bool BufferedAudioSink::setParams(uint32_t sampleRate, uint8_t channelCount, uint8_t bitDepth) {
  37. // TODO override this for sinks with custom mclk
  38. i2s_set_clk((i2s_port_t)0, sampleRate, (i2s_bits_per_sample_t)bitDepth, (i2s_channel_t)channelCount);
  39. return true;
  40. }