static void bt_av_hdl_a2d_evt(uint16_t event, void *p_param) { ESP_LOGD(BT_AV_TAG, "%s evt %d", __func__, event); esp_a2d_cb_param_t *a2d = NULL; switch (event) { case ESP_A2D_CONNECTION_STATE_EVT: { a2d = (esp_a2d_cb_param_t *)(p_param); ESP_LOGI(BT_AV_TAG, "a2dp conn_state_cb, state %d", a2d->conn_stat.state); break; } case ESP_A2D_AUDIO_STATE_EVT: { a2d = (esp_a2d_cb_param_t *)(p_param); ESP_LOGI(BT_AV_TAG, "a2dp audio_state_cb state %d", a2d->audio_stat.state); m_audio_state = a2d->audio_stat.state; if (ESP_A2D_AUDIO_STATE_STARTED == a2d->audio_stat.state) { m_pkt_cnt = 0; } break; } case ESP_A2D_AUDIO_CFG_EVT: { a2d = (esp_a2d_cb_param_t *)(p_param); ESP_LOGI(BT_AV_TAG, "a2dp audio_cfg_cb , codec type %d", a2d->audio_cfg.mcc.type); // for now only SBC stream is supported if (a2d->audio_cfg.mcc.type == ESP_A2D_MCT_SBC) { int sample_rate = 16000; char oct0 = a2d->audio_cfg.mcc.cie.sbc[0]; if (oct0 & (0x01 << 6)) { sample_rate = 32000; } else if (oct0 & (0x01 << 5)) { sample_rate = 44100; } else if (oct0 & (0x01 << 4)) { sample_rate = 48000; } i2s_set_clk(0, sample_rate, 16, 2); ESP_LOGI(BT_AV_TAG, "configure audio player %x-%x-%x-%x\n", a2d->audio_cfg.mcc.cie.sbc[0], a2d->audio_cfg.mcc.cie.sbc[1], a2d->audio_cfg.mcc.cie.sbc[2], a2d->audio_cfg.mcc.cie.sbc[3]); ESP_LOGI(BT_AV_TAG, "audio player configured, samplerate=%d", sample_rate); } break; } default: ESP_LOGE(BT_AV_TAG, "%s unhandled evt %d", __func__, event); break; } }
static void setup_triangle_sine_waves(int bits) { int *samples_data = malloc(((bits+8)/16)*SAMPLE_PER_CYCLE*4); unsigned int i, sample_val; double sin_float, triangle_float, triangle_step = (double) pow(2, bits) / SAMPLE_PER_CYCLE; size_t i2s_bytes_write = 0; printf("\r\nTest bits=%d free mem=%d, written data=%d\n", bits, esp_get_free_heap_size(), ((bits+8)/16)*SAMPLE_PER_CYCLE*4); triangle_float = -(pow(2, bits)/2 - 1); for(i = 0; i < SAMPLE_PER_CYCLE; i++) { sin_float = sin(i * PI / 180.0); if(sin_float >= 0) triangle_float += triangle_step; else triangle_float -= triangle_step; sin_float *= (pow(2, bits)/2 - 1); if (bits == 16) { sample_val = 0; sample_val += (short)triangle_float; sample_val = sample_val << 16; sample_val += (short) sin_float; samples_data[i] = sample_val; } else if (bits == 24) { //1-bytes unused samples_data[i*2] = ((int) triangle_float) << 8; samples_data[i*2 + 1] = ((int) sin_float) << 8; } else { samples_data[i*2] = ((int) triangle_float); samples_data[i*2 + 1] = ((int) sin_float); } } i2s_set_clk(I2S_NUM, SAMPLE_RATE, bits, 2); //Using push // for(i = 0; i < SAMPLE_PER_CYCLE; i++) { // if (bits == 16) // i2s_push_sample(0, &samples_data[i], 100); // else // i2s_push_sample(0, &samples_data[i*2], 100); // } // or write i2s_write(I2S_NUM, samples_data, ((bits+8)/16)*SAMPLE_PER_CYCLE*4, &i2s_bytes_write, 100); free(samples_data); }