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
/** 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
@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) {
}
}
+ @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.
*/
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();
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...");
} catch (InterruptedException ie1) {
/* ignore, keep waiting. */
}
+ source = this.source;
}
outputStream = pipedOutputStream;
}