Skip to content

Commit d13777d

Browse files
committed
DLNA Renderer correction
1 parent a54b1bb commit d13777d

File tree

3 files changed

+31
-28
lines changed

3 files changed

+31
-28
lines changed

examples/examples-communication/dlna/dlna-audio-renderer/dlna-audio-renderer.ino

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Example for creating a Media Renderer backed by a AudioPlayer
1+
// Example for creating a Media Renderer
22

33
#include "WiFi.h"
44
#include "DLNA.h" // https://github.com/pschatzmann/arduino-dlna
@@ -18,6 +18,7 @@ WiFiServer wifi(port);
1818
HttpServer<WiFiClient, WiFiServer> server(wifi);
1919
UDPService<WiFiUDP> udp;
2020
DLNAMediaRenderer<WiFiClient> media_renderer(server, udp);
21+
Task dlna_task("dlna", 8000, 10, 0);
2122

2223
// AudioPlayer
2324
URLStream url;
@@ -28,39 +29,38 @@ AACDecoderHelix dec_aac;
2829
MP3DecoderHelix dec_mp3;
2930
WAVDecoder dec_wav;
3031
AudioPlayer player(source, i2s, multi_decoder);
31-
bool is_paused = false;
32-
Task dlna_task("dlna", 8000, 10, 0);
33-
3432
// Callback when playback reaches EOF
3533
void onEOF(AudioPlayer& player) {
36-
media_renderer.setPlaybackCompleted();
34+
if (source.size() > 0) {
35+
Serial.println("*** onEOF() ***");
36+
player.end();
37+
source.clear();
38+
media_renderer.setPlaybackCompleted();
39+
}
3740
}
3841

39-
// DLNA event handler
4042
void handleMediaEvent(MediaEvent ev, DLNAMediaRenderer<WiFiClient>& mr) {
4143
switch (ev) {
4244
case MediaEvent::SET_URI:
4345
Serial.print("Event: SET_URI ");
44-
if (mr.getCurrentUri()) {
45-
Serial.println(mr.getCurrentUri());
46-
source.clear();
47-
source.addURL(mr.getCurrentUri());
48-
}
46+
Serial.println(mr.getCurrentUri());
47+
source.clear();
48+
source.addURL(mr.getCurrentUri());
49+
source.setTimeoutAutoNext(1000);
50+
player.begin(0, false);
4951
break;
5052
case MediaEvent::PLAY:
5153
Serial.println("Event: PLAY");
52-
if (is_paused) player.setActive(true);
53-
else player.begin();
54+
player.setActive(true);
5455
break;
5556
case MediaEvent::STOP:
5657
Serial.println("Event: STOP");
57-
is_paused = false;
5858
player.end();
59+
url.end();
5960
break;
6061
case MediaEvent::PAUSE:
6162
Serial.println("Event: PAUSE");
6263
player.setActive(false);
63-
is_paused = true;
6464
break;
6565
case MediaEvent::SET_VOLUME:
6666
Serial.print("Event: SET_VOLUME ");
@@ -77,7 +77,6 @@ void handleMediaEvent(MediaEvent ev, DLNAMediaRenderer<WiFiClient>& mr) {
7777
}
7878
}
7979

80-
// start WiFi
8180
void setupWifi() {
8281
WiFi.begin(ssid, password);
8382
WiFi.setSleep(false);
@@ -106,6 +105,7 @@ void setup() {
106105

107106
// configure player: EOF handling
108107
player.setOnEOFCallback(onEOF);
108+
player.setAutoNext(false);
109109

110110
// start I2S
111111
i2s.begin();
@@ -119,12 +119,11 @@ void setup() {
119119
Serial.println("MediaRenderer failed to start");
120120
}
121121

122-
// DLNA processing in separate task
123122
dlna_task.begin([]() {
124123
media_renderer.loop();
125124
});
126125
}
127126

128127
void loop() {
129-
player.copy();
128+
if (player) player.copy();
130129
}

src/AudioTools/CoreAudio/AudioPlayer.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -438,13 +438,6 @@ class AudioPlayer : public AudioInfoSupport, public VolumeSupport {
438438
LOGD("copy: %d -> 0", (int)bytes);
439439
return 0;
440440
}
441-
// EOF callback: when no bytes were copied, trigger once per stream
442-
if (result == 0 && p_input_stream != nullptr && !eof_called) {
443-
eof_called = true;
444-
if (on_eof_callback != nullptr) {
445-
on_eof_callback(*this);
446-
}
447-
}
448441

449442
// handle sound
450443
result = copier.copyBytes(bytes);
@@ -603,6 +596,15 @@ class AudioPlayer : public AudioInfoSupport, public VolumeSupport {
603596
return;
604597
if (p_input_stream == nullptr || millis() > timeout) {
605598
if (is_auto_fade) fade.setFadeInActive(true);
599+
600+
// EOF callback: trigger once per stream
601+
if (!eof_called) {
602+
eof_called = true;
603+
if (on_eof_callback != nullptr) {
604+
on_eof_callback(*this);
605+
}
606+
}
607+
606608
if (autonext) {
607609
LOGI("-> timeout - moving by %d", stream_increment);
608610
// open next stream

src/AudioTools/Disk/AudioSourceURL.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ class AudioSourceURL : public AudioSource {
112112
return actual_stream->setMetadataCallback(fn);
113113
}
114114

115+
virtual int size() { return max; }
116+
115117
protected:
116118
AbstractURLStream* actual_stream = nullptr;
117119
const char** urlArray = nullptr;
@@ -128,7 +130,6 @@ class AudioSourceURL : public AudioSource {
128130
return urlArray[pos];
129131
}
130132

131-
virtual int size() { return max; }
132133
};
133134

134135
/**
@@ -166,12 +167,13 @@ class AudioSourceDynamicURL : public AudioSourceURL {
166167

167168
void clear() { url_vector.clear(); }
168169

169-
protected:
170+
int size() override { return url_vector.size(); }
171+
172+
protected:
170173
Vector<Str> url_vector;
171174

172175
const char* value(int pos) override { return url_vector[pos].c_str(); }
173176

174-
int size() override { return url_vector.size(); }
175177
};
176178

177179
} // namespace audio_tools

0 commit comments

Comments
 (0)