Skip to content

Commit c45eeef

Browse files
authored
Merge pull request #1147 from schreibfaul1/functional-callbacks
Functional callbacks `Audio::audio_info_callback = my_own_function;`
2 parents 8492aa2 + e4716a3 commit c45eeef

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+644
-3835
lines changed

README.md

Lines changed: 29 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
2921
String ssid = "*******";
3022
String 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+
3231
void 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

7441
void 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 | |

examples/AC101/main.cpp

Lines changed: 17 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -33,27 +33,28 @@ Audio audio;
3333

3434
//#####################################################################
3535

36-
void setup()
37-
{
38-
Serial.begin(115200);
36+
void my_audio_info(Audio::msg_t m) {
37+
Serial.printf("%s: %s\n", m.s, m.msg);
38+
}
3939

40-
WiFi.mode(WIFI_STA);
41-
WiFi.begin(ssid.c_str(), password.c_str());
40+
void setup() {
41+
Audio::audio_info_callback = my_audio_info;
42+
Serial.begin(115200);
43+
WiFi.mode(WIFI_STA);
44+
WiFi.begin(ssid.c_str(), password.c_str());
4245

43-
while (WiFi.status() != WL_CONNECTED)
44-
{
45-
Serial.print(".");
46-
delay(100);
47-
}
46+
while (WiFi.status() != WL_CONNECTED){
47+
Serial.print(".");
48+
delay(100);
49+
}
4850

49-
Serial.printf_P(PSTR("Connected\r\nRSSI: "));
50-
Serial.print(WiFi.RSSI());
51-
Serial.print(" IP: ");
52-
Serial.println(WiFi.localIP());
51+
Serial.printf_P(PSTR("Connected\r\nRSSI: "));
52+
Serial.print(WiFi.RSSI());
53+
Serial.print(" IP: ");
54+
Serial.println(WiFi.localIP());
5355

5456
Serial.printf("Connect to DAC codec... ");
55-
while (not dac.begin(IIC_DATA, IIC_CLK))
56-
{
57+
while (not dac.begin(IIC_DATA, IIC_CLK)){
5758
Serial.printf("Failed!\n");
5859
delay(1000);
5960
}
@@ -82,29 +83,3 @@ void loop(){
8283
vTaskDelay(1);
8384
audio.loop();
8485
}
85-
86-
// optional
87-
void audio_info(const char *info){
88-
Serial.print("info "); Serial.println(info);
89-
}
90-
void audio_id3data(const char *info){ //id3 metadata
91-
Serial.print("id3data ");Serial.println(info);
92-
}
93-
void audio_eof(const char *info){ //end of file
94-
Serial.print("eof ");Serial.println(info);
95-
}
96-
void audio_showstation(const char *info){
97-
Serial.print("station ");Serial.println(info);
98-
}
99-
void audio_showstreamtitle(const char *info){
100-
Serial.print("streamtitle ");Serial.println(info);
101-
}
102-
void audio_bitrate(const char *info){
103-
Serial.print("bitrate ");Serial.println(info);
104-
}
105-
void audio_icyurl(const char *info){ //homepage
106-
Serial.print("icyurl ");Serial.println(info);
107-
}
108-
void audio_lasthost(const char *info){ //stream URL played
109-
Serial.print("lasthost ");Serial.println(info);
110-
}

0 commit comments

Comments
 (0)