diff options
author | SoniEx2 <endermoneymod@gmail.com> | 2025-03-16 18:43:46 -0300 |
---|---|---|
committer | SoniEx2 <endermoneymod@gmail.com> | 2025-03-16 18:43:46 -0300 |
commit | 1ed7a0ccd811f6ff9422a1e3bdd33ad4b49dcc61 (patch) | |
tree | 64fcc319e49a693f27fda9334fa9313d0ab76d41 | |
parent | 0b01b21abb666ff70f7143d8a2534650fa48fe86 (diff) |
it works!
5 files changed, 44 insertions, 28 deletions
diff --git a/src/client/kotlin/space/autistic/radio/client/fmsim/FastModulatedNoise.kt b/src/client/kotlin/space/autistic/radio/client/fmsim/FastModulatedNoise.kt index d6bbdb2..9639a38 100644 --- a/src/client/kotlin/space/autistic/radio/client/fmsim/FastModulatedNoise.kt +++ b/src/client/kotlin/space/autistic/radio/client/fmsim/FastModulatedNoise.kt @@ -41,9 +41,9 @@ class FastModulatedNoise(which: Which) { } companion object { - // 0.1 second - private val baseNoise = FloatArray(300000 * 2 / 10) - private val upperNoise = FloatArray(300000 * 2 / 10) + // 1 second + private val baseNoise = FloatArray(300000 * 2) + private val upperNoise = FloatArray(300000 * 2) init { val fmsim = FmFullModulator() @@ -53,7 +53,9 @@ class FastModulatedNoise(which: Which) { while (buffer.hasRemaining()) { input.clear() while (input.hasRemaining()) { - input.put(random.nextFloat(1f)) + val sample = random.nextFloat(1f) + input.put(sample) + input.put(sample) } input.clear() fmsim.process(input, 1f, false) { diff --git a/src/client/kotlin/space/autistic/radio/client/fmsim/FmFullThread.kt b/src/client/kotlin/space/autistic/radio/client/fmsim/FmFullThread.kt index 1fd401e..0a6184f 100644 --- a/src/client/kotlin/space/autistic/radio/client/fmsim/FmFullThread.kt +++ b/src/client/kotlin/space/autistic/radio/client/fmsim/FmFullThread.kt @@ -109,6 +109,7 @@ object FmFullThread : Runnable { } for (i in 0 until 2 * 6) inputBuffer.put(sample) } + inputBuffer.clear() val mixingBuffer = it.mixingBuffer it.modulator.process(inputBuffer, it.power, false) { outputBuffer -> for (i in 0 until mixingBuffer.capacity()) { @@ -155,23 +156,23 @@ object FmFullThread : Runnable { } } -// noiseGens.forEachIndexed { index, v -> -// if (currentTask.noiseLevels[index] != 0f) { -// v.generateNoise(currentTask.noiseLevels[index]) { outputBuffer -> -// val mixingBuffer = mixingBuffers[1] -// for (i in 0 until mixingBuffer.capacity()) { -// mixingBuffer.put(i, mixingBuffer.get(i) + outputBuffer.get()) -// } -// } -// } -// } -// -// noiseFloor.noiseBlock { outputBuffer -> -// val mixingBuffer = mixingBuffers[1] -// for (i in 0 until mixingBuffer.capacity()) { -// mixingBuffer.put(i, mixingBuffer.get(i) + outputBuffer.get()) -// } -// } + noiseGens.forEachIndexed { index, v -> + if (currentTask.noiseLevels[index] != 0f) { + v.generateNoise(currentTask.noiseLevels[index]) { outputBuffer -> + val mixingBuffer = mixingBuffers[1] + for (i in 0 until mixingBuffer.capacity()) { + mixingBuffer.put(i, mixingBuffer.get(i) + outputBuffer.get()) + } + } + } + } + + noiseFloor.noiseBlock { outputBuffer -> + val mixingBuffer = mixingBuffers[1] + for (i in 0 until mixingBuffer.capacity()) { + mixingBuffer.put(i, mixingBuffer.get(i) + outputBuffer.get()) + } + } demodulator.process(mixingBuffers[1], PirateRadioClient.stereo) { _, audioBuffer -> // TODO stereo pilot diff --git a/src/client/kotlin/space/autistic/radio/client/fmsim/NoiseFloor.kt b/src/client/kotlin/space/autistic/radio/client/fmsim/NoiseFloor.kt index ea6a380..92df212 100644 --- a/src/client/kotlin/space/autistic/radio/client/fmsim/NoiseFloor.kt +++ b/src/client/kotlin/space/autistic/radio/client/fmsim/NoiseFloor.kt @@ -5,7 +5,8 @@ import java.util.concurrent.ThreadLocalRandom import java.util.function.Consumer class NoiseFloor(level: Float) { - private val buffer = FloatBuffer.allocate(FmFullConstants.FFT_DATA_BLOCK_SIZE_48K_300K * 2) + private val buffer = FloatBuffer.allocate(300000 * 2) + private val outputBuffer = FloatBuffer.allocate(FmFullConstants.FFT_DATA_BLOCK_SIZE_48K_300K * 2) init { // FIXME is this how you generate IQ noise? @@ -13,12 +14,18 @@ class NoiseFloor(level: Float) { val dLevel = level.toDouble() while (buffer.hasRemaining()) { buffer.put(random.nextGaussian(0.0, dLevel).toFloat()) + buffer.put(0f) } } // complex noise, in IQ format? fun noiseBlock(consumer: Consumer<FloatBuffer>) { - buffer.clear() - consumer.accept(buffer) + outputBuffer.clear() + while (outputBuffer.hasRemaining()) { + if (!buffer.hasRemaining()) buffer.clear() + outputBuffer.put(buffer.get()) + } + outputBuffer.clear() + consumer.accept(outputBuffer) } } \ No newline at end of file diff --git a/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt b/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt index 2fb6fb4..5fb80bc 100644 --- a/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt +++ b/src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt @@ -90,15 +90,14 @@ class PirateRadioSoundInstance(private val player: ClientPlayerEntity) : MovingS it.frequency - PirateRadioClient.frequency ) } - if (player.world.time % 200L == 0L) { - println("tracking transmitters: $trackedTransmitters") - } // this can be empty but it is not EMPTY_TASK trackedTransmitterQueue.offer( FmFullThread.FmTask( trackedTransmitters, floatArrayOf(lowerNoise, mainNoise, upperNoise) ) ) + volume = PirateRadioClient.volume.toFloat() / 10 + volume *= volume } private fun getPowerReceived(rsq: Double): Float { diff --git a/src/client/kotlin/space/autistic/radio/client/sound/ReceiverAudioStream.kt b/src/client/kotlin/space/autistic/radio/client/sound/ReceiverAudioStream.kt index 720d65d..274e727 100644 --- a/src/client/kotlin/space/autistic/radio/client/sound/ReceiverAudioStream.kt +++ b/src/client/kotlin/space/autistic/radio/client/sound/ReceiverAudioStream.kt @@ -6,13 +6,20 @@ import space.autistic.radio.client.fmsim.FmFullConstants import space.autistic.radio.client.fmsim.FmFullThread import space.autistic.radio.client.fmsim.FmFullThread.trackedTransmitterQueue import java.nio.FloatBuffer +import java.util.Properties import java.util.concurrent.ArrayBlockingQueue import javax.sound.sampled.AudioFormat +import kotlin.math.max object ReceiverAudioStream : BufferedAudioStream { private val format = AudioFormat(48000f, 16, 2, true, false) - val bufferQueue = ArrayBlockingQueue<FloatBuffer>(200) + val bufferQueue = ArrayBlockingQueue<FloatBuffer>( + max( + 0, + System.getProperty("space.autistic.radio.buffers", "").toIntOrNull() ?: 250 + ) + ) private val skipBuffer = FloatBuffer.allocate(FmFullConstants.FFT_DATA_BLOCK_SIZE_LPF_48K_15K_3K1 * 2) get() = field.clear() |