schreibfaul1 / ESP32-audioI2S

Play mp3 files from SD via I2S
GNU General Public License v3.0
1.09k stars 284 forks source link

Does not play sequential mp3/flac files from directory #740

Closed ddprog closed 3 months ago

ddprog commented 4 months ago

The example does not work on mp3/flac files on an ESP32-S3-N16R8 with PSRAM, but it works fine on an ESP32 (mp3 only). Plays one file and "audioHeader reading timeout". I can't figure out what the reason is.

Configuration for ESP32-S3-N16R8:

platformio.ini

platform = espressif32
board = esp32-s3-devkitc-1-n16r8v
framework = arduino
upload_port = COM9
monitor_port = COM9
upload_speed = 921600
monitor_speed = 115200
lib_deps = 
    https://github.com/schreibfaul1/ESP32-audioI2S/

main.cpp

#include "Arduino.h"
#include "Audio.h"
#include "FS.h"
#include "SD.h"
#include "WiFi.h"
#include <vector>

// Digital I/O used
#define SD_CS 10
#define SPI_MOSI 11
#define SPI_MISO 13
#define SPI_SCK 12
#define I2S_DOUT 18
#define I2S_BCLK 4
#define I2S_LRC 5

String ssid = "***";
String password = "***";

void listDir(fs::FS &fs, const char *dirname, uint8_t levels); // proto
std::vector<char *> v_audioContent;
Audio audio;

const char audioDir[] = "/flac";

void listDir(fs::FS &fs, const char *dirname, uint8_t levels)
{
    Serial.printf("Listing directory: %s\n", dirname);

    File root = fs.open(dirname);
    if (!root)
    {
        Serial.println("Failed to open directory");
        return;
    }
    if (!root.isDirectory())
    {
        Serial.println("Not a directory");
        return;
    }

    File file = root.openNextFile();
    while (file)
    {
        if (file.isDirectory())
        {
            Serial.print("  DIR : ");
            Serial.println(file.name());
            if (levels)
            {
                listDir(fs, file.path(), levels - 1);
            }
        }
        else
        {
            Serial.print("  FILE: ");
            Serial.print(file.name());
            Serial.print("  SIZE: ");
            Serial.println(file.size());
            v_audioContent.insert(v_audioContent.begin(), strdup(file.path()));
        }
        file = root.openNextFile();
    }
    Serial.printf("num files %i", v_audioContent.size());
    Serial.println("");
    root.close();
    file.close();
}

void vector_clear_and_shrink(vector<char *> &vec)
{
    uint size = vec.size();
    for (int i = 0; i < size; i++)
    {
        if (vec[i])
        {
            free(vec[i]);
            vec[i] = NULL;
        }
    }
    vec.clear();
    vec.shrink_to_fit();
}

// optional
void audio_info(const char *info)
{
    Serial.print("info        ");
    Serial.println(info);
}
void audio_id3data(const char *info)
{ // id3 metadata
    Serial.print("id3data     ");
    Serial.println(info);
}
void audio_eof_mp3(const char *info)
{ // end of file
    Serial.print("eof_mp3     ");
    Serial.println(info);
    if (v_audioContent.size() == 0)
    {
        vector_clear_and_shrink(v_audioContent); // free memory
        return;
    }
    const char *s = (const char *)v_audioContent[v_audioContent.size() - 1];
    Serial.printf("playing %s\n", s);
    audio.connecttoFS(SD, s);
    v_audioContent.pop_back();
}

void setup()
{
    pinMode(SD_CS, OUTPUT);
    digitalWrite(SD_CS, HIGH);
    SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
    SPI.setFrequency(1000000);
    Serial.begin(115200);
    SD.begin(SD_CS);
    WiFi.disconnect();
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid.c_str(), password.c_str());
    while (WiFi.status() != WL_CONNECTED)
        delay(1500);
    audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
    audio.setVolume(21); // default 0...21
    listDir(SD, audioDir, 1);
    if (v_audioContent.size() > 0)
    {
        const char *s = (const char *)v_audioContent[v_audioContent.size() - 1];
        Serial.printf("playing %s\n", s);
        audio.connecttoFS(SD, s);
        v_audioContent.pop_back();
    }
}

void loop()
{
    audio.loop();
}

log file

ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x2b (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x44c
load:0x403c9700,len:0xbd8
load:0x403cc700,len:0x2a80
entry 0x403c98d0
Listing directory: /flac
  FILE: 02-John_O'Callaghan___Betsie_Larkin_-_Save_This_Moment_(Gareth_Emery_remix).flac  SIZE: 60334536
  FILE: 03-Kyau___Albert_-_Be_There_4_U_(Mat_Zo_remix).flac  SIZE: 58474850
  FILE: 04-Menno_De_Jong_-_Turtle_Paradise_(original_mix).flac  SIZE: 65916183
  FILE: 05-W_W_vs_Wezz_Devall_-_Phantom_(original_mix).flac  SIZE: 45157943
  FILE: 06-Jochen_Miller_-_Troucid_(original_mix).flac  SIZE: 54484847
  FILE: 07-Ferry_Corsten_-_Feel_It_(radio_edit).flac  SIZE: 26545918
  FILE: 08-Lange_Presents_LNG_-_Harmony_Will_Kick_You_In_The_Ass_(Lange_mix).flac  SIZE: 51053818
  FILE: 09-Timur_Shafiev_-_Thank_You_(feat_Dasha_-_Dallaz_Project_remix).flac  SIZE: 67713251
  FILE: 10-Orjan_Nilsen_-_Mjuzik_(original_mix).flac  SIZE: 59545703
  FILE: 11-Ronski_Speed_Presents_Sun_Decade_-_U_Got_Me_(feat_Emma_Lock_-_club_mix).flac  SIZE: 37668791
  FILE: 12-Arty_-_The_Wall_(feat_Tania_Zygar_-_radio_edit).flac  SIZE: 32183389
  FILE: 13-Right_Face_-_Deep_Impression_(Adam_Nickey_remix).flac  SIZE: 64598077
  FILE: 14-Juventa_-_Dionysia_(Skytech_remix).flac  SIZE: 58282307
  FILE: 15-Impulsive_Drive_-_Blue_Skies_(Bjorn_Akesson_remix).flac  SIZE: 63369679
  FILE: 16-Galen_Behr_vs_Hydroid_-_Carabella_(Galen_Behr_vs_Orjan_Nilsen_remix_-_classic_bonus_track).flac  SIZE: 59560626
num files 15
playing /flac/02-John_O'Callaghan___Betsie_Larkin_-_Save_This_Moment_(Gareth_Emery_remix).flac
info        PSRAM found, inputBufferSize: 638965 bytes
info        buffers freed, free Heap: 249392 bytes
info        Reading file: "/flac/02-John_O'Callaghan___Betsie_Larkin_-_Save_This_Moment_(Gareth_Emery_remix).flac"
info        FLACDecoder has been initialized, free Heap: 244960 bytes , free stack 5584 DWORDs
info        Content-Length: 60334536
info        FLAC maxBlockSize: 4096
info        FLAC maxFrameSize: 14856
info        FLAC sampleRate: 44100
info        FLAC numChannels: 2
info        FLAC bitsPerSample: 16
info        total samples in stream: 20988289
info        audio file duration: 475 seconds
id3data     VENDOR_STRING: reference libFLAC 1.2.1 20070917
id3data     Album=A State Of Trance Radio Top 15: May 2011
id3data     Artist=John O'Callaghan & Betsie Larkin
id3data     Genre=Trance
id3data     Title=Save This Moment (Gareth Emery Remix)
id3data     DATE=2011
id3data     TRACKNUMBER=02
info        Audio-Length: 60325386
info        stream ready
info        syncword found at pos 0
info        Channels: 2
info        SampleRate: 44100
info        BitsPerSample: 16
info        BitRate: 93798
info        Closing audio file "02-John_O'Callaghan___Betsie_Larkin_-_Save_This_Moment_(Gareth_Emery_remix).flac"
eof_mp3     02-John_O'Callaghan___Betsie_Larkin_-_Save_This_Moment_(Gareth_Emery_remix).flac
playing /flac/03-Kyau___Albert_-_Be_There_4_U_(Mat_Zo_remix).flac
info        buffers freed, free Heap: 249284 bytes
info        Reading file: "/flac/03-Kyau___Albert_-_Be_There_4_U_(Mat_Zo_remix).flac"
info        FLACDecoder has been initialized, free Heap: 244880 bytes , free stack 5488 DWORDs
info        End of file "02-John_O'Callaghan___Betsie_Larkin_-_Save_This_Moment_(Gareth_Emery_remix).flac"
[481291][E][Audio.cpp:3096] processLocalFile(): audioHeader reading timeout
github-actions[bot] commented 3 months ago

This issue is stale because it has been open for 30 days with no activity.

github-actions[bot] commented 3 months ago

This issue was closed because it has been inactive for 14 days since being marked as stale.