Files
klubhaus-doorbell/libraries/audio-tools/examples/sandbox/basic-a2dp-vs1053/basic-a2dp-vs1053.ino
2026-02-12 21:00:02 -08:00

67 lines
1.8 KiB
C++

/**
* @file basic-a2dp-audiovs1053.ino
* @brief A2DP Sink with output to vs1053. The vs1053 expects encoded data so we encode the stream
* to a WAV file
*
* @author Phil Schatzmann
* @copyright GPLv3
*/
// install https://github.com/pschatzmann/arduino-vs1053.git
#include "AudioTools.h"
#include "AudioTools/AudioLibs/VS1053Stream.h"
#include "BluetoothA2DPSink.h"
BluetoothA2DPSink a2dp_sink;
VS1053Stream out; // output
VS1053Config cfg;
// Write data to VS1053
void read_data_stream(const uint8_t *data, uint32_t bytes) {
int samples = bytes / sizeof(int16_t);
// split up writes to max 512 samples
writeData<int16_t>(&out, (int16_t*) data, samples, 512);
}
// for esp_a2d_audio_state_t see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/bluetooth/esp_a2dp.html#_CPPv421esp_a2d_audio_state_t
void audio_state_changed(esp_a2d_audio_state_t state, void *ptr){
Serial.println(a2dp_sink.to_str(state));
switch(state){
case ESP_A2D_AUDIO_STATE_STOPPED:
case ESP_A2D_AUDIO_STATE_REMOTE_SUSPEND:
// add new wav header
out.end();
out.begin(cfg);
break;
}
}
void setup() {
Serial.begin(115200);
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Info);
// setup VS1053
cfg = out.defaultConfig();
cfg.sample_rate = 44100;
cfg.channels = 2;
cfg.bits_per_sample = 16;
// Use your custom pins or define in AudioCodnfig.h
//cfg.cs_pin = VS1053_CS;
//cfg.dcs_pin = VS1053_DCS;
//cfg.dreq_pin = VS1053_DREQ;
// cfg.reset_pin = //VS1053_RESET;
out.begin(cfg);
// register callbacks
a2dp_sink.set_stream_reader(read_data_stream, false);
a2dp_sink.set_on_audio_state_changed(audio_state_changed);
// Start Bluetooth Audio Receiver
a2dp_sink.set_auto_reconnect(false);
a2dp_sink.start("a2dp-vs1053");
}
void loop() {
}