Move format into metadata.
[sonitus.git] / src / main / java / net / pterodactylus / sonitus / data / filter / MultiSourceFilter.java
index 57c313e..1dc3a8c 100644 (file)
@@ -31,9 +31,13 @@ import java.util.logging.Logger;
 
 import net.pterodactylus.sonitus.data.ConnectException;
 import net.pterodactylus.sonitus.data.Filter;
-import net.pterodactylus.sonitus.data.Format;
+import net.pterodactylus.sonitus.data.Metadata;
 import net.pterodactylus.sonitus.data.ReusableSink;
 import net.pterodactylus.sonitus.data.Source;
+import net.pterodactylus.sonitus.data.event.SourceFinishedEvent;
+
+import com.google.common.eventbus.EventBus;
+import com.google.inject.Inject;
 
 /**
  * {@link ReusableSink} implementation that supports changing the source without
@@ -49,15 +53,22 @@ public class MultiSourceFilter implements Filter, ReusableSink {
        /** Object used for synchronization. */
        private final Object syncObject = new Object();
 
+       /** The event bus. */
+       private final EventBus eventBus;
+
        /** The connection. */
        private Connection connection;
 
-       /** The format. */
-       private Format format;
+       @Inject
+       public MultiSourceFilter(EventBus eventBus) {
+               this.eventBus = eventBus;
+       }
 
        @Override
-       public Format format() {
-               return format;
+       public Metadata metadata() {
+               synchronized (syncObject) {
+                       return connection.source.metadata();
+               }
        }
 
        @Override
@@ -74,10 +85,10 @@ public class MultiSourceFilter implements Filter, ReusableSink {
        @Override
        public void connect(Source source) throws ConnectException {
                checkNotNull(source, "source must not be null");
-               if (format != null) {
-                       checkArgument(format.equals(source.format()), "source’s format must equal this sink’s format");
-               } else {
-                       format = source.format();
+               if ((connection != null) && (connection.source != null)) {
+                       checkArgument(connection.source.metadata().channels() == source.metadata().channels(), "source’s channel count must equal existing source’s channel count");
+                       checkArgument(connection.source.metadata().frequency() == source.metadata().frequency(), "source’s frequency must equal existing source’s frequency");
+                       checkArgument(connection.source.metadata().encoding().equalsIgnoreCase(source.metadata().encoding()), "source’s encoding must equal existing source’s encoding");
                }
 
                if (connection == null) {
@@ -91,6 +102,11 @@ public class MultiSourceFilter implements Filter, ReusableSink {
                }
        }
 
+       @Override
+       public void metadataUpdated() {
+               /* ignore. */
+       }
+
        /**
         * The connection feeds the input from the currently connected source to the
         * input stream that {@link #get(int)} will get its data from.
@@ -122,7 +138,11 @@ public class MultiSourceFilter implements Filter, ReusableSink {
                 */
                public Connection source(Source source) throws IOException {
                        synchronized (syncObject) {
+                               Source oldSource = this.source;
                                this.source = source;
+                               if (oldSource != null) {
+                                       eventBus.post(new SourceFinishedEvent(oldSource));
+                               }
                                pipedInputStream = new PipedInputStream();
                                pipedOutputStream = new PipedOutputStream(pipedInputStream);
                                syncObject.notifyAll();
@@ -135,9 +155,11 @@ public class MultiSourceFilter implements Filter, ReusableSink {
                        while (true) {
                                /* wait for source to be set. */
                                OutputStream outputStream;
+                               Source source;
                                logger.finest("Entering synchronized block...");
                                synchronized (syncObject) {
                                        logger.finest("Entered synchronized block.");
+                                       source = this.source;
                                        while (source == null) {
                                                try {
                                                        logger.finest("Waiting for source to connect...");
@@ -145,6 +167,7 @@ public class MultiSourceFilter implements Filter, ReusableSink {
                                                } catch (InterruptedException ie1) {
                                                        /* ignore, keep waiting. */
                                                }
+                                               source = this.source;
                                        }
                                        outputStream = pipedOutputStream;
                                }