kopia lustrzana https://github.com/jameshball/osci-render
Show audio sample format and start to make sample format generic
rodzic
4a1b67f825
commit
b66bf6e4eb
|
@ -40,7 +40,7 @@ public class DefaultAudioDevice implements AudioDevice {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
String simplifiedName = name.replaceFirst(" \\(Shared\\)", "");
|
String simplifiedName = name.replaceFirst(" \\(Shared\\)", "");
|
||||||
simplifiedName = simplifiedName.replaceFirst(" \\(NVIDIA High Definition Audio\\)", "");
|
simplifiedName = simplifiedName.replaceFirst(" \\(NVIDIA High Definition Audio\\)", "");
|
||||||
return simplifiedName + " @ " + sampleRate + "KHz";
|
return simplifiedName + " @ " + sampleRate + "kHz, " + sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -17,6 +17,7 @@ public class XtAudioEngine implements AudioEngine {
|
||||||
|
|
||||||
private volatile boolean stopped = false;
|
private volatile boolean stopped = false;
|
||||||
|
|
||||||
|
private AudioDevice device;
|
||||||
private boolean playing = false;
|
private boolean playing = false;
|
||||||
private ReentrantLock renderLock;
|
private ReentrantLock renderLock;
|
||||||
private Callable<Vector2> channelGenerator;
|
private Callable<Vector2> channelGenerator;
|
||||||
|
@ -29,12 +30,11 @@ public class XtAudioEngine implements AudioEngine {
|
||||||
if (renderLock != null) {
|
if (renderLock != null) {
|
||||||
renderLock.lock();
|
renderLock.lock();
|
||||||
}
|
}
|
||||||
float[] output = (float[]) safe.getOutput();
|
Object output = safe.getOutput();
|
||||||
|
|
||||||
for (int f = 0; f < buffer.frames; f++) {
|
for (int f = 0; f < buffer.frames; f++) {
|
||||||
Vector2 channels = channelGenerator.call();
|
Vector2 channels = channelGenerator.call();
|
||||||
output[f * NUM_OUTPUTS] = (float) channels.getX();
|
writeChannels(channels, output, f);
|
||||||
output[f * NUM_OUTPUTS + 1] = (float) channels.getY();
|
|
||||||
}
|
}
|
||||||
safe.unlock(buffer);
|
safe.unlock(buffer);
|
||||||
if (renderLock != null) {
|
if (renderLock != null) {
|
||||||
|
@ -43,6 +43,54 @@ public class XtAudioEngine implements AudioEngine {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void writeChannels(Vector2 channels, Object output, int frame) {
|
||||||
|
int index = frame * NUM_OUTPUTS;
|
||||||
|
switch (device.sample()) {
|
||||||
|
case UINT8 -> {
|
||||||
|
byte[] byteOutput = (byte[]) output;
|
||||||
|
byteOutput[index] = (byte) ((int) (128 * (channels.getX() + 1)));
|
||||||
|
byteOutput[index + 1] = (byte) ((int) (128 * (channels.getY() + 1)));
|
||||||
|
}
|
||||||
|
case INT8 -> {
|
||||||
|
byte[] byteOutput = (byte[]) output;
|
||||||
|
byteOutput[index] = (byte) ((int) (128 * channels.getX()));
|
||||||
|
byteOutput[index + 1] = (byte) ((int) (128 * channels.getY()));
|
||||||
|
}
|
||||||
|
case INT16 -> {
|
||||||
|
short[] shortOutput = (short[]) output;
|
||||||
|
shortOutput[index] = (short) (channels.getX() * Short.MAX_VALUE);
|
||||||
|
shortOutput[index + 1] = (short) (channels.getY() * Short.MAX_VALUE);
|
||||||
|
}
|
||||||
|
case INT24 -> {
|
||||||
|
index *= 3;
|
||||||
|
byte[] byteOutput = (byte[]) output;
|
||||||
|
int leftChannel = (int) (channels.getX() * 8388607);
|
||||||
|
int rightChannel = (int) (channels.getX() * 8388607);
|
||||||
|
byteOutput[index] = (byte) (leftChannel >> 16);
|
||||||
|
byteOutput[index + 1] = (byte) (leftChannel >> 8);
|
||||||
|
byteOutput[index + 2] = (byte) leftChannel;
|
||||||
|
byteOutput[index + 3] = (byte) (rightChannel >> 16);
|
||||||
|
byteOutput[index + 4] = (byte) (rightChannel >> 8);
|
||||||
|
byteOutput[index + 5] = (byte) rightChannel;
|
||||||
|
}
|
||||||
|
case INT32 -> {
|
||||||
|
int[] intOutput = (int[]) output;
|
||||||
|
intOutput[index] = (int) (channels.getX() * Integer.MAX_VALUE);
|
||||||
|
intOutput[index + 1] = (int) (channels.getY() * Integer.MAX_VALUE);
|
||||||
|
}
|
||||||
|
case FLOAT32 -> {
|
||||||
|
float[] floatOutput = (float[]) output;
|
||||||
|
floatOutput[index] = (float) channels.getX();
|
||||||
|
floatOutput[index + 1] = (float) channels.getY();
|
||||||
|
}
|
||||||
|
case FLOAT64 -> {
|
||||||
|
double[] doubleOutput = (double[]) output;
|
||||||
|
doubleOutput[index] = channels.getX();
|
||||||
|
doubleOutput[index + 1] = channels.getY();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isPlaying() {
|
public boolean isPlaying() {
|
||||||
return playing;
|
return playing;
|
||||||
|
@ -50,15 +98,15 @@ public class XtAudioEngine implements AudioEngine {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void play(Callable<Vector2> channelGenerator, ReentrantLock renderLock, AudioDevice device) {
|
public void play(Callable<Vector2> channelGenerator, ReentrantLock renderLock, AudioDevice device) {
|
||||||
playing = true;
|
this.playing = true;
|
||||||
|
this.device = device;
|
||||||
this.channelGenerator = channelGenerator;
|
this.channelGenerator = channelGenerator;
|
||||||
this.renderLock = renderLock;
|
this.renderLock = renderLock;
|
||||||
try (XtPlatform platform = XtAudio.init(null, null)) {
|
try (XtPlatform platform = XtAudio.init(null, null)) {
|
||||||
XtService service = getService(platform);
|
XtService service = getService(platform);
|
||||||
|
|
||||||
try (XtDevice xtDevice = service.openDevice(device.id())) {
|
try (XtDevice xtDevice = service.openDevice(device.id())) {
|
||||||
// TODO: Make this generic to the type of XtSample of the current device.
|
Structs.XtMix mix = xtDevice.getMix().orElseThrow();
|
||||||
Structs.XtMix mix = new Structs.XtMix(xtDevice.getMix().orElseThrow().rate, Enums.XtSample.FLOAT32);
|
|
||||||
Structs.XtChannels channels = new Structs.XtChannels(0, 0, NUM_OUTPUTS, 0);
|
Structs.XtChannels channels = new Structs.XtChannels(0, 0, NUM_OUTPUTS, 0);
|
||||||
Structs.XtFormat format = new Structs.XtFormat(mix, channels);
|
Structs.XtFormat format = new Structs.XtFormat(mix, channels);
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,6 @@
|
||||||
-fx-background-radius: 0;
|
-fx-background-radius: 0;
|
||||||
-fx-border-radius: 0;
|
-fx-border-radius: 0;
|
||||||
-fx-border-width: 0;
|
-fx-border-width: 0;
|
||||||
-fx-cell-size: 35;
|
|
||||||
|
|
||||||
/* No alternate highlighting */
|
/* No alternate highlighting */
|
||||||
-fx-background-color: dark_color;
|
-fx-background-color: dark_color;
|
||||||
|
|
Ładowanie…
Reference in New Issue