3#include "AudioTools/AudioCodecs/AudioEncoded.h"
4#include "AudioTools/AudioCodecs/CodecCopy.h"
5#include "AudioTools/AudioCodecs/CodecWAV.h"
6#include "AudioTools/CoreAudio/AudioStreams.h"
9#include "VS1053Driver.h"
16enum VS1053Mode { ENCODED_MODE, PCM_MODE, MIDI_MODE };
62 VS1053_INPUT input_device = VS1053_MIC;
84 VS1053StreamOut(VS1053* vs) { p_VS1053 = vs; }
85 size_t write(
const uint8_t* data,
size_t len)
override {
86 if (p_VS1053 ==
nullptr) {
91 p_VS1053->playChunk((uint8_t*)data, len);
96 VS1053* p_VS1053 =
nullptr;
109 if (mode == RX_MODE) {
143 LOGI(
"is_midi: %s", cfg.
is_midi ?
"true" :
"false");
144 LOGI(
"cs_pin: %d", cfg.
cs_pin);
145 LOGI(
"dcs_pin: %d", cfg.
dcs_pin);
150 if (p_vs1053 ==
nullptr) {
152 p_vs1053_out =
new VS1053StreamOut(p_vs1053);
158 LOGI(
"SPI not started");
162 LOGI(
"Setting reset pin to high: %d", cfg.
reset_pin);
170 if (p_out ==
nullptr) {
176 const int MIDI_MODE = 100;
188 result = beginMidi();
196 LOGD(
"Mode not supported");
202 if (!result) LOGE(
"begin failed");
209 if (p_out !=
nullptr) {
215 if (p_vs1053_out !=
nullptr) {
217 p_vs1053_out =
nullptr;
219 if (p_vs1053 !=
nullptr) {
221 p_vs1053->stopSong();
222 p_vs1053->softReset();
234 LOGD(
"setVolume: %f",
volume);
235 if (p_vs1053 !=
nullptr) {
237 p_vs1053->setVolume(
volume * 100.0f);
245 if (p_vs1053 ==
nullptr)
return -1.0f;
246 return p_vs1053->getVolume() / 100.0f;
255 LOGD(
"setBalance: %f",
balance);
256 if (p_vs1053 !=
nullptr) {
257 p_vs1053->setBalance(
balance * 100.0f);
263 if (p_vs1053 ==
nullptr)
return -1.0f;
264 return static_cast<float>(p_vs1053->getBalance()) / 100.0f;
268 virtual size_t write(
const uint8_t* data,
size_t len)
override {
270 if (len == 0)
return 0;
271 if (p_out ==
nullptr) {
272 LOGE(
"vs1053 is closed");
275 return p_out->write(data, len);
288 if (p_out !=
nullptr) {
289 logError(
"setEncoder");
295 if (enc ==
nullptr) {
304 int available()
override {
306 LOGI(
"available: %d", result);
309 size_t readBytes(uint8_t* data,
size_t len)
override {
317 return static_cast<float>(
getVS1053().treble()) / 100.0;
321 void setTreble(
float val) {
323 if (value < 0.0f) value = 0.0f;
324 if (value > 1.0f) value = 1.0f;
325 LOGD(
"setTreble: %f", value);
332 return static_cast<float>(
getVS1053().bass()) / 100.0;
336 void setBass(
float val) {
338 if (value < 0.0f) value = 0.0f;
339 if (value > 1.0f) value = 1.0f;
340 LOGD(
"setBass: %f", value);
345 void setTrebleFrequencyLimit(uint16_t value) {
346 LOGD(
"setTrebleFrequencyLimit: %u", value);
347 getVS1053().setTrebleFrequencyLimit(value);
350 void setBassFrequencyLimit(uint16_t value) {
351 LOGD(
"setBassFrequencyLimit: %u", value);
352 getVS1053().setBassFrequencyLimit(value);
356 void sendMidiMessage(uint8_t cmd, uint8_t data1, uint8_t data2) {
360 LOGE(
"start with is_midi=true");
363 if (p_vs1053 ==
nullptr) {
364 logError(__FUNCTION__);
367 p_vs1053->sendMidiMessage(cmd, data1, data2);
375 VS1053* p_vs1053 =
nullptr;
376 VS1053StreamOut* p_vs1053_out =
nullptr;
377 EncodedAudioStream* p_out =
nullptr;
379 AudioEncoder* p_encoder = &wav;
385 bool result = p_vs1053->begin();
386 p_vs1053->startSong();
387 p_vs1053->switchToMp3Mode();
388 if (p_vs1053->getChipVersion() ==
391 p_vs1053->loadDefaultVs1053Patches();
403 rec.setSampleRate(cfg.sample_rate);
404 rec.setChannels(cfg.channels);
405 rec.setInput(cfg.input_device);
406 return p_vs1053->beginInput(rec);
413 bool result = p_vs1053->beginMidi();
423 void logError(
const char* str) { LOGE(
"Call %s after begin()", str); }
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:30