From e7a977ef378069780c0bdb0954b12c5671954e75 Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Fri, 15 May 2015 20:20:15 +0100 Subject: [PATCH] Lost shoutcast server implementation, reorganise some code --- java/sound/src/main/java/old/Converter.java | 6 +- java/sound/src/main/java/old/List.java | 9 +-- java/sound/src/main/java/sound/Source.java | 8 +-- .../src/main/java/sound/consumer/Port.java | 4 +- .../main/java/sound/consumer/Shoutcast.java | 72 +++++++++++++++++++ .../src/main/java/sound/producer/Stream.java | 4 +- java/sound/src/main/java/test/Test.java | 14 ++-- 7 files changed, 92 insertions(+), 25 deletions(-) create mode 100644 java/sound/src/main/java/sound/consumer/Shoutcast.java diff --git a/java/sound/src/main/java/old/Converter.java b/java/sound/src/main/java/old/Converter.java index ab6f405..025fdab 100644 --- a/java/sound/src/main/java/old/Converter.java +++ b/java/sound/src/main/java/old/Converter.java @@ -11,11 +11,11 @@ import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.BitstreamException; import base.exception.worker.ActivateException; import base.exception.worker.DeactivateException; -import base.worker.Worker; +import base.worker.ThreadWorker; import com.Ostermiller.util.CircularByteBuffer; -public class Converter extends Worker { +public class Converter extends ThreadWorker { public static final String COMMAND = "lame --mp3input --cbr %s - - --quiet"; public static final int BYTES = 4096; // bytes public static final int BUFFER = 30000; // milliseconds @@ -156,7 +156,7 @@ public class Converter extends Worker { this.inputStream = inputStream; } - class BufferWorker extends Worker { + class BufferWorker extends ThreadWorker { protected void work() { byte[] bytes = new byte[BYTES]; int read = 0; diff --git a/java/sound/src/main/java/old/List.java b/java/sound/src/main/java/old/List.java index c475277..1372db1 100644 --- a/java/sound/src/main/java/old/List.java +++ b/java/sound/src/main/java/old/List.java @@ -8,14 +8,15 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Scanner; +import sound.consumer.Shoutcast; import base.exception.worker.ActivateException; -import base.worker.Worker; +import base.worker.ThreadWorker; import com.Ostermiller.util.BufferOverflowException; import com.Ostermiller.util.CircularByteBuffer; import com.Ostermiller.util.CircularObjectBuffer; -public class List extends Worker { +public class List extends ThreadWorker { public static final int STEP = 80; // milliseconds public static final int RATE = 192; // kbps public static final int OVERLAP = 20000; // milliseconds @@ -184,10 +185,10 @@ public class List extends Worker { public static void main(String[] args) { int rate = 192; List list = new List(new File("mp3"), rate); - /*Shoutcast shoutcast = new Shoutcast(null, rate, 9876); + Shoutcast shoutcast = new Shoutcast(rate, 9876); shoutcast.start(); shoutcast.setInputStream(list.getInputStream()); - shoutcast.setMetaBuffer(list.getMetaBuffer());*/ + shoutcast.setMetaBuffer(list.getMetaBuffer()); while (true) { try { Thread.sleep(15000); diff --git a/java/sound/src/main/java/sound/Source.java b/java/sound/src/main/java/sound/Source.java index 8fcf427..43f63f5 100644 --- a/java/sound/src/main/java/sound/Source.java +++ b/java/sound/src/main/java/sound/Source.java @@ -16,7 +16,7 @@ import org.slf4j.LoggerFactory; import sound.util.Tool; import base.exception.worker.ActivateException; import base.exception.worker.DeactivateException; -import base.worker.Worker; +import base.worker.ThreadWorker; public class Source implements Consumer { protected Logger logger = LoggerFactory.getLogger(getClass()); @@ -27,7 +27,7 @@ public class Source implements Consumer { protected String name; protected Producer producer; protected InputStream producerInputStream; - protected Worker worker; + protected ThreadWorker worker; public Source(String name) throws LineUnavailableException { this.name = name; @@ -67,7 +67,7 @@ public class Source implements Consumer { } } - protected class DefaultWorker extends Worker { + protected class DefaultWorker extends ThreadWorker { protected Format.Standard format; protected SourceDataLine line; @@ -120,7 +120,7 @@ public class Source implements Consumer { } } - protected class Mp3Worker extends Worker { + protected class Mp3Worker extends ThreadWorker { protected Format.Mp3 format; protected Player player; diff --git a/java/sound/src/main/java/sound/consumer/Port.java b/java/sound/src/main/java/sound/consumer/Port.java index c39446a..b409c45 100644 --- a/java/sound/src/main/java/sound/consumer/Port.java +++ b/java/sound/src/main/java/sound/consumer/Port.java @@ -16,9 +16,9 @@ import sound.util.SoxBuilder.File.Type; import sound.util.SoxBuilder.Option; import base.exception.worker.ActivateException; import base.exception.worker.DeactivateException; -import base.worker.Worker; +import base.worker.ThreadWorker; -public class Port extends Worker implements Consumer { +public class Port extends ThreadWorker implements Consumer { protected static final int BUFFER_SIZE = 1024 * 4; // in bytes protected String device; diff --git a/java/sound/src/main/java/sound/consumer/Shoutcast.java b/java/sound/src/main/java/sound/consumer/Shoutcast.java new file mode 100644 index 0000000..269404a --- /dev/null +++ b/java/sound/src/main/java/sound/consumer/Shoutcast.java @@ -0,0 +1,72 @@ +package sound.consumer; + +import java.io.IOException; +import java.io.InputStream; +import java.net.Socket; + +import base.server.TcpServer; + +import com.Ostermiller.util.CircularObjectBuffer; + +public class Shoutcast extends TcpServer { + protected int metadataInterval = 8192; + protected int rate; + protected CircularObjectBuffer metaBuffer; + protected InputStream inputStream; + + public Shoutcast(int rate, int port) { + super(port, ShoutcastClient.class); + this.rate = rate; + } + + public void x() { + // Accept new clients + // Transfer buffer + + + StringBuilder response = new StringBuilder(); + response.append("HTTP/1.1 200 OK\r\nContent-Type: audio/mpeg\r\n"); + + // add the stream name + response.append("icy-name: " + "hallo" + "\r\n"); + + // add metadata information + response.append("icy-metadata:1\r\n"); + response.append("icy-metaint:"); + response.append(metadataInterval ); + response.append("\r\n"); + + response.append("\r\n"); + + //out.write(response.toString().getBytes()); + } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + } + + public void setMetaBuffer(CircularObjectBuffer metaBuffer) { + this.metaBuffer = metaBuffer; + } + + public class ShoutcastClient extends TcpServer.Client { + int untilMeta = 0; + + public ShoutcastClient(Socket socket) { + super(socket); + } + + public void work() { + // + byte[] buffer = new byte[123]; + try { + outputStream.write(buffer); + // Write some meta + + } catch (IOException e) { + logger.error("", e); + } + } + } + +} diff --git a/java/sound/src/main/java/sound/producer/Stream.java b/java/sound/src/main/java/sound/producer/Stream.java index 24500a8..7e9abc9 100644 --- a/java/sound/src/main/java/sound/producer/Stream.java +++ b/java/sound/src/main/java/sound/producer/Stream.java @@ -12,12 +12,12 @@ import sound.Producer; import sound.stream.HoardedInputStream; import base.exception.worker.ActivateException; import base.exception.worker.DeactivateException; -import base.worker.Worker; +import base.worker.ThreadWorker; import com.Ostermiller.util.CircularByteBuffer; import com.Ostermiller.util.CircularObjectBuffer; -public class Stream extends Worker implements Producer, Format.Mp3 { +public class Stream extends ThreadWorker implements Producer, Format.Mp3 { public static final int STEP = 80; // in milliseconds protected String http; diff --git a/java/sound/src/main/java/test/Test.java b/java/sound/src/main/java/test/Test.java index a20ca4d..2df4b82 100644 --- a/java/sound/src/main/java/test/Test.java +++ b/java/sound/src/main/java/test/Test.java @@ -1,18 +1,12 @@ package test; -import java.io.File; - import javax.sound.sampled.AudioFormat; import sound.Consumer; import sound.Producer; import sound.Source; -import sound.consumer.Player; import sound.consumer.Port; -import sound.consumer.Shoutcast; -import sound.consumer.Writer; import sound.producer.Stream; -import sound.producer.Target; public class Test { public static void main(String[] args) { @@ -26,13 +20,13 @@ public class Test { Consumer c1 = new Source("Java Sound Audio Engine"); Consumer c2 = new Port("Speakers (Creative SB X-Fi)"); - Consumer c3 = new Shoutcast(); - Consumer c4 = new Player(); - Consumer c5 = new Writer(new File("stream.out")); + //Consumer c3 = new Shoutcast(); + //Consumer c4 = new Player(); + //Consumer c5 = new Writer(new File("stream.out")); //Utils.write(p3.getInputStream(), new File("stream.out")); //Utils.play(p3.getInputStream()); - c4.start(p3); + c1.start(p3); //while (true) { //Thread.sleep(300000);