Skip to content

Commit 2f9f455

Browse files
committed
Real time buffer (?)
1 parent 26db053 commit 2f9f455

File tree

6 files changed

+39
-11
lines changed

6 files changed

+39
-11
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ MTC and LTC timecode generator library in Java
1212
## TODO list:
1313
- ALL of the MTC part
1414
- Write a timecode reader for both MTC and LTC
15-
- Changing audio output method to something more real time (now "real time" is garanted by just reducing the buffer size lmao)
1615
- 44.1khz support (But I think this will be done together with the previous point)
1716
- Writing docs (sigh)
1817
- Writing an example/test

src/main/java/ovh/stranck/javaTimecode/App.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77

88
public class App {
99
public static void main(String[] args) throws LineUnavailableException {
10-
Mixer m = Utils.getMixer("*Realtek*");
10+
Mixer m = Utils.getMixer("*PnP*");
1111
System.out.println(m.getMixerInfo());
1212
LTCGenerator ltc = new LTCGenerator(m, 48000);
1313
TimecodePlayer tp = ltc.getTimecodePlayer();
1414
Timecode tc = ltc.getPacket();
1515
System.out.println("starting");
1616
ltc.start();
17-
Wait.wait(1000);
17+
//Wait.wait(1000);
1818
//tc.setHours(1);
1919
//Wait.wait(5000);
2020
tp.setSpeed(1);

src/main/java/ovh/stranck/javaTimecode/Timecode.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public abstract class Timecode {
1010

1111
public abstract byte[] asByteArray();
1212
public abstract String asBitsString();
13+
public abstract int getPacketSize(Object o);
1314

1415
public Timecode(int hour, int min, int sec, int frame, Framerates framerate){
1516
this.framerate = framerate;
@@ -145,6 +146,11 @@ public Timecode previousFrame(){
145146
sanityzeTime(true);
146147
return this;
147148
}
149+
public Timecode addFrames(int frames){
150+
this.frames += frames;
151+
sanityzeTime(true);
152+
return this;
153+
}
148154
public Framerates getFramerate() {
149155
return framerate;
150156
}

src/main/java/ovh/stranck/javaTimecode/TimecodePlayer.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ public TimecodePlayer(Timecode t, double speed){
1616
setSpeed(speed);
1717
}
1818

19-
public synchronized TimecodePlayer updateTimecodeTime(){
19+
public int convertToFrames(int value){
20+
return (int) (value * speed * t.getFramerate().getIntegerFramerate() / 1000 + zFrame + offset);
21+
}
22+
public synchronized TimecodePlayer updateTimecodeTime(int msOffset){
2023
if(playing){
2124
//System.out.println((System.currentTimeMillis() - zMs) + " ");
22-
t.setTimeWithoutUpdatingStartPoint((int) ((System.currentTimeMillis() - zMs)
23-
* speed * t.getFramerate().getIntegerFramerate() / 1000 + zFrame + offset));
25+
t.setTimeWithoutUpdatingStartPoint(convertToFrames((int) (System.currentTimeMillis() - zMs + msOffset)));
2426
}
2527
return this;
2628
}

src/main/java/ovh/stranck/javaTimecode/ltc/LTCGenerator.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import javax.sound.sampled.AudioFormat;
44
import javax.sound.sampled.DataLine;
5+
import javax.sound.sampled.LineEvent;
6+
import javax.sound.sampled.LineListener;
57
import javax.sound.sampled.LineUnavailableException;
68
import javax.sound.sampled.Mixer;
79
import javax.sound.sampled.SourceDataLine;
@@ -10,37 +12,49 @@
1012
import ovh.stranck.javaTimecode.Wait;
1113

1214
public class LTCGenerator implements Runnable {
13-
private volatile float bufferCapacity = 0.5f;
15+
private volatile float bufferCapacity = 0.01f;
1416
private volatile TimecodePlayer tcPlayer;
1517
private volatile LTCPacket packet;
1618

1719
private SourceDataLine dataLine;
1820
private Thread runThread;
1921
private Mixer mixer;
2022
private int sampleRate;
23+
private int packetSize;
2124

2225
public LTCGenerator(Mixer output, int sampleRate) throws LineUnavailableException{
2326
this.mixer = output;
2427
this.sampleRate = sampleRate;
2528
setPacket(new LTCPacket());
29+
packetSize = packet.getPacketSize(sampleRate);
2630

2731
AudioFormat format = new AudioFormat(sampleRate, 8, 1, true, true);
2832
SourceDataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
2933
dataLine = (SourceDataLine) mixer.getLine(info);
3034
dataLine.open();
3135
dataLine.start();
36+
dataLine.addLineListener(new LineListener() {
37+
38+
public void update(LineEvent event) {
39+
System.out.println("ev " + event.getType());
40+
}
41+
});
3242
}
3343

3444
public void run() {
3545
byte[] content;
46+
int bufferUsed;
3647
tcPlayer.updateStartPoint();
3748
while(!Thread.interrupted()){
38-
if(dataLine.getBufferSize() * bufferCapacity < dataLine.available()){
39-
tcPlayer.updateTimecodeTime();
49+
bufferUsed = dataLine.getBufferSize() - dataLine.available();
50+
//System.out.println(bufferUsed);
51+
if(bufferUsed < packetSize * bufferCapacity){
52+
tcPlayer.updateTimecodeTime(bufferUsed * 1000 / sampleRate);
4053
content = packet.asAudioSample(sampleRate);
4154
dataLine.write(content, 0, content.length);
4255
System.out.println(packet);
4356
}
57+
//System.out.println(dataLine.getBufferSize() - dataLine.available() + " " + packetSize * bufferCapacity);
4458
Wait.wait(1);
4559
}
4660
dataLine.drain();

src/main/java/ovh/stranck/javaTimecode/ltc/LTCPacket.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ public boolean[] asBooleanArray(){
7070
return data;
7171
}
7272
public byte[] asAudioSample(int sampleRate){
73-
int repeat = (int) (sampleRate / (160 * framerate.getFps()));
74-
return manchesterEncode(asBooleanArray(), repeat);
73+
return manchesterEncode(asBooleanArray(), getBitExpansion(sampleRate));
7574
}
7675
@Override
7776
public byte[] asByteArray() {
@@ -86,6 +85,14 @@ public String asBitsString(){
8685

8786
return sb.toString();
8887
}
88+
@Override
89+
public int getPacketSize(Object o){
90+
return 160 * getBitExpansion((Integer) o);
91+
}
92+
93+
private int getBitExpansion(int sampleRate){
94+
return (int) (sampleRate / (160 * framerate.getFps()));
95+
}
8996

9097
private byte[] manchesterEncode(boolean value[], int repeatBytes) {
9198
byte[] result = new byte[value.length * 2 * repeatBytes];

0 commit comments

Comments
 (0)