#include "Arduino.h" #include "WiFi.h" #include "Audio.h" // Digital I/O used #define I2S_DOUT 25 #define I2S_BCLK 27 #define I2S_LRC 26 Audio audio; String ssid = "******"; String password = "******"; //**************************************************************************************** // A U D I O _ T A S K * //**************************************************************************************** struct audioMessage{ uint8_t cmd; const char* txt; uint32_t value; uint32_t ret; } audioTxMessage, audioRxMessage; enum : uint8_t { SET_VOLUME, GET_VOLUME, CONNECTTOHOST, CONNECTTOSD }; QueueHandle_t audioSetQueue = NULL; QueueHandle_t audioGetQueue = NULL; void CreateQueues(){ audioSetQueue = xQueueCreate(10, sizeof(struct audioMessage)); audioGetQueue = xQueueCreate(10, sizeof(struct audioMessage)); } void audioTask(void *parameter) { CreateQueues(); if(!audioSetQueue || !audioGetQueue){ log_e("queues are not initialized"); while(true){;} // endless loop } struct audioMessage audioRxTaskMessage; struct audioMessage audioTxTaskMessage; audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT); audio.setVolume(15); // 0...21 while(true){ if(xQueueReceive(audioSetQueue, &audioRxTaskMessage, 1) == pdPASS) { if(audioRxTaskMessage.cmd == SET_VOLUME){ audioTxTaskMessage.cmd = SET_VOLUME; audio.setVolume(audioRxTaskMessage.value); audioTxTaskMessage.ret = 1; xQueueSend(audioGetQueue, &audioTxTaskMessage, portMAX_DELAY); } else if(audioRxTaskMessage.cmd == CONNECTTOHOST){ audioTxTaskMessage.cmd = CONNECTTOHOST; audioTxTaskMessage.ret = audio.connecttohost(audioRxTaskMessage.txt); xQueueSend(audioGetQueue, &audioTxTaskMessage, portMAX_DELAY); } else if(audioRxTaskMessage.cmd == CONNECTTOSD){ audioTxTaskMessage.cmd = CONNECTTOSD; audioTxTaskMessage.ret = audio.connecttoSD(audioRxTaskMessage.txt); xQueueSend(audioGetQueue, &audioTxTaskMessage, portMAX_DELAY); } else if(audioRxTaskMessage.cmd == GET_VOLUME){ audioTxTaskMessage.cmd = GET_VOLUME; audioTxTaskMessage.ret = audio.getVolume(); xQueueSend(audioGetQueue, &audioTxTaskMessage, portMAX_DELAY); } else{ log_i("error"); } } audio.loop(); } } void audioInit() { xTaskCreatePinnedToCore( audioTask, /* Function to implement the task */ "audioplay", /* Name of the task */ 5000, /* Stack size in words */ NULL, /* Task input parameter */ 2 | portPRIVILEGE_BIT, /* Priority of the task */ NULL, /* Task handle. */ 1 /* Core where the task should run */ ); } audioMessage transmitReceive(audioMessage msg){ xQueueSend(audioSetQueue, &msg, portMAX_DELAY); if(xQueueReceive(audioGetQueue, &audioRxMessage, portMAX_DELAY) == pdPASS){ if(msg.cmd != audioRxMessage.cmd){ log_e("wrong reply from message queue"); } } return audioRxMessage; } void audioSetVolume(uint8_t vol){ audioTxMessage.cmd = SET_VOLUME; audioTxMessage.value = vol; audioMessage RX = transmitReceive(audioTxMessage); } uint8_t audioGetVolume(){ audioTxMessage.cmd = GET_VOLUME; audioMessage RX = transmitReceive(audioTxMessage); return RX.ret; } bool audioConnecttohost(const char* host){ audioTxMessage.cmd = CONNECTTOHOST; audioTxMessage.txt = host; audioMessage RX = transmitReceive(audioTxMessage); return RX.ret; } bool audioConnecttoSD(const char* filename){ audioTxMessage.cmd = CONNECTTOSD; audioTxMessage.txt = filename; audioMessage RX = transmitReceive(audioTxMessage); return RX.ret; } //**************************************************************************************** // S E T U P * //**************************************************************************************** void setup() { Serial.begin(115200); WiFi.begin(ssid.c_str(), password.c_str()); while (WiFi.status() != WL_CONNECTED) delay(1500); audioInit(); audioConnecttohost("http://mp3.ffh.de/radioffh/hqlivestream.mp3"); audioSetVolume(15); log_i("current volume is: %d", audioGetVolume()); } //**************************************************************************************** // L O O P * //**************************************************************************************** void loop(){ // your own code here } //***************************************************************************************** // E V E N T S * //***************************************************************************************** void audio_info(const char *info){ Serial.print("info "); Serial.println(info); }