|
|
|
/**
|
|
|
|
* ESP32 Soundboard
|
|
|
|
*
|
|
|
|
* Hendriks Projekt
|
|
|
|
*
|
|
|
|
* https://dev.xd0.de/hendrik/soundboard
|
|
|
|
*/
|
|
|
|
#include "Arduino.h"
|
|
|
|
|
|
|
|
#include "keyboard.h"
|
|
|
|
#include "sdcard.h"
|
|
|
|
#include "sound.h"
|
|
|
|
#include "ringbuf.h"
|
|
|
|
|
|
|
|
#define VERSION "0.0"
|
|
|
|
#define LED_PIN 21
|
|
|
|
#define BUF_LENGTH 1024
|
|
|
|
|
|
|
|
#define WIFI_SSID "ssid"
|
|
|
|
#define WIFI_PASSWORD "password"
|
|
|
|
|
|
|
|
Keyboard keyboard;
|
|
|
|
SDCard sdcard;
|
|
|
|
Sound sound;
|
|
|
|
Ringbuf ringbuf = Ringbuf((size_t) BUF_LENGTH);
|
|
|
|
|
|
|
|
void sd_read_task(void *pvParameter) {
|
|
|
|
sdcard.open("/T1.wav");
|
|
|
|
for ( ;; ) {
|
|
|
|
uint16_t *start_ptr = ringbuf.getWrite();
|
|
|
|
size_t size_avail = ringbuf.getWriteAvail();
|
|
|
|
int num_samples = 0;
|
|
|
|
if (size_avail > 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
|
|
|
|
}
|
|
|
|
Serial.println("sdcard: EOF");
|
|
|
|
sdcard.close();
|
|
|
|
vTaskDelete( NULL );
|
|
|
|
}
|
|
|
|
|
|
|
|
void i2s_write_task(void *pvParameter) {
|
|
|
|
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<size_avail; i++) {
|
|
|
|
unsigned int sample = ((unsigned short) start_ptr[i] << 16 & 0xffff0000) | ((unsigned short) start_ptr[i]);
|
|
|
|
int num_pushed_bytes = i2s_push_sample(sound.i2s_num, (char *)&sample, 0);
|
|
|
|
num_samples += num_pushed_bytes/4;
|
|
|
|
}
|
|
|
|
ringbuf.setRead(num_samples);
|
|
|
|
Serial.print(num_samples,DEC);
|
|
|
|
Serial.println(" pushed samples to i2s");
|
|
|
|
vTaskDelay(20 / portTICK_PERIOD_MS);
|
|
|
|
}
|
|
|
|
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();
|
|
|
|
|
|
|
|
xTaskCreate(&sd_read_task, "read_task", 2048, NULL, 5, NULL);
|
|
|
|
xTaskCreate(&i2s_write_task, "write_task", 1024,NULL,5,NULL );
|
|
|
|
|
|
|
|
delay(1000);
|
|
|
|
}
|
|
|
|
|
|
|
|
void loop()
|
|
|
|
{
|
|
|
|
bool touched = false;
|
|
|
|
for(int i=0; i<=9; i++) {
|
|
|
|
if (keyboard.getTouchDetected(i) == true) {
|
|
|
|
touched = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (touched == true) {
|
|
|
|
// turn the LED on (HIGH is the voltage level)
|
|
|
|
digitalWrite(LED_PIN, HIGH);
|
|
|
|
sound.play();
|
|
|
|
} else {
|
|
|
|
// turn the LED off by making the voltage LOW
|
|
|
|
digitalWrite(LED_PIN, LOW);
|
|
|
|
// sound.stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// wait for a second
|
|
|
|
delay(50);
|
|
|
|
}
|