|
| 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 | +} |
0 commit comments