]> git.basschouten.com Git - openhab-addons.git/commitdiff
[upnpcontrol] Support for more audio streams through the HTTP audio s… (#15122)
authorlolodomo <lg.hc@free.fr>
Sun, 2 Jul 2023 09:23:41 +0000 (11:23 +0200)
committerGitHub <noreply@github.com>
Sun, 2 Jul 2023 09:23:41 +0000 (11:23 +0200)
* [upnpcontrol] Support for more audio streams through the HTTP audio servlet

Related to #15113

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
bundles/org.openhab.binding.upnpcontrol/src/main/java/org/openhab/binding/upnpcontrol/internal/audiosink/UpnpAudioSink.java

index fcb39dba272ad3c145227648666b11581ba6da9f..7a7425699299d45f04f6e30e4731499b3a8c1fee 100644 (file)
@@ -15,17 +15,15 @@ package org.openhab.binding.upnpcontrol.internal.audiosink;
 import java.io.IOException;
 import java.util.Locale;
 import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.upnpcontrol.internal.handler.UpnpRendererHandler;
 import org.openhab.core.audio.AudioFormat;
 import org.openhab.core.audio.AudioHTTPServer;
-import org.openhab.core.audio.AudioSink;
+import org.openhab.core.audio.AudioSinkAsync;
 import org.openhab.core.audio.AudioStream;
-import org.openhab.core.audio.FixedLengthAudioStream;
+import org.openhab.core.audio.StreamServed;
 import org.openhab.core.audio.URLAudioStream;
 import org.openhab.core.audio.UnsupportedAudioFormatException;
 import org.openhab.core.audio.UnsupportedAudioStreamException;
@@ -36,14 +34,14 @@ import org.slf4j.LoggerFactory;
 /**
  *
  * @author Mark Herwege - Initial contribution
+ * @author Laurent Garnier - Support for more audio streams through the HTTP audio servlet
  */
 @NonNullByDefault
-public class UpnpAudioSink implements AudioSink {
+public class UpnpAudioSink extends AudioSinkAsync {
 
     private final Logger logger = LoggerFactory.getLogger(UpnpAudioSink.class);
 
-    private static final Set<Class<? extends AudioStream>> SUPPORTED_STREAMS = Stream
-            .of(AudioStream.class, FixedLengthAudioStream.class).collect(Collectors.toSet());
+    private static final Set<Class<? extends AudioStream>> SUPPORTED_STREAMS = Set.of(AudioStream.class);
     protected UpnpRendererHandler handler;
     protected AudioHTTPServer audioHTTPServer;
     protected String callbackUrl;
@@ -65,27 +63,41 @@ public class UpnpAudioSink implements AudioSink {
     }
 
     @Override
-    public void process(@Nullable AudioStream audioStream)
+    protected void processAsynchronously(@Nullable AudioStream audioStream)
             throws UnsupportedAudioFormatException, UnsupportedAudioStreamException {
         if (audioStream == null) {
             stopMedia();
             return;
         }
 
-        String url = null;
-        if (audioStream instanceof URLAudioStream) {
-            URLAudioStream urlAudioStream = (URLAudioStream) audioStream;
-            url = urlAudioStream.getURL();
+        if (audioStream instanceof URLAudioStream urlAudioStream) {
+            playMedia(urlAudioStream.getURL());
+            try {
+                audioStream.close();
+            } catch (IOException e) {
+            }
         } else if (!callbackUrl.isEmpty()) {
-            String relativeUrl = audioStream instanceof FixedLengthAudioStream
-                    ? audioHTTPServer.serve((FixedLengthAudioStream) audioStream, 20)
-                    : audioHTTPServer.serve(audioStream);
-            url = String.valueOf(this.callbackUrl) + relativeUrl;
+            StreamServed streamServed;
+            try {
+                streamServed = audioHTTPServer.serve(audioStream, 5, true);
+            } catch (IOException e) {
+                try {
+                    audioStream.close();
+                } catch (IOException ex) {
+                }
+                throw new UnsupportedAudioStreamException(
+                        handler.getUDN() + " was not able to handle the audio stream (cache on disk failed).",
+                        audioStream.getClass(), e);
+            }
+            streamServed.playEnd().thenRun(() -> this.playbackFinished(audioStream));
+            playMedia(callbackUrl + streamServed.url());
         } else {
             logger.warn("We do not have any callback url, so {} cannot play the audio stream!", handler.getUDN());
-            return;
+            try {
+                audioStream.close();
+            } catch (IOException e) {
+            }
         }
-        playMedia(url);
     }
 
     @Override