/*
* A simple hardware test which receives audio from the audio shield
* Line-In pins and send it to the Line-Out pins and headphone jack.
*
* This example code is in the public domain.
*/
#include <Bounce.h>
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
// GUItool: begin automatically generated code
AudioInputI2S i2s_in; //xy=200,69
AudioMixer4 mix1;
AudioOutputI2S i2s_out; //xy=365,94
AudioRecordQueue queue_raw; //xy=462,208
AudioRecordQueue queue_filtered; //xy=652,225
AudioConnection patchCord1(i2s_in, 0, mix1, 0);
AudioConnection patchCord2(i2s_in, 0, queue_raw, 0);
AudioConnection patchCord3(i2s_in, 1, mix1, 1);
AudioConnection patchCord4(i2s_in, 0, i2s_out, 0);
AudioConnection patchCord5(i2s_in, 1, i2s_out, 1);
AudioConnection patchCord6(mix1, 0, queue_filtered, 0);
AudioControlSGTL5000 sgtl5000_1; //xy=302,184
int pin_record=0;
int pin_stop=1;
//int pin_green=17;
//int pin_red=16;
Bounce buttonRecord = Bounce(pin_record, 8);
Bounce buttonStop = Bounce(pin_stop, 8); // 8 = 8 ms debounce time
File raw;
File filtered;
int mode = 0;
bool green,red=LOW;
// GUItool: end automatically generated code
const int myInput = AUDIO_INPUT_LINEIN;
//const int myInput = AUDIO_INPUT_MIC;
void setup()
{
//digitalWrite(pin_red, red);
//digitalWrite(pin_green, green);
delay(10000);
Serial.begin(115200);
Serial.println("Teensy Audio filter v01");
pinMode(pin_record, INPUT_PULLUP); //Start Record
pinMode(pin_stop, INPUT_PULLUP); //Stop Record
//pinMode(pin_green, OUTPUT);
//pinMode(pin_red, OUTPUT);
// Audio connections require memory to work. For more
// detailed information, see the MemoryAndCpuUsage example
AudioMemory(60);
mix1.gain(0,1);
mix1.gain(1,-1);
// Enable the audio shield, select input, and enable output
sgtl5000_1.enable();
sgtl5000_1.inputSelect(myInput);
sgtl5000_1.volume(0.6);
SPI.setMOSI(7);
SPI.setSCK(14);
if (!(SD.begin(10)))
{
// stop here if no SD card, but print a message
while (1)
{
Serial.println("Unable to access the SD card");
delay(500);
}
}
// digitalWrite(pin_green, HIGH);
}
void loop()
{
buttonRecord.update();
buttonStop.update();
if (buttonRecord.fallingEdge()) {
Serial.println("Record Button Press");
if (mode == 0)
{
startRecording();
//digitalWrite(pin_red, HIGH);
//digitalWrite(pin_green, LOW);
}
}
if (buttonStop.fallingEdge())
{
Serial.println("Stop Button Press");
if (mode == 1) stopRecording();
//digitalWrite(pin_red, LOW);
//digitalWrite(pin_green, HIGH);
}
if (mode == 1)
{
continueRecording();
}
/*
int temp1=millis()%500;
if ((temp1==0)&(mode == 0))
{
green=!green;
digitalWrite(pin_green, green);
}
*/
}
void startRecording()
{
Serial.println("startRecording");
if (SD.exists("RAW.RAW"))
{
// The SD library writes new data to the end of the
// file, so to start a new recording, the old file
// must be deleted before new data is written.
SD.remove("RAW.RAW");
}
if (SD.exists("FILTERED.RAW"))
{
// The SD library writes new data to the end of the
// file, so to start a new recording, the old file
// must be deleted before new data is written.
SD.remove("FILTERED.RAW");
}
raw = SD.open("RAW.RAW", FILE_WRITE);
if (raw)
{
queue_raw.begin();
mode = 1;
}
filtered = SD.open("FILTERED.RAW", FILE_WRITE);
if (filtered)
{
queue_filtered.begin();
mode = 1;
}
}
void continueRecording()
{
if (queue_filtered.available() >= 2)
{
byte buffer[512];
memcpy(buffer, queue_filtered.readBuffer(), 256);
queue_filtered.freeBuffer();
memcpy(buffer+256, queue_filtered.readBuffer(), 256);
queue_filtered.freeBuffer();
elapsedMicros usec = 0;
filtered.write(buffer, 512);
Serial.print("SD write, us=");
Serial.println(usec);
}
if (queue_raw.available() >= 2)
{
byte buffer[512];
memcpy(buffer, queue_raw.readBuffer(), 256);
queue_raw.freeBuffer();
memcpy(buffer+256, queue_raw.readBuffer(), 256);
queue_raw.freeBuffer();
elapsedMicros usec = 0;
raw.write(buffer, 512);
Serial.print("SD write, us=");
Serial.println(usec);
}
/*
int temp=millis()%1000;
if (temp==0)
{
red=!red;
digitalWrite(pin_red, red);
}
*/
}
void stopRecording()
{
Serial.println("stopRecording");
queue_filtered.end();
if (mode == 1) {
while (queue_filtered.available() > 0) {
filtered.write((byte*)queue_filtered.readBuffer(), 256);
queue_filtered.freeBuffer();
}
filtered.close();
}
queue_raw.end();
if (mode == 1) {
while (queue_raw.available() > 0) {
raw.write((byte*)queue_raw.readBuffer(), 256);
queue_raw.freeBuffer();
}
raw.close();
}
mode = 0;
}