ES8311AudioSink.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "ES8311AudioSink.h"
  2. extern "C" {
  3. #include "es8311.h"
  4. }
  5. ES8311AudioSink::ES8311AudioSink()
  6. {
  7. this->softwareVolumeControl = false;
  8. esp_err_t ret_val = ESP_OK;
  9. Es8311Config cfg = {
  10. .esMode = ES_MODE_SLAVE,
  11. .i2c_port_num = I2C_NUM_0,
  12. .i2c_cfg = {
  13. .mode = I2C_MODE_MASTER,
  14. .sda_io_num = 1,
  15. .scl_io_num = 2,
  16. .sda_pullup_en = GPIO_PULLUP_ENABLE,
  17. .scl_pullup_en = GPIO_PULLUP_ENABLE,
  18. },
  19. .dacOutput = (DacOutput) (DAC_OUTPUT_LOUT1 | DAC_OUTPUT_LOUT2 | DAC_OUTPUT_ROUT1 | DAC_OUTPUT_ROUT2),
  20. .adcInput = ADC_INPUT_LINPUT1_RINPUT1,
  21. };
  22. cfg.i2c_cfg.master.clk_speed = 100000;
  23. Es8311Init(&cfg);
  24. Es8311SetBitsPerSample(ES_MODULE_DAC, BIT_LENGTH_16BITS);
  25. Es8311ConfigFmt(ES_MODULE_DAC, ES_I2S_NORMAL);
  26. Es8311SetVoiceVolume(60);
  27. Es8311Start(ES_MODULE_DAC);
  28. ES8311WriteReg(ES8311_CLK_MANAGER_REG01, 0xbf);
  29. ES8311WriteReg(ES8311_CLK_MANAGER_REG02, 0x18);
  30. // .codec_mode = AUDIO_HAL_CODEC_MODE_DECODE,
  31. // .i2s_iface = {
  32. // .mode = AUDIO_HAL_MODE_SLAVE,
  33. // .fmt = AUDIO_HAL_I2S_NORMAL,
  34. // .samples = AUDIO_HAL_44K_SAMPLES,
  35. // .bits = AUDIO_HAL_BIT_LENGTH_16BITS,
  36. // },
  37. // };
  38. // ret_val |= es8311_codec_init(&cfg);
  39. // ret_val |= es8311_set_bits_per_sample(cfg.i2s_iface.bits);
  40. // ret_val |= es8311_config_fmt((es_i2s_fmt_t) cfg.i2s_iface.fmt);
  41. // ret_val |= es8311_codec_set_voice_volume(60);
  42. // ret_val |= es8311_codec_ctrl_state(cfg.codec_mode, AUDIO_HAL_CTRL_START);
  43. // ret_val |= es8311_codec_set_clk();
  44. i2s_config_t i2s_config = {
  45. .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX), // Only TX
  46. .sample_rate = 44100,
  47. .bits_per_sample = (i2s_bits_per_sample_t)16,
  48. .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, // 2-channels
  49. .communication_format = (i2s_comm_format_t)I2S_COMM_FORMAT_STAND_I2S,
  50. .intr_alloc_flags = 0, // Default interrupt priority
  51. .dma_buf_count = 8,
  52. .dma_buf_len = 512,
  53. .use_apll = false,
  54. .tx_desc_auto_clear = true, // Auto clear tx descriptor on underflow
  55. };
  56. i2s_pin_config_t pin_config = {
  57. .mck_io_num = 42,
  58. .bck_io_num = 40,
  59. .ws_io_num = 41,
  60. .data_out_num = 39,
  61. .data_in_num = -1,
  62. };
  63. int err;
  64. err = i2s_driver_install((i2s_port_t)0, &i2s_config, 0, NULL);
  65. if (err != ESP_OK)
  66. {
  67. ESP_LOGE("OI", "i2s driver installation error: %d", err);
  68. }
  69. err = i2s_set_pin((i2s_port_t)0, &pin_config);
  70. if (err != ESP_OK)
  71. {
  72. ESP_LOGE("OI", "i2s set pin error: %d", err);
  73. }
  74. // PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0_CLK_OUT1);
  75. // REG_SET_FIELD(PIN_CTRL, CLK_OUT1, 0);
  76. // ESP_LOGI("OI", "MCLK output on CLK_OUT1");
  77. startI2sFeed();
  78. }
  79. void ES8311AudioSink::volumeChanged(uint16_t volume)
  80. {
  81. Es8311SetVoiceVolume(volume);
  82. }
  83. void ES8311AudioSink::writeReg(uint8_t reg_add, uint8_t data)
  84. {
  85. }
  86. void ES8311AudioSink::setSampleRate(uint32_t sampleRate) {
  87. std::cout << "ES8311AudioSink::setSampleRate(" << sampleRate << ")" << std::endl;
  88. // i2s set sample rate
  89. es8311_Codec_Startup(0, sampleRate);
  90. }
  91. ES8311AudioSink::~ES8311AudioSink()
  92. {
  93. }