/** * ESP32 Soundboard * * Hendriks Projekt * * https://dev.xd0.de/hendrik/soundboard */ #include "Arduino.h" #include "hardware.h" #include "keyboard.h" #include "sdcard.h" #include "sound.h" #include "ringbuf.h" #define VERSION "0.0" #define WIFI_SSID "ssid" #define WIFI_PASSWORD "password" Keyboard keyboard; SDCard sdcard; Sound sound; Ringbuf ringbuf = Ringbuf((size_t) BUF_LENGTH); TaskHandle_t xTaskRead = NULL; TaskHandle_t xTaskWrite = NULL; bool playing = false; static const char *soundFile[3][3] = {{"/T0.wav", "/T1.wav", "/T2.wav"}, {"/T3.wav", "/T4.wav", "/T5.wav"}, {"/T6.wav", "/T7.wav", "/T8.wav"}}; void i2s_write_task(void *pvParameter) { sound.play(); for ( ;; ) { //TickType_t delay = 10 / portTICK_PERIOD_MS; // max delay: 10ms instead of portMAX_DELAY uint16_t *start_ptr = ringbuf.getRead(); size_t size_avail = ringbuf.getReadAvail(); int num_samples = 0; for (int i=0; i 0) { num_samples = sdcard.read(start_ptr, size_avail); ringbuf.setWrite(num_samples); } Serial.print(num_samples,DEC); Serial.println(" read samples from sdcard"); if (!sdcard.available()) break; // EOF vTaskDelay(20 / portTICK_PERIOD_MS); // 20ms } ringbuf.active = false; Serial.println("sdcard: EOF"); sdcard.close(); vTaskDelete( NULL ); } void setup() { // initialize LED digital pin as an output. pinMode(LED_PIN, OUTPUT); Serial.begin(115200); Serial.println("-------------------------------------"); Serial.print("Soundboard v."); Serial.println(VERSION); Serial.println("https://dev.xd0.de/hendrik/soundboard"); Serial.println("-------------------------------------"); keyboard.init(); sdcard.mount(); sound.init(); static const char *bootSound = "/boot.wav"; xTaskCreate(&sd_read_task, "read_task", 2048, (void*)bootSound, 5, &xTaskRead); } void loop() { bool touched = false; for(int i=0; i<=9; i++) { if (keyboard.getTouchDetected(i) == true) { touched = true; Serial.println("touch"); if (sound.playing == false) { Serial.println("new task"); xTaskCreate(&sd_read_task, "read_task", 2048, (void*)soundFile[i/3][i%3], 5, &xTaskRead); } } } if (touched == true) { // turn the LED on (HIGH is the voltage level) digitalWrite(LED_PIN, HIGH); } else { // turn the LED off by making the voltage LOW digitalWrite(LED_PIN, LOW); } // wait for a second delay(50); }