I'm testing the ability of the Teensy (3.2 with Audio Board and 3.5) to record two channels of audio to the SD card and get write interruptions in the recorded stream. Mono works fine. Any hints on how to do this are welcome.
I'm writing tow files concurrently to the SD card, each using its own queue object from the teensy Audio Library.
The occasional write timing increases can be seen in this sample print output.
SD write L, us=1260
SD write R, us=1249
SD write L, us=1268
SD write R, us=1263
SD write R, us=20907
SD write L, us=91518
SD write R, us=89989
SD write L, us=91151
SD write R, us=89601
Below is my test code FYI.
I'm writing tow files concurrently to the SD card, each using its own queue object from the teensy Audio Library.
The occasional write timing increases can be seen in this sample print output.
SD write L, us=1260
SD write R, us=1249
SD write L, us=1268
SD write R, us=1263
SD write R, us=20907
SD write L, us=91518
SD write R, us=89989
SD write L, us=91151
SD write R, us=89601
Below is my test code FYI.
Code:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
// GUItool: begin automatically generated code
AudioPlaySdRaw playRaw1; //xy=264,355
AudioSynthWaveformSine sine1; //xy=273,465
AudioSynthWaveformSine sine2;
//AudioSynthNoiseWhite noise1; //xy=282,522
AudioRecordQueue queue1; //xy=425,489
AudioRecordQueue queue2;
AudioOutputI2S i2s1; //xy=451,351
AudioConnection patchCord1(playRaw1, 0, i2s1, 0);
AudioConnection patchCord2(playRaw1, 0, i2s1, 1);
AudioConnection patchCord3(sine1, queue1);
AudioConnection patchCord4(sine2, queue2);
//AudioConnection patchCord4(noise1, queue1);
// GUItool: end automatically generated code
AudioControlSGTL5000 sgtl5000_1; //xy=265,212
// which input on the audio shield will be used?
//const int myInput = AUDIO_INPUT_LINEIN;
const int myInput = AUDIO_INPUT_MIC;
// Use these with the Teensy 3.5 & 3.6 SD card
#define SDCARD_CS_PIN BUILTIN_SDCARD // 254?
#define SDCARD_MOSI_PIN 11 // not actually used
#define SDCARD_SCK_PIN 13 // not actually used
// Remember which mode we're doing
int mode = 0; // 0=stopped, 1=recording, 2=playing
unsigned long Timer;
// The file where data is recorded
File frecL;
File frecR;
void setup() {
// Audio connections require memory, and the record queue
// uses this memory to buffer incoming audio.
AudioMemory(60);
// Enable the audio shield, select input, and enable output
sgtl5000_1.enable();
sgtl5000_1.inputSelect(myInput);
sgtl5000_1.volume(0.5);
// set sine osc
sine1.amplitude(1.0);
sine1.frequency(440);
sine2.amplitude(1.0);
sine2.frequency(261);
// set up ch 2 noise
//noise1.amplitude(1.0);
// Initialize the SD card
SPI.setMOSI(SDCARD_MOSI_PIN);
SPI.setSCK(SDCARD_SCK_PIN);
if (!(SD.begin(SDCARD_CS_PIN))) {
// stop here if no SD card, but print a message
while (1) {
Serial.println("Unable to access the SD card");
delay(500);
}
}
Timer = millis();
startRecording();
}
void loop() {
if((millis()-Timer)>5000) {
stopRecording();
startPlaying();
while(playRaw1.isPlaying()) {
}
stopPlaying();
Timer = millis();
startRecording();
}
else {
continueRecording();
}
}
void startRecording() {
Serial.println("startRecording");
if (SD.exists("RECORD_L.RAW")) {
SD.remove("RECORD_L.RAW");
}
if (SD.exists("RECORD_R.RAW")) {
SD.remove("RECORD_R.RAW");
}
frecL = SD.open("RECORD_L.RAW", FILE_WRITE);
frecR = SD.open("RECORD_R.RAW", FILE_WRITE);
if (frecL) {
queue1.begin();
mode = 1;
}
if (frecR) {
queue2.begin();
mode = 1;
}
}
void continueRecording() {
if (queue1.available() >= 2) {
byte buffer[512];
memcpy(buffer, queue1.readBuffer(), 256);
queue1.freeBuffer();
memcpy(buffer+256, queue1.readBuffer(), 256);
queue1.freeBuffer();
// write all 512 bytes to the SD card
elapsedMicros usec = 0;
frecL.write(buffer, 512);
Serial.print("SD write L, us=");
Serial.println(usec);
}
if (queue2.available() >= 2) {
byte buffer[512];
memcpy(buffer, queue2.readBuffer(), 256);
queue2.freeBuffer();
memcpy(buffer+256, queue2.readBuffer(), 256);
elapsedMicros usec = 0;
queue2.freeBuffer();
// write all 512 bytes to the SD card
//elapsedMicros usec = 0;
frecR.write(buffer, 512);
Serial.print("SD write R, us=");
Serial.println(usec);
}
}
void stopRecording() {
Serial.println("stopRecording");
queue1.end();
queue2.end();
if (mode == 1) {
while (queue1.available() > 0) {
frecL.write((byte*)queue1.readBuffer(), 256);
queue1.freeBuffer();
}
frecL.close();
while (queue2.available() > 0) {
frecR.write((byte*)queue2.readBuffer(), 256);
queue2.freeBuffer();
}
frecR.close();
}
mode = 0;
}
void startPlaying() {
Serial.println("startPlaying");
playRaw1.play("RECORD_L.RAW");
mode = 2;
}
void continuePlaying() {
if (!playRaw1.isPlaying()) {
playRaw1.stop();
mode = 0;
}
}
void stopPlaying() {
Serial.println("stopPlaying");
if (mode == 2) playRaw1.stop();
//mode = 0;
}
Last edited: