{"id":6878,"date":"2025-11-12T13:00:43","date_gmt":"2025-11-12T12:00:43","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=6878"},"modified":"2025-11-17T14:50:37","modified_gmt":"2025-11-17T13:50:37","slug":"building-an-dlna-network-wireless-speaker","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/","title":{"rendered":"Building an Arduino DLNA Network Wireless Speaker"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Im my last blog I was describing the <a href=\"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/07\/dlna-the-architecture\/\">DLNA Architecture<\/a>. So we are ready now to dig into my first <strong>Arduino DLNA Sketch<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By combining my <a href=\"https:\/\/github.com\/pschatzmann\/arduino-dlna\">arduino-dlna<\/a> with the <a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-tools\">arduino-audio-tools<\/a> library it is quite easy to build a <strong>Network Audio Renderer<\/strong>  that can e.g. be controlled via an <strong>Android Application<\/strong>: I can recommend <strong>Hi-Fi-Cast<\/strong> that let&#8217;s you select the <strong>Music Sources<\/strong> and <strong>Playback Devices<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When running this sketch you should find and entry named __ArduinoMediaRenderer__ under the playback devices in your mobile application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the logic: First we include all relevant classes from the DLNA and AudioTools:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#include \"WiFi.h\"<\/span>\n<span class=\"hljs-comment\">#include \"DLNA.h\"<\/span>\n<span class=\"hljs-comment\">#include \"AudioTools.h\"<\/span>\n<span class=\"hljs-comment\">#include \"AudioTools\/AudioLibs\/AudioBoardStream.h\"<\/span>\n<span class=\"hljs-comment\">#include \"AudioTools\/Communication\/AudioHttp.h\"<\/span>\n<span class=\"hljs-comment\">#include \"AudioTools\/Disk\/AudioSourceURL.h\"<\/span>\n<span class=\"hljs-comment\">#include \"AudioTools\/AudioCodecs\/CodecHelix.h\"<\/span>\n<span class=\"hljs-comment\">#include \"AudioTools\/Concurrency\/RTOS.h\"<\/span>\n<span class=\"hljs-comment\">#include \"AudioTools\/Concurrency\/AudioPlayerThreadSafe.h\"<\/span>\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Next we set up the global objects for the DLNA Media Renderer: it need a HttpServer and UDPService! <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">const int port = 9000;\nWiFiServer wifi(port);\nHttpServer<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">WiFiClient,<\/span> <span class=\"hljs-attr\">WiFiServer<\/span>&gt;<\/span> server(wifi);\nUDPService<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">WiFiUDP<\/span>&gt;<\/span> udp;\nDLNAMediaRenderer<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">WiFiClient<\/span>&gt;<\/span> media_renderer(server, udp);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For playing the audio we can use an AudioPlayer with AudioSourceDynamicURL, a MultiDecoder and we send the output to an AudioBoardStream. Replace this with an I2SStream if you want to use a simple I2S DAC.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">URLStream url;\nAudioSourceDynamicURL source(url);\nAudioBoardStream i2s(AudioKitEs8388V1);  <span class=\"hljs-comment\">\/\/ or e.g. I2SStream i2s;<\/span>\nMultiDecoder multi_decoder;\nAACDecoderHelix dec_aac;\nMP3DecoderHelix dec_mp3;\nWAVDecoder dec_wav;\nAudioPlayer player(source, i2s, multi_decoder);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Finally we set up some data structure to handle multiple tasks. The AudioPlayer is not thread save, so we need to use the AudioPlayerThreadSafe class which needs the player defined above and a thread save queue:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">QueueRTOS<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">AudioPlayerCommand<\/span>&gt;<\/span> queue(20, portMAX_DELAY, 5);\nAudioPlayerThreadSafe<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">QueueRTOS<\/span>&gt;<\/span> player_save(player, queue);\nTask dlna_task(\"dlna\", 8000, 10, 0);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In the <strong>Arduino setup<\/strong> we configure and start all the objects defined above:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">void setup() {\n  <span class=\"hljs-comment\">\/\/ setup logger<\/span>\n  Serial.begin(<span class=\"hljs-number\">115200<\/span>);\n  DlnaLogger.begin(Serial, DlnaLogLevel::Warning);\n  AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);\n\n  <span class=\"hljs-comment\">\/\/ start Wifi<\/span>\n  setupWifi();\n\n  <span class=\"hljs-comment\">\/\/ setup MultiDecoder<\/span>\n  multi_decoder.addDecoder(dec_aac, <span class=\"hljs-string\">\"audio\/aac\"<\/span>);\n  multi_decoder.addDecoder(dec_mp3, <span class=\"hljs-string\">\"audio\/mpeg\"<\/span>);\n  multi_decoder.addDecoder(dec_wav, <span class=\"hljs-string\">\"audio\/wav\"<\/span>);\n\n  <span class=\"hljs-comment\">\/\/ configure player: EOF handling<\/span>\n  player.setOnEOFCallback(onEOF);\n\n  <span class=\"hljs-comment\">\/\/ start I2S<\/span>\n  i2s.begin();\n\n  <span class=\"hljs-comment\">\/\/ setup media renderer (use event callbacks to handle audio at app level)<\/span>\n  media_renderer.setBaseURL(WiFi.localIP(), port);\n  media_renderer.setMediaEventHandler(handleMediaEvent);\n\n  <span class=\"hljs-comment\">\/\/ start device<\/span>\n  <span class=\"hljs-keyword\">if<\/span> (!media_renderer.begin()) {\n    Serial.println(<span class=\"hljs-string\">\"MediaRenderer failed to start\"<\/span>);\n  }\n\n  dlna_task.begin(&#91;]() {\n     media_renderer.loop();\n  });\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In a nutshell we<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p>setup the logger <\/p><\/li>\n\n\n\n<li><p>setup the Wifi<\/p><\/li>\n\n\n\n<li><p>configure the multidecoder by adding individual decoders with their mime<\/p><\/li>\n\n\n\n<li><p>the player is started by DLNA, but we need to register a callback to notify DLNA when the playback has finished<\/p><\/li>\n\n\n\n<li><p>we start I2S<\/p><\/li>\n\n\n\n<li><p>To configure the media renderer we <\/p>\n<ul class=\"wp-block-list\">\n<li>define the base URL which consits of the IP address and a port that will be used to announce where the services are availabe<\/li>\n\n\n\n<li>register the event hanlder which will forward the DLNA actions to the AudioPlayer<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><p>Then we can start DLNA<\/p><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Because handling the DLNA processing is adding quite some lag, we start it&#8217;s processing in a separate Task and we do the \nAudio processing in the loop. So this is quite short:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">void<\/span> loop() {\n  <span class=\"hljs-comment\">\/\/ if we have nothing to copy, be nice to other tasks<\/span>\n  <span class=\"hljs-keyword\">if<\/span> (player_save.copy()==<span class=\"hljs-number\">0<\/span>) delay(<span class=\"hljs-number\">200<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The <strong>media event handler<\/strong> gets called whenever DLNA receives an Action command, so we need to handle all <strong>SET_URI, PLAY,  STOP,  PAUSE, SET_VOLUME and SET_MUTE<\/strong> actions by calling the corresponding actions in the thread save audio player API:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">void handleMediaEvent(MediaEvent ev, DLNAMediaRenderer&lt;WiFiClient&gt;&amp; mr) {\n  <span class=\"hljs-keyword\">switch<\/span> (ev) {\n    <span class=\"hljs-keyword\">case<\/span> MediaEvent::SET_URI:\n      Serial.<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Event: SET_URI \"<\/span>);\n      Serial.println(mr.getCurrentUri());\n      source.clear();\n      source.setTimeoutAutoNext(<span class=\"hljs-number\">1000<\/span>);\n      player_save.setPath(mr.getCurrentUri());\n      player_save.begin(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-keyword\">false<\/span>);\n      <span class=\"hljs-keyword\">break<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> MediaEvent::PLAY:\n      Serial.println(<span class=\"hljs-string\">\"Event: PLAY\"<\/span>);\n      player_save.setActive(<span class=\"hljs-keyword\">true<\/span>);\n      <span class=\"hljs-keyword\">break<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> MediaEvent::STOP:\n      Serial.println(<span class=\"hljs-string\">\"Event: STOP\"<\/span>);\n      player_save.end();\n      url.end();\n      <span class=\"hljs-keyword\">break<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> MediaEvent::PAUSE:\n      Serial.println(<span class=\"hljs-string\">\"Event: PAUSE\"<\/span>);\n      player_save.setActive(<span class=\"hljs-keyword\">false<\/span>);\n      <span class=\"hljs-keyword\">break<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> MediaEvent::SET_VOLUME:\n      Serial.<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Event: SET_VOLUME \"<\/span>);\n      Serial.println(mr.getVolume());\n      player_save.setVolume(static_cast&lt;float&gt;(mr.getVolume()) \/ <span class=\"hljs-number\">100.0<\/span>);\n      <span class=\"hljs-keyword\">break<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> MediaEvent::SET_MUTE:\n      Serial.<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Event: SET_MUTE \"<\/span>);\n      Serial.println(mr.isMuted() ? <span class=\"hljs-number\">1<\/span> : <span class=\"hljs-number\">0<\/span>);\n      player_save.setMuted(mr.isMuted());\n      <span class=\"hljs-keyword\">break<\/span>;\n    <span class=\"hljs-keyword\">default<\/span>:\n      Serial.println(<span class=\"hljs-string\">\"Event: OTHER\"<\/span>);\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Last, but not least we need to register the onEOF() handler which just calls media_renderer.setPlaybackCompleted(); This is needed to inform the Control Point that we finshed playing and that we require the next URL to be played back. We also reset the player and data source to prevent that the same URL is reapeated automatically.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">void<\/span> onEOF(AudioPlayer&amp; player) {\n  <span class=\"hljs-keyword\">if<\/span> (source.size() &gt; <span class=\"hljs-number\">0<\/span>) {\n    Serial.println(<span class=\"hljs-string\">\"*** onEOF() ***\"<\/span>);\n    player_save.end();\n    source.clear();\n    media_renderer.setPlaybackCompleted();\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">I think it is quite cool that it is so easy to build a custom <strong>Open Source Wireless Network Speaker<\/strong> just with a Microcontroller. The complete <a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-tools\/tree\/main\/examples\/examples-communication\/dlna\">example can be found in the AudioTools<\/a> project.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dependencies<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You need to install the following libraries<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-tools\">https:\/\/github.com\/pschatzmann\/arduino-audio-tools<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/pschatzmann\/arduino-dlna\">https:\/\/github.com\/pschatzmann\/arduino-dlna<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/pschatzmann\/arduino-libhelix\">https:\/\/github.com\/pschatzmann\/arduino-libhelix<\/a><\/li>\n\n\n\n<li>Optional: <a href=\"https:\/\/github.com\/pschatzmann\/arduino-audio-driver\">https:\/\/github.com\/pschatzmann\/arduino-audio-driver<\/a> if you want to use an AI Thinker AudioKit as output device<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Im my last blog I was describing the DLNA Architecture. So we are ready now to dig into my first Arduino DLNA Sketch. By combining my arduino-dlna with the arduino-audio-tools library it is quite easy to build a Network Audio Renderer that can e.g. be controlled via an Android Application: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6867,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[20,22],"tags":[62],"class_list":["post-6878","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-machine-sound","tag-dlna"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building an Arduino DLNA Network Wireless Speaker - Phil Schatzmann<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building an Arduino DLNA Network Wireless Speaker - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"Im my last blog I was describing the DLNA Architecture. So we are ready now to dig into my first Arduino DLNA Sketch. By combining my arduino-dlna with the arduino-audio-tools library it is quite easy to build a Network Audio Renderer that can e.g. be controlled via an Android Application: [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-12T12:00:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-17T13:50:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/11\/dlna1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"300\" \/>\n\t<meta property=\"og:image:height\" content=\"168\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"pschatzmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pschatzmann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"Building an Arduino DLNA Network Wireless Speaker\",\"datePublished\":\"2025-11-12T12:00:43+00:00\",\"dateModified\":\"2025-11-17T13:50:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/\"},\"wordCount\":510,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/dlna1.png\",\"keywords\":[\"DLNA\"],\"articleSection\":[\"Arduino\",\"Machine Sound\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/\",\"name\":\"Building an Arduino DLNA Network Wireless Speaker - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/dlna1.png\",\"datePublished\":\"2025-11-12T12:00:43+00:00\",\"dateModified\":\"2025-11-17T13:50:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/dlna1.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/dlna1.png\",\"width\":300,\"height\":168},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2025\\\/11\\\/12\\\/building-an-dlna-network-wireless-speaker\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building an Arduino DLNA Network Wireless Speaker\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\",\"name\":\"Phil Schatzmann Consulting\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\",\"name\":\"pschatzmann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"width\":305,\"height\":305,\"caption\":\"pschatzmann\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building an Arduino DLNA Network Wireless Speaker - Phil Schatzmann","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/","og_locale":"en_US","og_type":"article","og_title":"Building an Arduino DLNA Network Wireless Speaker - Phil Schatzmann","og_description":"Im my last blog I was describing the DLNA Architecture. So we are ready now to dig into my first Arduino DLNA Sketch. By combining my arduino-dlna with the arduino-audio-tools library it is quite easy to build a Network Audio Renderer that can e.g. be controlled via an Android Application: [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/","og_site_name":"Phil Schatzmann","article_published_time":"2025-11-12T12:00:43+00:00","article_modified_time":"2025-11-17T13:50:37+00:00","og_image":[{"width":300,"height":168,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/11\/dlna1.png","type":"image\/png"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"Building an Arduino DLNA Network Wireless Speaker","datePublished":"2025-11-12T12:00:43+00:00","dateModified":"2025-11-17T13:50:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/"},"wordCount":510,"commentCount":0,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/11\/dlna1.png","keywords":["DLNA"],"articleSection":["Arduino","Machine Sound"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/","url":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/","name":"Building an Arduino DLNA Network Wireless Speaker - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/11\/dlna1.png","datePublished":"2025-11-12T12:00:43+00:00","dateModified":"2025-11-17T13:50:37+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/11\/dlna1.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2025\/11\/dlna1.png","width":300,"height":168},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2025\/11\/12\/building-an-dlna-network-wireless-speaker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"Building an Arduino DLNA Network Wireless Speaker"}]},{"@type":"WebSite","@id":"https:\/\/www.pschatzmann.ch\/home\/#website","url":"https:\/\/www.pschatzmann.ch\/home\/","name":"Phil Schatzmann Consulting","description":"","publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pschatzmann.ch\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1","name":"pschatzmann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","width":305,"height":305,"caption":"pschatzmann"},"logo":{"@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/comments?post=6878"}],"version-history":[{"count":8,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6878\/revisions"}],"predecessor-version":[{"id":6934,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/6878\/revisions\/6934"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/6867"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=6878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=6878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=6878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}