@@ -12,144 +12,62 @@ Other HW may work but not tested. Plays also icy-streams, GoogleTTS and OpenAIsp
1212#include " Arduino.h"
1313#include " WiFi.h"
1414#include " Audio.h"
15- #include " SD.h"
16- #include " FS.h"
1715
1816// Digital I/O used
19- #define SD_CS 5
20- #define SPI_MOSI 23
21- #define SPI_MISO 19
22- #define SPI_SCK 18
2317#define I2S_DOUT 25
2418#define I2S_BCLK 27
2519#define I2S_LRC 26
2620
27- Audio audio;
28-
2921String ssid = " *******" ;
3022String password = " *******" ;
3123
24+ Audio audio;
25+
26+ // callbacks
27+ void my_audio_info (Audio::msg_t m) {
28+ Serial.printf("%s: %s\n", m.s, m.msg);
29+ }
30+
3231void setup() {
33- pinMode (SD_CS, OUTPUT); digitalWrite(SD_CS, HIGH);
34- SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
32+ Audio::audio_info_callback = my_audio_info; // optional
3533 Serial.begin(115200);
36- SD.begin(SD_CS);
37- WiFi.disconnect();
38- WiFi.mode(WIFI_STA);
3934 WiFi.begin(ssid.c_str(), password.c_str());
4035 while (WiFi.status() != WL_CONNECTED) delay(1500);
4136 audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
4237 audio.setVolume(21); // default 0...21
43- // or alternative
44- // audio.setVolumeSteps(64); // max 255
45- // audio.setVolume(63);
46- //
47- // ** * radio streams ** *
48- audio.connecttohost("http://stream.antennethueringen.de/live/aac-64/stream.antennethueringen.de/ "); // aac
49- // audio.connecttohost("http://mcrscast.mcr.iol.pt/cidadefm "); // mp3
50- // audio.connecttohost("http://www.wdr.de/wdrlive/media/einslive.m3u "); // m3u
51- // audio.connecttohost("https://stream.srg-ssr.ch/rsp/aacp_48.asx "); // asx
52- // audio.connecttohost("http://tuner.classical102.com/listen.pls "); // pls
53- // audio.connecttohost("http://stream.radioparadise.com/flac "); // flac
54- // audio.connecttohost("http://stream.sing-sing-bis.org:8000/singsingFlac "); // flac (ogg)
55- // audio.connecttohost("http://s1.knixx.fm:5347/dein_webradio_vbr.opus "); // opus (ogg)
56- // audio.connecttohost("http://stream2.dancewave.online:8080/dance.ogg "); // vorbis (ogg)
57- // audio.connecttohost("http://26373.live.streamtheworld.com:3690/XHQQ_FMAAC/HLSTS/playlist.m3u8 "); // HLS
58- // audio.connecttohost("http://eldoradolive02.akamaized.net/hls/live/2043453/eldorado/master.m3u8 "); // HLS (ts)
59- // ** * web files ** *
60- // audio.connecttohost("https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Pink-Panther.wav "); // wav
61- // audio.connecttohost("https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Santiano-Wellerman.flac "); // flac
62- // audio.connecttohost("https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Olsen-Banden.mp3 "); // mp3
63- // audio.connecttohost("https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Miss-Marple.m4a "); // m4a (aac)
64- // audio.connecttohost("https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/Collide.ogg "); // vorbis
65- // audio.connecttohost("https://github.com/schreibfaul1/ESP32-audioI2S/raw/master/additional_info/Testfiles/sample.opus "); // opus
66- // ** * local files ** *
67- // audio.connecttoFS(SD, "/test.wav"); // SD
68- // audio.connecttoFS(SD_MMC, "/test.wav"); // SD_MMC
69- // audio.connecttoFS(SPIFFS, "/test.wav"); // SPIFFS
70-
71- // audio.connecttospeech("Wenn die Hunde schlafen, kann der Wolf gut Schafe stehlen.", "de"); // Google TTS
38+ audio.connecttohost("http://stream.antennethueringen.de/live/aac-64/stream.antennethueringen.de/ ");
7239}
7340
7441void loop(){
7542 audio.loop();
7643 vTaskDelay(1);
7744}
7845
79- // optional
80- void audio_info (const char * info){
81- Serial.print("info "); Serial.println(info);
82- }
83- void audio_id3data(const char * info){ //id3 metadata
84- Serial.print("id3data ");Serial.println(info);
85- }
86- void audio_eof(const char * info){ //end of file
87- Serial.print("eof ");Serial.println(info);
88- }
89- void audio_showstation(const char * info){
90- Serial.print("station ");Serial.println(info);
91- }
92- void audio_showstreamtitle(const char * info){
93- Serial.print("streamtitle ");Serial.println(info);
94- }
95- void audio_bitrate(const char * info){
96- Serial.print("bitrate ");Serial.println(info);
97- }
98- void audio_icyurl(const char * info){ //homepage
99- Serial.print("icyurl ");Serial.println(info);
100- }
101- void audio_lasthost(const char * info){ //stream URL played
102- Serial.print("lasthost ");Serial.println(info);
103- }
104-
10546````
47+ You can find more examples here: https://github.com/schreibfaul1/ESP32-audioI2S/tree/master/examples
10648
10749````c++
108- /* ESP32-S3, ESP32-P4 EXAMPLE */
109-
110- #include "Arduino.h"
111- #include "Audio.h"
112- #include "WiFi.h"
113- #include "SD_MMC.h"
114-
115- #define I2S_DOUT 9
116- #define I2S_BCLK 3
117- #define I2S_LRC 1
118- #define SD_MMC_D0 11
119- #define SD_MMC_CLK 13
120- #define SD_MMC_CMD 14
121-
122- Audio audio;
123-
124- String ssid = "*****";
125- String password = "*****";
126-
127- void setup() {
128- Serial.begin(115200);
129- // WiFi.begin(ssid.c_str(), password.c_str());
130- // while (WiFi.status() != WL_CONNECTED) delay(1500);
131-
132- pinMode(SD_MMC_D0, INPUT_PULLUP);
133- SD_MMC.setPins(SD_MMC_CLK, SD_MMC_CMD, SD_MMC_D0);
134- SD_MMC.begin("/sdcard", true);
135-
136- audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
137- audio.setVolume(12); // default 0...21
138- // audio.connecttohost("http://stream.antennethueringen.de/live/aac-64/stream.antennethueringen.de/"); // aac
139- audio.connecttoFS(SD_MMC, "/test.wav");
140- }
141-
142- void loop() {
143- audio.loop();
144- vTaskDelay(1);
145- }
146-
147- // optional
148- void audio_info(const char *info){
149- Serial.print("info "); Serial.println(info);
50+ // detailed cb output
51+ void my_audio_info(Audio::msg_t m) {
52+ switch(m.e){
53+ case Audio::evt_info: Serial.printf("info: ....... %s\n", m.msg); break;
54+ case Audio::evt_eof: Serial.printf("end of file: %s\n", m.msg); break;
55+ case Audio::evt_bitrate: Serial.printf("bitrate: .... %s\n", m.msg); break; // icy-bitrate or bitrate from metadata
56+ case Audio::evt_icyurl: Serial.printf("icy URL: .... %s\n", m.msg); break;
57+ case Audio::evt_id3data: Serial.printf("ID3 data: ... %s\n", m.msg); break; // id3-data or metadata
58+ case Audio::evt_lasthost: Serial.printf("last URL: ... %s\n", m.msg); break;
59+ case Audio::evt_name: Serial.printf("station name: %s\n", m.msg); break; // station name or icy-name
60+ case Audio::evt_streamtitle: Serial.printf("stream title: %s\n", m.msg); break;
61+ case Audio::evt_icylogo: Serial.printf("icy logo: ... %s\n", m.msg); break;
62+ case Audio::evt_icydescription: Serial.printf("icy descr: .. %s\n", m.msg); break;
63+ case Audio::evt_image: for(int i = 0; i < m.vec.size(); i += 2){
64+ Serial.printf("cover image: segment %02i, pos %07lu, len %05lu\n", i / 2, m.vec[i], m.vec[i + 1]);} break; // APIC
65+ case Audio::evt_lyrics: Serial.printf("sync lyrics: %s\n", m.msg); break;
66+ case Audio::evt_log : Serial.printf("audio_logs: %s\n", m.msg); break;
67+ default: Serial.printf("message:..... %s\n", m.msg); break;
68+ }
15069}
15170````
152-
15371<br >
15472
15573| Codec | ESP32 | ESP32-S3 or ESP32-P4 | |
0 commit comments