{"id":14963260,"url":"https://github.com/schreibfaul1/esp32-audioi2s","last_synced_at":"2025-05-14T12:07:42.844Z","repository":{"id":37561555,"uuid":"155110539","full_name":"schreibfaul1/ESP32-audioI2S","owner":"schreibfaul1","description":"Play mp3 files from SD via I2S","archived":false,"fork":false,"pushed_at":"2024-10-29T14:17:36.000Z","size":51853,"stargazers_count":1111,"open_issues_count":36,"forks_count":287,"subscribers_count":34,"default_branch":"master","last_synced_at":"2024-10-29T17:12:11.594Z","etag":null,"topics":["aac","cs4344","esp32","flac","google-tts","i2s","m4a","max98357a","mp3","opus","pcm5102a","uda1334a","webradio"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/schreibfaul1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-28T20:04:31.000Z","updated_at":"2024-10-29T17:05:09.000Z","dependencies_parsed_at":"2023-10-15T12:19:19.447Z","dependency_job_id":"0fb18801-5268-4891-8e78-6587b62b7d92","html_url":"https://github.com/schreibfaul1/ESP32-audioI2S","commit_stats":{"total_commits":1103,"total_committers":29,"mean_commits":38.03448275862069,"dds":0.3825929283771532,"last_synced_commit":"e43d2330d4dddd479d43307c044d09650b8d7b26"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schreibfaul1%2FESP32-audioI2S","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schreibfaul1%2FESP32-audioI2S/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schreibfaul1%2FESP32-audioI2S/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schreibfaul1%2FESP32-audioI2S/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/schreibfaul1","download_url":"https://codeload.github.com/schreibfaul1/ESP32-audioI2S/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248465312,"owners_count":21108243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aac","cs4344","esp32","flac","google-tts","i2s","m4a","max98357a","mp3","opus","pcm5102a","uda1334a","webradio"],"created_at":"2024-09-24T13:31:15.814Z","updated_at":"2025-05-14T12:07:42.793Z","avatar_url":"https://github.com/schreibfaul1.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ESP32-audioI2S\n\n:warning: **This library only works on multi-core chips like ESP32, ESP32-S3 and ESP32-P4. It does not work on the ESP32-S2, ESP32-C3 etc** :warning:\n\nPlays mp3, m4a and wav files from SD card via I2S with external hardware.\nHELIX-mp3 and -aac decoder is included. There is also an OPUS decoder for Fullband, n VORBIS decoder and a FLAC decoder.\nWorks with MAX98357A (3 Watt amplifier with DAC), connected three lines (DOUT, BLCK, LRC) to I2S.\nFor stereo are two MAX98357A necessary. AudioI2S works with UDA1334A (Adafruit I2S Stereo Decoder Breakout Board), PCM5102A and CS4344.\nOther HW may work but not tested. Plays also icy-streams and GoogleTTS. Can be compiled with Arduino IDE. [WIKI](https://github.com/schreibfaul1/ESP32-audioI2S/wiki)\n\n```` c++\n#include \"Arduino.h\"\n#include \"WiFi.h\"\n#include \"Audio.h\"\n#include \"SD.h\"\n#include \"FS.h\"\n\n// Digital I/O used\n#define SD_CS          5\n#define SPI_MOSI      23\n#define SPI_MISO      19\n#define SPI_SCK       18\n#define I2S_DOUT      25\n#define I2S_BCLK      27\n#define I2S_LRC       26\n\nAudio audio;\n\nString ssid =     \"*******\";\nString password = \"*******\";\n\nvoid setup() {\n    pinMode(SD_CS, OUTPUT);      digitalWrite(SD_CS, HIGH);\n    SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);\n    Serial.begin(115200);\n    SD.begin(SD_CS);\n    WiFi.disconnect();\n    WiFi.mode(WIFI_STA);\n    WiFi.begin(ssid.c_str(), password.c_str());\n    while (WiFi.status() != WL_CONNECTED) delay(1500);\n    audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);\n    audio.setVolume(21); // default 0...21\n//  or alternative\n//  audio.setVolumeSteps(64); // max 255\n//  audio.setVolume(63);\n//\n//  *** radio streams ***\n    audio.connecttohost(\"http://stream.antennethueringen.de/live/aac-64/stream.antennethueringen.de/\"); // aac\n//  audio.connecttohost(\"http://mcrscast.mcr.iol.pt/cidadefm\");                                         // mp3\n//  audio.connecttohost(\"http://www.wdr.de/wdrlive/media/einslive.m3u\");                                // m3u\n//  audio.connecttohost(\"https://stream.srg-ssr.ch/rsp/aacp_48.asx\");                                   // asx\n//  audio.connecttohost(\"http://tuner.classical102.com/listen.pls\");                                    // pls\n//  audio.connecttohost(\"http://stream.radioparadise.com/flac\");                                        // flac\n//  audio.connecttohost(\"http://stream.sing-sing-bis.org:8000/singsingFlac\");                           // flac (ogg)\n//  audio.connecttohost(\"http://s1.knixx.fm:5347/dein_webradio_vbr.opus\");                              // opus (ogg)\n//  audio.connecttohost(\"http://stream2.dancewave.online:8080/dance.ogg\");                              // vorbis (ogg)\n//  audio.connecttohost(\"http://26373.live.streamtheworld.com:3690/XHQQ_FMAAC/HLSTS/playlist.m3u8\");    // HLS\n//  audio.connecttohost(\"http://eldoradolive02.akamaized.net/hls/live/2043453/eldorado/master.m3u8\");   // HLS (ts)\n//  *** web files ***\n//  audio.connecttohost(\"https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Pink-Panther.wav\");        // wav\n//  audio.connecttohost(\"https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Santiano-Wellerman.flac\"); // flac\n//  audio.connecttohost(\"https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Olsen-Banden.mp3\");        // mp3\n//  audio.connecttohost(\"https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Miss-Marple.m4a\");         // m4a (aac)\n//  audio.connecttohost(\"https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Collide.ogg\");             // vorbis\n//  audio.connecttohost(\"https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/sample.opus\");             // opus\n//  *** local files ***\n//  audio.connecttoFS(SD, \"/test.wav\");     // SD\n//  audio.connecttoFS(SD_MMC, \"/test.wav\"); // SD_MMC\n//  audio.connecttoFS(SPIFFS, \"/test.wav\"); // SPIFFS\n\n//  audio.connecttospeech(\"Wenn die Hunde schlafen, kann der Wolf gut Schafe stehlen.\", \"de\"); // Google TTS\n}\n\nvoid loop(){\n    audio.loop();\n    vTaskDelay(1);\n}\n\n// optional\nvoid audio_info(const char *info){\n    Serial.print(\"info        \"); Serial.println(info);\n}\nvoid audio_id3data(const char *info){  //id3 metadata\n    Serial.print(\"id3data     \");Serial.println(info);\n}\nvoid audio_eof_mp3(const char *info){  //end of file\n    Serial.print(\"eof_mp3     \");Serial.println(info);\n}\nvoid audio_showstation(const char *info){\n    Serial.print(\"station     \");Serial.println(info);\n}\nvoid audio_showstreamtitle(const char *info){\n    Serial.print(\"streamtitle \");Serial.println(info);\n}\nvoid audio_bitrate(const char *info){\n    Serial.print(\"bitrate     \");Serial.println(info);\n}\nvoid audio_commercial(const char *info){  //duration in sec\n    Serial.print(\"commercial  \");Serial.println(info);\n}\nvoid audio_icyurl(const char *info){  //homepage\n    Serial.print(\"icyurl      \");Serial.println(info);\n}\nvoid audio_lasthost(const char *info){  //stream URL played\n    Serial.print(\"lasthost    \");Serial.println(info);\n}\nvoid audio_eof_speech(const char *info){\n    Serial.print(\"eof_speech  \");Serial.println(info);\n}\n\n````\n\n````c++\n/* ESP32-S3, ESP32-P4 EXAMPLE */\n\n#include \"Arduino.h\"\n#include \"Audio.h\"\n#include \"WiFi.h\"\n#include \"SD_MMC.h\"\n\n#define I2S_DOUT            9\n#define I2S_BCLK            3\n#define I2S_LRC             1\n#define SD_MMC_D0          11\n#define SD_MMC_CLK         13\n#define SD_MMC_CMD         14\n\nAudio audio;\n\nString ssid =     \"*****\";\nString password = \"*****\";\n\nvoid setup() {\n    Serial.begin(115200);\n//    WiFi.begin(ssid.c_str(), password.c_str());\n//    while (WiFi.status() != WL_CONNECTED) delay(1500);\n\n    pinMode(SD_MMC_D0, INPUT_PULLUP);\n    SD_MMC.setPins(SD_MMC_CLK, SD_MMC_CMD, SD_MMC_D0);\n    SD_MMC.begin(\"/sdcard\", true);\n\n    audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);\n    audio.setVolume(12); // default 0...21\n//   audio.connecttohost(\"http://stream.antennethueringen.de/live/aac-64/stream.antennethueringen.de/\"); // aac\n    audio.connecttoFS(SD_MMC, \"/test.wav\");\n}\n\nvoid loop() {\n    audio.loop();\n    vTaskDelay(1);\n}\n\n// optional\nvoid audio_info(const char *info){\n    Serial.print(\"info        \"); Serial.println(info);\n}\n````\n\n\u003cbr\u003e\n\n|Codec       |ESP32  |ESP32 PSRAM  |ESP32-S3 or ESP32-P4 + PSRAM |                          |\n|------------|-------|-------------|-----------------------------|--------------------------|\n| mp3        | y     | y           | y                           |                          |\n| aac        | n     | y           | y                           |                          |\n| aacp       | n     | y (mono)    | y (+SBR, +Parametric Stereo)|                          |\n| wav        | y     | y           | y                           |                          |\n| flac       | n     | y           | y                           |blocksize max 24576 bytes |\n| vorbis     | n     | y           | y                           | \u003c=196Kbit/s              |\n| m4a        | n     | y           | y                           |                          |\n| opus       | n     | y           | y                           |celt only                 |\n\n\u003cbr\u003e\n\n***\nWiring\n![Wiring ESP32-S3](https://github.com/user-attachments/assets/15dd1766-0fc1-4079-b378-bc566583e80d)\n***\nImpulse diagram\n![Impulse diagram](https://github.com/schreibfaul1/ESP32-audioI2S/blob/master/additional_info/Impulsdiagramm.jpg)\n***\nYellobyte has developed an all-in-one board. It includes an ESP32-S3 N8R2, 2x MAX98357 and an SD card adapter.\nDocumentation, circuit diagrams and examples can be found here: https://github.com/yellobyte/ESP32-DevBoards-Getting-Started\n![image](https://github.com/user-attachments/assets/4002d09e-8e76-4e08-9265-188fed7628d3)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fschreibfaul1%2Fesp32-audioi2s","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fschreibfaul1%2Fesp32-audioi2s","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fschreibfaul1%2Fesp32-audioi2s/lists"}