-
Notifications
You must be signed in to change notification settings - Fork 62
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
System hangs when repeatedly triggering a wav file on Teensy 4.0 #51
Comments
SdFat uses two 512 byte cache buffers. One for FAT entries and one for file data. If you open multiple files, you will have problems since these caches will be invalidated often. SdFat evolved from a 2008 library for an Arduino Diecimila with a ATmega168, 1 KB SRAM, and 16 KB flash and a single 512 byte sector cache. It would be possible to extend SdFat for provide cache for each file but I have lost interest in developing SdFat. SD cards are not intended to be multi stream devices without huge buffers and file read-ahead. Teensy 4.0 is a nice board but is lacks a decent multi-tasking OS with an integrated file system that can cope with multiple data streams. |
Thanks for taking the time to respond! Totally understandable, that all makes good sense. Do you think a pi running a light as possible os would be better suited for multiple data steams? |
Pi has a better OS since the base is Linux. It depends on how the file system cache is configured. |
Thanks for the replies I will look into it! Regards, Al. |
Hopefully this has fixed the problem. |
Hello! first off thanks for the great lib. its amazing how many projects must be using SDfat now : )
I am trying to rid my system of clicks and pops when loading multiple WAVs on Teensy 4.0, several people have mentioned the issues with SD.h so I am trying sdfat on T4. SdFormatter, SdInfo and TeensySdioDemo are all working well! I can even get one wav playing using my own code and its seems the dropouts when a single wav is triggered repeatedly are much improved. Sadly when I try and trigger 4 wavs at the same time, although they play I loose control of the system at the serial window until they have finished playing. If I trigger two wavs at the same time, I can retrigger a couple of times and then I loose control. I also have the cash register sound that I can trigger as it is handy for debug.
Here is the code... (super lean to keep it simple)
`#define USE_SdFat_ // uncomment for SdFat.h, comment for SD.h lib.
#include "SdFat.h"
SdFat sd;
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
// GUItool: begin automatically generated code
AudioPlayMemory sound0; //xy=257,200
AudioPlaySdWav playSdWav2; //xy=296,375
AudioPlaySdWav playSdWav3; //xy=313,439
AudioPlaySdWav playSdWav1; //xy=324,292
AudioPlaySdWav playSdWav4; //xy=345,516
AudioMixer4 mixer1; //xy=802,203
AudioMixer4 mixer2; //xy=851,322
AudioOutputI2S i2s1; //xy=1069,248
AudioConnection patchCord1(sound0, 0, mixer1, 1);
AudioConnection patchCord2(sound0, 0, mixer2, 2);
AudioConnection patchCord3(playSdWav1, 0, mixer1, 0);
AudioConnection patchCord4(playSdWav1, 1, mixer2, 1);
AudioConnection patchCord5(mixer1, 0, i2s1, 0);
AudioConnection patchCord6(mixer2, 0, i2s1, 1);
// GUItool: end automatically generated code
// Use these with the Teensy Audio Shield
//#define SDCARD_CS_PIN 10
//#define SDCARD_MOSI_PIN 7
//#define SDCARD_SCK_PIN 14
// SDCARD_SS_PIN is defined for the built-in SD on some boards.
#ifndef SDCARD_SS_PIN
const uint8_t SD_CS_PIN = SS;
#else // SDCARD_SS_PIN
// Assume built-in SD is used.
const uint8_t SD_CS_PIN = SDCARD_SS_PIN;
#endif // SDCARD_SS_PIN
// Use these for the SD+Wiz820 or other adaptors
//#define SDCARD_CS_PIN 4
//#define SDCARD_MOSI_PIN 11
//#define SDCARD_SCK_PIN 13
int inByte = 0;
byte newDATAin = 1;
#include "AudioSampleCashregister.h" // http://www.freesound.org/people/kiddpark/sounds/201159/
void setup() {
Serial.begin(115200);
// Audio connections require memory to work. For more
// detailed information, see the MemoryAndCpuUsage example
AudioMemory(100);
//SPI.setMOSI(SDCARD_MOSI_PIN);
///SPI.setSCK(SDCARD_SCK_PIN);
if (!sd.begin(SdioConfig(FIFO_SDIO))) {
// stop here, but print a message repetitively
while (1) {
Serial.println("Unable to access the SD card");
delay(500);
}
}
}
void loop() {
switch (Serial.read()) {
case 's': {
Serial.println("s");
// envelope1.noteOff();
// envelope2.noteOff();tttttttttttt
playSdWav1.stop();
playSdWav2.stop();
playSdWav3.stop();
playSdWav4.stop();
//playSdWav5.stop();
//playSdWav6.stop();
//playSdWav7.stop();
//playSdWav8.stop();
sound0.play(AudioSampleCashregister);
}
break;
case 't': {
sound0.stop();
playSdWav1.play("10BAB1.WAV");
playSdWav2.play("10BAB2.WAV");
playSdWav3.play("10BAB3.WAV");
playSdWav4.play("10BAB4.WAV");
}
break;
case 'y': {
sound0.stop();
playSdWav1.play("10BAB2.WAV");
delay(5);
//playSdWav2.play("10BAB2.WAV");
//playSdWav3.play("10BAB3.WAV");
//playSdWav4.play("10BAB4.WAV");
}
break;
}
}`
Here is the audio used in the above example: http://donjohnstonmusic.co.uk/tr/sinewavs.zip
I am aware three of the wav players are not connected to any outputs, they still play and cause the issue and its the same when they are connected. is there something in the SDfat settings I can tweak to prevent this hang?
all help very gratefully received, I am properly stuck
The text was updated successfully, but these errors were encountered: