Hi WMXZ,
With the sketch I posted, AudioMemoryUsageMax() returns 2.
I set AudioMemory(50) and reduced the SD write buffer from 64k to 1k - same interruption every 100ms (though its duration was shorter, since less data was being read).
Here's the updated sketch:
Code:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include "SdFat.h"
#define FILE_TRANSFER_BUFFER_SIZE 1000
#define N_BUFFERS_IN_FILE 100
AudioPlayQueue queue1;
AudioPlayQueue queue2;
AudioOutputI2S i2s1;
AudioConnection patchCord1(queue1, 0, i2s1, 0);
AudioConnection patchCord2(queue2, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1;
// MicroSD vars
SdFs SDcard;
FsFile Wave0; // File on microSD card
byte fileTransferBuffer[FILE_TRANSFER_BUFFER_SIZE] = {0};
uint32_t playbackFilePos = 0;
bool ready = false; // SD busy flag
int16_t Zeros[256] = {0}; // An empty audio waveform
uint32_t startTime = 0;
uint32_t currentTime = 0;
void setup() {
AudioMemory(50);
sgtl5000_1.enable();
sgtl5000_1.volume(0.5);
SDcard.begin(SdioConfig(FIFO_SDIO));
writeTestFile();
Wave0 = SDcard.open("Wave0.wfm", O_RDWR | O_CREAT);
Wave0.seek(0);
startTime = micros();
}
void loop() {
//------ Fill audio buffers-------
int16_t *p1 = queue1.getBuffer();
int16_t *p2 = queue2.getBuffer();
memcpy(p1, Zeros, 256);
memcpy(p2, Zeros, 256);
queue1.playBuffer();
queue2.playBuffer();
//------ Read a buffer of data from microSD card every 100ms (disrupts playback!) -----
currentTime = micros();
if (currentTime - startTime > 100000) {
startTime = currentTime;
Wave0.read(fileTransferBuffer, FILE_TRANSFER_BUFFER_SIZE);
playbackFilePos += FILE_TRANSFER_BUFFER_SIZE;
if (playbackFilePos > N_BUFFERS_IN_FILE*FILE_TRANSFER_BUFFER_SIZE) {
Wave0.seek(0);
}
}
}
void writeTestFile() {
SDcard.remove("Wave0.wfm");
Wave0 = SDcard.open("Wave0.wfm", O_RDWR | O_CREAT);
Wave0.seek(0);
for (uint32_t i = 0; i < N_BUFFERS_IN_FILE; i++) {
Wave0.write(fileTransferBuffer, FILE_TRANSFER_BUFFER_SIZE);
while (sdBusy()) {}
}
delayMicroseconds(100000);
Wave0.close();
}
bool sdBusy() {
return ready ? SDcard.card()->isBusy() : false;
}
I also tried using AudioSynthWaveformSine with amplitude set to 0 instead of manually filling the audio queue, same result:
Code:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include "SdFat.h"
#define FILE_TRANSFER_BUFFER_SIZE 1000
#define N_BUFFERS_IN_FILE 100
AudioOutputI2S i2s1;
AudioSynthWaveformSine sine1;
AudioConnection patchCord1(sine1, 0, i2s1, 0);
AudioConnection patchCord2(sine1, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1;
// MicroSD vars
SdFs SDcard;
FsFile Wave0; // File on microSD card
byte fileTransferBuffer[FILE_TRANSFER_BUFFER_SIZE] = {0};
uint32_t playbackFilePos = 0;
bool ready = false; // SD busy flag
uint32_t startTime = 0;
uint32_t currentTime = 0;
void setup() {
AudioMemory(50);
sine1.amplitude(0);
sine1.frequency(1000);
sgtl5000_1.enable();
sgtl5000_1.volume(0.5);
SDcard.begin(SdioConfig(FIFO_SDIO));
writeTestFile();
Wave0 = SDcard.open("Wave0.wfm", O_RDWR | O_CREAT);
Wave0.seek(0);
startTime = micros();
}
void loop() {
//------ Read a buffer of data from microSD card every 100ms (disrupts playback!) -----
currentTime = micros();
if (currentTime - startTime > 100000) {
startTime = currentTime;
Wave0.read(fileTransferBuffer, FILE_TRANSFER_BUFFER_SIZE);
playbackFilePos += FILE_TRANSFER_BUFFER_SIZE;
if (playbackFilePos > N_BUFFERS_IN_FILE*FILE_TRANSFER_BUFFER_SIZE) {
Wave0.seek(0);
}
}
}
void writeTestFile() {
SDcard.remove("Wave0.wfm");
Wave0 = SDcard.open("Wave0.wfm", O_RDWR | O_CREAT);
Wave0.seek(0);
for (uint32_t i = 0; i < N_BUFFERS_IN_FILE; i++) {
Wave0.write(fileTransferBuffer, FILE_TRANSFER_BUFFER_SIZE);
while (sdBusy()) {}
}
delayMicroseconds(100000);
Wave0.close();
}
bool sdBusy() {
return ready ? SDcard.card()->isBusy() : false;
}
One detail I didn't specify before: I ran these tests with two microSD cards: Sandisk Ultra (16GB) and Sandisk Extreme Pro (32GB), both formatted as Fat32.
The DAC output level seems to change by a few bits during some (but not all) of these SDIO interruptions - it sometimes oscillates between two values (shown in the first image in my previous post). The buffers only contain 0's, so I'm not sure where the odd values are being read from.
-J