Skip to content

Commit 3c5402c

Browse files
committed
dlna renderer example
1 parent 595d8d0 commit 3c5402c

File tree

2 files changed

+131
-1
lines changed

2 files changed

+131
-1
lines changed
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
// Example for creating a Media Renderer backed by a AudioPlayer
2+
3+
#include "WiFi.h"
4+
#include "DLNA.h"
5+
#include "AudioTools.h"
6+
#include "AudioTools/AudioLibs/AudioBoardStream.h"
7+
#include "AudioTools/Communication/AudioHttp.h"
8+
#include "AudioTools/Disk/AudioSourceURL.h"
9+
#include "AudioTools/AudioCodecs/CodecHelix.h"
10+
#include "AudioTools/Concurrency/RTOS.h"
11+
12+
const char* ssid = "ssid";
13+
const char* password = "password";
14+
15+
// DLNA
16+
const int port = 9000;
17+
WiFiServer wifi(port);
18+
HttpServer<WiFiClient, WiFiServer> server(wifi);
19+
UDPService<WiFiUDP> udp;
20+
DLNAMediaRenderer<WiFiClient> media_renderer(server, udp);
21+
22+
// AudioPlayer
23+
URLStream url;
24+
AudioSourceDynamicURL source(url);
25+
AudioBoardStream i2s(AudioKitEs8388V1); // or e.g. I2SStream i2s;
26+
MultiDecoder multi_decoder;
27+
AACDecoderHelix dec_aac;
28+
MP3DecoderHelix dec_mp3;
29+
WAVDecoder dec_wav;
30+
AudioPlayer player(source, i2s, multi_decoder);
31+
bool is_paused = false;
32+
Task dlna_task("dlna", 8000, 10, 0);
33+
34+
// Callback when playback reaches EOF
35+
void onEOF(AudioPlayer& player) {
36+
media_renderer.setPlaybackCompleted();
37+
}
38+
39+
// DLNA event handler
40+
void handleMediaEvent(MediaEvent ev, DLNAMediaRenderer<WiFiClient>& mr) {
41+
switch (ev) {
42+
case MediaEvent::SET_URI:
43+
Serial.print("Event: SET_URI ");
44+
if (mr.getCurrentUri()) {
45+
Serial.println(mr.getCurrentUri());
46+
source.clear();
47+
source.addURL(mr.getCurrentUri());
48+
}
49+
break;
50+
case MediaEvent::PLAY:
51+
Serial.println("Event: PLAY");
52+
if (is_paused) player.setActive(true);
53+
else player.begin();
54+
break;
55+
case MediaEvent::STOP:
56+
Serial.println("Event: STOP");
57+
is_paused = false;
58+
player.end();
59+
break;
60+
case MediaEvent::PAUSE:
61+
Serial.println("Event: PAUSE");
62+
player.setActive(false);
63+
is_paused = true;
64+
break;
65+
case MediaEvent::SET_VOLUME:
66+
Serial.print("Event: SET_VOLUME ");
67+
Serial.println(mr.getVolume());
68+
player.setVolume(static_cast<float>(mr.getVolume()) / 100.0);
69+
break;
70+
case MediaEvent::SET_MUTE:
71+
Serial.print("Event: SET_MUTE ");
72+
Serial.println(mr.isMuted() ? 1 : 0);
73+
player.setMuted(mr.isMuted());
74+
break;
75+
default:
76+
Serial.println("Event: OTHER");
77+
}
78+
}
79+
80+
// start WiFi
81+
void setupWifi() {
82+
WiFi.begin(ssid, password);
83+
WiFi.setSleep(false);
84+
Serial.print("Connecting to WiFi ..");
85+
while (WiFi.status() != WL_CONNECTED) {
86+
Serial.print('.');
87+
delay(1000);
88+
}
89+
WiFi.setSleep(false);
90+
Serial.println("connected!");
91+
}
92+
93+
void setup() {
94+
// setup logger
95+
Serial.begin(115200);
96+
DlnaLogger.begin(Serial, DlnaLogLevel::Warning);
97+
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);
98+
99+
// start Wifi
100+
setupWifi();
101+
102+
// setup MultiDecoder
103+
multi_decoder.addDecoder(dec_aac, "audio/aac");
104+
multi_decoder.addDecoder(dec_mp3, "audio/mpeg");
105+
multi_decoder.addDecoder(dec_wav, "audio/wav");
106+
107+
// configure player: EOF handling
108+
player.setOnEOFCallback(onEOF);
109+
110+
// start I2S
111+
i2s.begin();
112+
113+
// setup media renderer (use event callbacks to handle audio at app level)
114+
media_renderer.setBaseURL(WiFi.localIP(), port);
115+
media_renderer.setMediaEventHandler(handleMediaEvent);
116+
117+
// start device
118+
if (!media_renderer.begin()) {
119+
Serial.println("MediaRenderer failed to start");
120+
}
121+
122+
// DLNA processing in separate task
123+
dlna_task.begin([]() {
124+
media_renderer.loop();
125+
});
126+
}
127+
128+
void loop() {
129+
player.copy();
130+
}

src/AudioTools/Disk/AudioSourceURL.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class AudioSourceDynamicURL : public AudioSourceURL {
150150
}
151151
}
152152

153-
AudioSourceDynamicURL(AbstractURLStream& urlStream, const char* mime,
153+
AudioSourceDynamicURL(AbstractURLStream& urlStream, const char* mime = nullptr,
154154
int startPos = 0) {
155155
this->actual_stream = &urlStream;
156156
this->mime = mime;

0 commit comments

Comments
 (0)