cleaned up old imported/decompiled files, basic shoutcast functionality
restored, disabled meta for streaming because of inconsistency issues.
This commit is contained in:
@@ -6,6 +6,7 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
import sound.util.Utils;
|
||||||
import javazoom.jl.decoder.Bitstream;
|
import javazoom.jl.decoder.Bitstream;
|
||||||
import javazoom.jl.decoder.BitstreamException;
|
import javazoom.jl.decoder.BitstreamException;
|
||||||
import base.exception.worker.ActivateException;
|
import base.exception.worker.ActivateException;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import java.io.IOException;
|
|||||||
import org.farng.mp3.MP3File;
|
import org.farng.mp3.MP3File;
|
||||||
import org.farng.mp3.TagException;
|
import org.farng.mp3.TagException;
|
||||||
|
|
||||||
|
import sound.util.Utils;
|
||||||
import base.exception.worker.ActivateException;
|
import base.exception.worker.ActivateException;
|
||||||
|
|
||||||
public class Mp3 extends Converter {
|
public class Mp3 extends Converter {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
public class GreedyInputStream extends BufferedInputStream {
|
public class GreedyInputStream extends BufferedInputStream {
|
||||||
protected Logger logger = LoggerFactory.getLogger(getClass());
|
protected Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
protected static final int SLEEP = 500;
|
protected static final int SLEEP = 500; // in milliseconds
|
||||||
protected static final int BUFFER_SIZE = 30000; // in bytes
|
protected static final int BUFFER_SIZE = 30000; // in bytes
|
||||||
protected static final int MINIMUM_SIZE = 1000; // in bytes
|
protected static final int MINIMUM_SIZE = 1000; // in bytes
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import javazoom.jl.player.Player;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import sound.util.Tool;
|
||||||
import base.exception.worker.ActivateException;
|
import base.exception.worker.ActivateException;
|
||||||
import base.exception.worker.DeactivateException;
|
import base.exception.worker.DeactivateException;
|
||||||
import base.worker.Worker;
|
import base.worker.Worker;
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import javax.sound.sampled.TargetDataLine;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import sound.util.Tool;
|
||||||
|
|
||||||
public class Target implements Producer, Format.Standard {
|
public class Target implements Producer, Format.Standard {
|
||||||
protected Logger logger = LoggerFactory.getLogger(getClass());
|
protected Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package sound;
|
package sound.consumer;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@@ -6,13 +6,17 @@ import java.io.OutputStream;
|
|||||||
|
|
||||||
import javax.sound.sampled.AudioFormat;
|
import javax.sound.sampled.AudioFormat;
|
||||||
|
|
||||||
|
import sound.Consumer;
|
||||||
|
import sound.Format;
|
||||||
|
import sound.Format.Standard;
|
||||||
|
import sound.Producer;
|
||||||
|
import sound.util.SoxBuilder;
|
||||||
|
import sound.util.SoxBuilder.File;
|
||||||
|
import sound.util.SoxBuilder.File.Type;
|
||||||
|
import sound.util.SoxBuilder.Option;
|
||||||
import base.exception.worker.ActivateException;
|
import base.exception.worker.ActivateException;
|
||||||
import base.exception.worker.DeactivateException;
|
import base.exception.worker.DeactivateException;
|
||||||
import base.worker.Worker;
|
import base.worker.Worker;
|
||||||
import sound.Format.Standard;
|
|
||||||
import sound.SoxBuilder.File;
|
|
||||||
import sound.SoxBuilder.File.Type;
|
|
||||||
import sound.SoxBuilder.Option;
|
|
||||||
|
|
||||||
public class Port extends Worker implements Consumer {
|
public class Port extends Worker implements Consumer {
|
||||||
protected static final int BUFFER_SIZE = 1024 * 4; // in bytes
|
protected static final int BUFFER_SIZE = 1024 * 4; // in bytes
|
||||||
@@ -48,7 +52,7 @@ public class Port extends Worker implements Consumer {
|
|||||||
.setOption(Option.QUIET)
|
.setOption(Option.QUIET)
|
||||||
.addFile(File.setType(Type.DEVICE))
|
.addFile(File.setType(Type.DEVICE))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
logger.debug(String.format("Build process (\"%s\")", command));
|
logger.debug(String.format("Build process (\"%s\")", command));
|
||||||
processBuilder = new ProcessBuilder(command.split(" "));
|
processBuilder = new ProcessBuilder(command.split(" "));
|
||||||
processBuilder.environment().put("AUDIODEV", device);
|
processBuilder.environment().put("AUDIODEV", device);
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package sound;
|
package sound.producer;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@@ -7,6 +7,9 @@ import java.io.OutputStreamWriter;
|
|||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
|
||||||
|
import sound.Format;
|
||||||
|
import sound.GreedyInputStream;
|
||||||
|
import sound.Producer;
|
||||||
import base.exception.worker.ActivateException;
|
import base.exception.worker.ActivateException;
|
||||||
import base.exception.worker.DeactivateException;
|
import base.exception.worker.DeactivateException;
|
||||||
import base.worker.Worker;
|
import base.worker.Worker;
|
||||||
@@ -15,7 +18,6 @@ import com.Ostermiller.util.CircularByteBuffer;
|
|||||||
import com.Ostermiller.util.CircularObjectBuffer;
|
import com.Ostermiller.util.CircularObjectBuffer;
|
||||||
|
|
||||||
public class Stream extends Worker implements Producer, Format.Mp3 {
|
public class Stream extends Worker implements Producer, Format.Mp3 {
|
||||||
public static final String HTTP = "http://shoutcast.omroep.nl:8104/";
|
|
||||||
public static final int STEP = 80; // in milliseconds
|
public static final int STEP = 80; // in milliseconds
|
||||||
|
|
||||||
protected String http;
|
protected String http;
|
||||||
@@ -31,12 +33,7 @@ public class Stream extends Worker implements Producer, Format.Mp3 {
|
|||||||
protected CircularObjectBuffer<String> metaCircularObjectBuffer;
|
protected CircularObjectBuffer<String> metaCircularObjectBuffer;
|
||||||
protected String metaData;
|
protected String metaData;
|
||||||
|
|
||||||
public Stream() {
|
|
||||||
this(HTTP);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Stream(String http) {
|
public Stream(String http) {
|
||||||
super(true);
|
|
||||||
this.http = http;
|
this.http = http;
|
||||||
meta = -1;
|
meta = -1;
|
||||||
rate = -1;
|
rate = -1;
|
||||||
@@ -52,9 +49,13 @@ public class Stream extends Worker implements Producer, Format.Mp3 {
|
|||||||
socketOutputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
|
socketOutputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
|
||||||
|
|
||||||
/* Write stream request */
|
/* Write stream request */
|
||||||
socketOutputStreamWriter.write("GET " + url.getFile() + " HTTP/1.1\r\n");
|
if (url.getFile().equals("")) {
|
||||||
|
socketOutputStreamWriter.write("GET / HTTP/1.1\r\n");
|
||||||
|
} else {
|
||||||
|
socketOutputStreamWriter.write("GET " + url.getFile() + " HTTP/1.1\r\n");
|
||||||
|
}
|
||||||
socketOutputStreamWriter.write("Host: " + url.getHost() + "\r\n");
|
socketOutputStreamWriter.write("Host: " + url.getHost() + "\r\n");
|
||||||
socketOutputStreamWriter.write("Icy-MetaData: 1\r\n");
|
//socketOutputStreamWriter.write("Icy-MetaData: 1\r\n");
|
||||||
socketOutputStreamWriter.write("Connection: close\r\n");
|
socketOutputStreamWriter.write("Connection: close\r\n");
|
||||||
socketOutputStreamWriter.write("\r\n");
|
socketOutputStreamWriter.write("\r\n");
|
||||||
socketOutputStreamWriter.flush();
|
socketOutputStreamWriter.flush();
|
||||||
@@ -104,7 +105,7 @@ public class Stream extends Worker implements Producer, Format.Mp3 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate streaming parameters */
|
/* Calculate streaming parameters */
|
||||||
untilMeta = meta;
|
//untilMeta = meta;
|
||||||
chunk = STEP * rate / 8;
|
chunk = STEP * rate / 8;
|
||||||
super.activate();
|
super.activate();
|
||||||
}
|
}
|
||||||
@@ -124,19 +125,18 @@ public class Stream extends Worker implements Producer, Format.Mp3 {
|
|||||||
protected void work() {
|
protected void work() {
|
||||||
int left = chunk;
|
int left = chunk;
|
||||||
|
|
||||||
/* Handle media at appropriate times */
|
/* Handle media at appropriate times *
|
||||||
while (meta > 0 && left >= untilMeta) {
|
while (meta > 0 && left >= untilMeta) {
|
||||||
stream(untilMeta);
|
stream(untilMeta);
|
||||||
meta();
|
|
||||||
left -= untilMeta;
|
left -= untilMeta;
|
||||||
|
meta();
|
||||||
untilMeta = meta;
|
untilMeta = meta;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
/* Stream at fixed rate */
|
/* Stream at fixed rate */
|
||||||
stream(left);
|
stream(left);
|
||||||
untilMeta -= left;
|
//untilMeta -= left;
|
||||||
sleep(STEP);
|
sleep(STEP);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void stream(int length) {
|
protected void stream(int length) {
|
||||||
@@ -146,9 +146,9 @@ public class Stream extends Worker implements Producer, Format.Mp3 {
|
|||||||
while (length > 0 && (read = socketInputStream.read(bytes)) > 0) {
|
while (length > 0 && (read = socketInputStream.read(bytes)) > 0) {
|
||||||
length -= read;
|
length -= read;
|
||||||
audioCircularByteBuffer.getOutputStream().write(bytes);
|
audioCircularByteBuffer.getOutputStream().write(bytes);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logger.error("", e);
|
logger.error(e.getMessage());
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -158,6 +158,7 @@ public class Stream extends Worker implements Producer, Format.Mp3 {
|
|||||||
/* Retrieve data length */
|
/* Retrieve data length */
|
||||||
byte[] data = new byte[1];
|
byte[] data = new byte[1];
|
||||||
socketInputStream.read(data);
|
socketInputStream.read(data);
|
||||||
|
|
||||||
int length = 16 * data[0];
|
int length = 16 * data[0];
|
||||||
data = new byte[length];
|
data = new byte[length];
|
||||||
socketInputStream.read(data);
|
socketInputStream.read(data);
|
||||||
@@ -178,10 +179,13 @@ public class Stream extends Worker implements Producer, Format.Mp3 {
|
|||||||
logger.error("", e);
|
logger.error("", e);
|
||||||
}
|
}
|
||||||
stop();
|
stop();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
public InputStream getInputStream() {
|
public InputStream getInputStream() {
|
||||||
greedyInputStream = new GreedyInputStream(audioCircularByteBuffer.getInputStream());
|
if (greedyInputStream == null) {
|
||||||
|
greedyInputStream = new GreedyInputStream(audioCircularByteBuffer.getInputStream());
|
||||||
|
}
|
||||||
return greedyInputStream;
|
return greedyInputStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
package sound;
|
package sound.util;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import javax.sound.sampled.AudioFormat;
|
import javax.sound.sampled.AudioFormat;
|
||||||
|
|
||||||
import sound.SoxBuilder.Option.Combine;
|
import sound.util.SoxBuilder.Option.Combine;
|
||||||
import sound.SoxBuilder.Option.Replay;
|
import sound.util.SoxBuilder.Option.Replay;
|
||||||
|
|
||||||
|
|
||||||
public final class SoxBuilder {
|
public final class SoxBuilder {
|
||||||
protected static SoxBuilder instance;
|
protected static SoxBuilder instance;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package sound;
|
package sound.util;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package old;
|
package sound.util;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -1,25 +1,38 @@
|
|||||||
package sound;
|
package test;
|
||||||
|
|
||||||
import javax.sound.sampled.AudioFormat;
|
import javax.sound.sampled.AudioFormat;
|
||||||
|
|
||||||
|
import sound.Consumer;
|
||||||
|
import sound.Producer;
|
||||||
|
import sound.Source;
|
||||||
|
import sound.Target;
|
||||||
|
import sound.consumer.Port;
|
||||||
|
import sound.consumer.Shoutcast;
|
||||||
|
import sound.producer.Stream;
|
||||||
|
|
||||||
public class Test {
|
public class Test {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 48000f, 16, 2, 4, 48000f, true);
|
AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 48000f, 16, 2, 4, 48000f, true);
|
||||||
try {
|
try {
|
||||||
Producer p1 = new Target("Line-In (Creative SB X-Fi)");
|
//Producer p1 = new Target("Line-In (Creative SB X-Fi)");
|
||||||
Producer p2 = new Target("Line 1 (Virtual Audio Cable)", audioFormat);
|
Producer p2 = new Target("Line 1 (Virtual Audio Cable)", audioFormat);
|
||||||
Producer p3 = new Stream("http://ics2gss.omroep.nl:80/3fm-bb-mp3");
|
Producer p3 = new Stream("http://ics2gss.omroep.nl:80/3fm-bb-mp3");
|
||||||
|
Producer p4 = new Stream("http://sc7.mystreamserver.com:8004");
|
||||||
|
|
||||||
Consumer c1 = new Source("Java Sound Audio Engine");
|
Consumer c1 = new Source("Java Sound Audio Engine");
|
||||||
Consumer c2 = new Port("Speakers (Creative SB X-Fi)");
|
Consumer c2 = new Port("Speakers (Creative SB X-Fi)");
|
||||||
|
Consumer c3 = new Shoutcast();
|
||||||
|
|
||||||
c2.start(p3);
|
//Utils.write(p3.getInputStream(), new File("stream.out"));
|
||||||
|
//Utils.play(p3.getInputStream());
|
||||||
|
c3.start(p3);
|
||||||
|
|
||||||
/*while (true) {
|
while (true) {
|
||||||
Thread.sleep(3000);
|
Thread.sleep(3000);
|
||||||
c2.stop();
|
c2.stop();
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
c2.start();
|
c2.start();
|
||||||
}*/
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@ import javax.sound.sampled.AudioSystem;
|
|||||||
import javax.sound.sampled.Line;
|
import javax.sound.sampled.Line;
|
||||||
import javax.sound.sampled.LineUnavailableException;
|
import javax.sound.sampled.LineUnavailableException;
|
||||||
import javax.sound.sampled.Mixer;
|
import javax.sound.sampled.Mixer;
|
||||||
|
import javax.sound.sampled.SourceDataLine;
|
||||||
import javax.sound.sampled.TargetDataLine;
|
import javax.sound.sampled.TargetDataLine;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
@@ -18,8 +19,12 @@ public class Main {
|
|||||||
for (Line.Info lineInfo : mixer.getTargetLineInfo()) {
|
for (Line.Info lineInfo : mixer.getTargetLineInfo()) {
|
||||||
try {
|
try {
|
||||||
Line line = mixer.getLine(lineInfo);
|
Line line = mixer.getLine(lineInfo);
|
||||||
if (mixer.isLineSupported(lineInfo) && line instanceof TargetDataLine) {
|
if (mixer.isLineSupported(lineInfo)) {
|
||||||
new TargetLine(mixer, (TargetDataLine) line);
|
if (line instanceof TargetDataLine) {
|
||||||
|
new TargetLine(mixer, (TargetDataLine) line);
|
||||||
|
}/* else if (line instanceof SourceDataLine) {
|
||||||
|
new SourceLine(mixer, (SourceDataLine) line);
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
} catch (LineUnavailableException e) {}
|
} catch (LineUnavailableException e) {}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user