From 4486bb67a903335acf46b576e7f2ce0110fbcd0a Mon Sep 17 00:00:00 2001 From: DaniTheSkunk Date: Wed, 12 Oct 2022 06:23:19 +0000 Subject: [PATCH] testing audio stuffs --- .idea/artifacts/skunkworks_jar.xml | 2 + .idea/libraries/lwjgl.xml | 3 + com/danitheskunk/skunkworks/TestSound.java | 76 ++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 com/danitheskunk/skunkworks/TestSound.java diff --git a/.idea/artifacts/skunkworks_jar.xml b/.idea/artifacts/skunkworks_jar.xml index f4332cc..ce8ca44 100644 --- a/.idea/artifacts/skunkworks_jar.xml +++ b/.idea/artifacts/skunkworks_jar.xml @@ -13,6 +13,8 @@ + + \ No newline at end of file diff --git a/.idea/libraries/lwjgl.xml b/.idea/libraries/lwjgl.xml index e577f96..5d1470d 100644 --- a/.idea/libraries/lwjgl.xml +++ b/.idea/libraries/lwjgl.xml @@ -9,12 +9,15 @@ + + + diff --git a/com/danitheskunk/skunkworks/TestSound.java b/com/danitheskunk/skunkworks/TestSound.java new file mode 100644 index 0000000..da74d6e --- /dev/null +++ b/com/danitheskunk/skunkworks/TestSound.java @@ -0,0 +1,76 @@ +package com.danitheskunk.skunkworks; + +import org.lwjgl.openal.AL; +import org.lwjgl.openal.ALC; + +import javax.sound.sampled.*; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import static org.lwjgl.openal.AL10.*; +import static org.lwjgl.openal.ALC10.*; + +public class TestSound { + public static void main(String args[]) { + var device = alcOpenDevice((ByteBuffer) null); + if(device == 0) { + throw new RuntimeException("couldn't init openal device"); + } + var deviceCaps = ALC.createCapabilities(device); + var context = alcCreateContext(device, (IntBuffer) null); + if(context == 0) { + throw new RuntimeException("couldn't create openal context"); + } + alcMakeContextCurrent(context); + AL.createCapabilities(deviceCaps); + + var buf = alGenBuffers(); + int sampleRate = 44100; + var samples = new short[sampleRate * 2]; + for(int i = 0; i < samples.length; ++i) { + var s = Math.sin(2 * Math.PI * 220 * i / (double) sampleRate); + var s2 = Math.sin(2 * Math.PI * 440 * i / (double) sampleRate + + s * 10 * (88200 - i) / 88200); + //s = s * s2 * i / 88200; + s = s2 * (88200 - i) / 88200; + samples[i] = (short) (s * 32760); + } + + var bb = ByteBuffer.allocate(samples.length * 2); + for(int i = 0; i < samples.length; ++i) { + bb.putShort(samples[i]); + } + + var bytes = bb.array(); + + AudioInputStream audio; + var format = new AudioFormat(sampleRate, 16, 1, true, true); + audio = new AudioInputStream( + new ByteArrayInputStream(bytes), + format, + bytes.length + ); + try { + AudioSystem.write(audio, + AudioFileFormat.Type.WAVE, + new File("meow.wav") + ); + } catch(IOException e) { + throw new RuntimeException(e); + } + + alBufferData(buf, AL_FORMAT_MONO16, samples, sampleRate); + + var src = alGenSources(); + alSourcei(src, AL_BUFFER, buf); + alSourcePlay(src); + try { + Thread.sleep(3000); + } catch(InterruptedException e) { + throw new RuntimeException(e); + } + } +}