Pull all interfaces into a single interface: Filter.
[sonitus.git] / src / main / java / net / pterodactylus / sonitus / data / filter / TimeCounterFilter.java
index 3bb4415..ce08a61 100644 (file)
@@ -19,7 +19,9 @@ package net.pterodactylus.sonitus.data.filter;
 
 import java.io.IOException;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
 
+import net.pterodactylus.sonitus.data.AbstractFilter;
 import net.pterodactylus.sonitus.data.Filter;
 import net.pterodactylus.sonitus.data.Metadata;
 
@@ -30,30 +32,42 @@ import net.pterodactylus.sonitus.data.Metadata;
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
-public class TimeCounterFilter extends DummyFilter {
+public class TimeCounterFilter extends AbstractFilter implements Filter {
 
        /** The byte counter. */
        private final AtomicLong counter = new AtomicLong();
 
+       /** The parent’s metdata. */
+       private final AtomicReference<Metadata> parentMetadata = new AtomicReference<Metadata>();
+
        /** Whether to reset the counter on a metadata update. */
        private final boolean resetOnMetadataUpdate;
 
+       /** The last displayed timestamp. */
+       private final AtomicLong lastTimestamp = new AtomicLong(-1);
+
        /**
         * Creates a new time counter filter that automatically resets the counter when
         * the metadata is {@link #metadataUpdated(Metadata) updated}.
+        *
+        * @param name
+        *              The name of the filter
         */
-       public TimeCounterFilter() {
-               this(true);
+       public TimeCounterFilter(String name) {
+               this(name, true);
        }
 
        /**
         * Creates a new time counter filter.
         *
+        * @param name
+        *              The name of the filter
         * @param resetOnMetadataUpdate
         *              {@code true} if the counter should automatically be reset if the metadata
         *              is updated, {@code false} otherwise
         */
-       public TimeCounterFilter(boolean resetOnMetadataUpdate) {
+       public TimeCounterFilter(String name, boolean resetOnMetadataUpdate) {
+               super(name);
                this.resetOnMetadataUpdate = resetOnMetadataUpdate;
        }
 
@@ -82,21 +96,36 @@ public class TimeCounterFilter extends DummyFilter {
        }
 
        //
-       // DUMMYFILTER METHODS
+       // FILTER METHODS
        //
 
        @Override
        public void metadataUpdated(Metadata metadata) {
-               super.metadataUpdated(metadata);
+               parentMetadata.set(metadata);
                if (resetOnMetadataUpdate) {
                        reset();
                }
+               updateTimestamp(true);
        }
 
        @Override
        public void process(byte[] buffer) throws IOException {
                super.process(buffer);
                counter.getAndAdd(buffer.length);
+               updateTimestamp(false);
+       }
+
+       //
+       // PRIVATE METHODS
+       //
+
+       /** Updates the timestamp in the metadata. */
+       private void updateTimestamp(boolean now) {
+               long timestamp = getMillis() / 1000;
+               if (now || (lastTimestamp.get() != timestamp)) {
+                       super.metadataUpdated(parentMetadata.get().comment(String.format("%02d:%02d", timestamp / 60, timestamp % 60)));
+                       lastTimestamp.set(timestamp);
+               }
        }
 
 }