esp32: extract btstack_audio_esp32_init for sink and source

This commit is contained in:
Matthias Ringwald 2021-12-27 23:41:37 +01:00
parent 14b6dd1808
commit 8e0e81b08a

View File

@ -67,34 +67,39 @@
#define DMA_BUFFER_SAMPLES 300 #define DMA_BUFFER_SAMPLES 300
#define BYTES_PER_SAMPLE_STEREO 4 #define BYTES_PER_SAMPLE_STEREO 4
static int i2s_num = I2S_NUM_0;
typedef enum { typedef enum {
BTSTACK_AUDIO_ESP32_OFF = 0, BTSTACK_AUDIO_ESP32_OFF = 0,
BTSTACK_AUDIO_ESP32_INITIALIZED, BTSTACK_AUDIO_ESP32_INITIALIZED,
BTSTACK_AUDIO_ESP32_STREAMING BTSTACK_AUDIO_ESP32_STREAMING
} btstack_audio_esp32_state_t; } btstack_audio_esp32_state_t;
static int btstack_audio_esp32_sink_num_channels; static bool btstack_audio_esp32_i2s_installed;
static int btstack_audio_esp32_sink_bytes_per_sample;
// timer to fill output ring buffer
static btstack_timer_source_t btstack_audio_esp32_driver_timer;
static uint8_t btstack_audio_esp32_sink_num_channels;
static uint8_t btstack_audio_esp32_sink_bytes_per_sample;
static uint32_t btstack_audio_esp32_sink_samplerate;
static btstack_audio_esp32_state_t btstack_audio_esp32_sink_state;
// client // client
static void (*btstack_audio_esp32_sink_playback_callback)(int16_t * buffer, uint16_t num_samples); static void (*btstack_audio_esp32_sink_playback_callback)(int16_t * buffer, uint16_t num_samples);
// static void (*btstack_audio_esp32_source_recording_callback)(const int16_t * buffer, uint16_t num_samples); // static void (*btstack_audio_esp32_source_recording_callback)(const int16_t * buffer, uint16_t num_samples);
// timer to fill output ring buffer
static btstack_timer_source_t btstack_audio_esp32_driver_timer;
// queue for TX done events // queue for TX done events
static QueueHandle_t btstack_audio_esp32_i2s_event_queue; static QueueHandle_t btstack_audio_esp32_i2s_event_queue;
static int i2s_num = I2S_NUM_0;
static btstack_audio_esp32_state_t btstack_audio_esp32_sink_state;
#ifdef CONFIG_ESP_LYRAT_V4_3_BOARD #ifdef CONFIG_ESP_LYRAT_V4_3_BOARD
static es8388_config_t es8388_i2c_cfg = AUDIO_CODEC_ES8388_DEFAULT();
static bool btstack_audio_esp32_es8388_initialized; static bool btstack_audio_esp32_es8388_initialized;
static es8388_config_t es8388_i2c_cfg = AUDIO_CODEC_ES8388_DEFAULT();
static void btstack_audio_esp32_set_i2s0_mclk(void) static void btstack_audio_esp32_set_i2s0_mclk(void)
{ {
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0_CLK_OUT1); PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0_CLK_OUT1);
@ -140,19 +145,17 @@ static void btstack_audio_esp32_driver_timer_handler(btstack_timer_source_t * ts
btstack_run_loop_add_timer(ts); btstack_run_loop_add_timer(ts);
} }
static int btstack_audio_esp32_sink_init( static void btstack_audio_esp32_init(void){
uint8_t channels,
uint32_t samplerate,
void (*playback)(int16_t * buffer, uint16_t num_samples)){
btstack_audio_esp32_sink_playback_callback = playback; // de-register driver if already installed
btstack_audio_esp32_sink_num_channels = channels; if (btstack_audio_esp32_i2s_installed){
btstack_audio_esp32_sink_bytes_per_sample = channels * 2; // 16-bit i2s_driver_uninstall(i2s_num);
}
i2s_config_t config = i2s_config_t config =
{ {
.mode = I2S_MODE_MASTER | I2S_MODE_TX, // Playback only .mode = I2S_MODE_MASTER | I2S_MODE_TX, // Playback only
.sample_rate = samplerate, .sample_rate = btstack_audio_esp32_sink_samplerate,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_I2S, .communication_format = I2S_COMM_FORMAT_STAND_I2S,
@ -191,8 +194,24 @@ static int btstack_audio_esp32_sink_init(
btstack_audio_esp32_es8388_init(); btstack_audio_esp32_es8388_init();
#endif #endif
btstack_audio_esp32_i2s_installed = true;
}
static int btstack_audio_esp32_sink_init(
uint8_t channels,
uint32_t samplerate,
void (*playback)(int16_t * buffer, uint16_t num_samples)){
// store config
btstack_audio_esp32_sink_playback_callback = playback;
btstack_audio_esp32_sink_num_channels = channels;
btstack_audio_esp32_sink_bytes_per_sample = channels * 2; // 16-bit
btstack_audio_esp32_sink_samplerate = samplerate;
btstack_audio_esp32_sink_state = BTSTACK_AUDIO_ESP32_INITIALIZED; btstack_audio_esp32_sink_state = BTSTACK_AUDIO_ESP32_INITIALIZED;
// init i2s and codec
btstack_audio_esp32_init();
return 0; return 0;
} }
@ -252,6 +271,8 @@ static void btstack_audio_esp32_sink_close(void){
// uninstall driver // uninstall driver
i2s_driver_uninstall(i2s_num); i2s_driver_uninstall(i2s_num);
btstack_audio_esp32_i2s_installed = false;
} }
static const btstack_audio_sink_t btstack_audio_sink_esp32 = { static const btstack_audio_sink_t btstack_audio_sink_esp32 = {