summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/client/kotlin/space/autistic/radio/client/fmsim/FastModulatedNoise.kt10
-rw-r--r--src/client/kotlin/space/autistic/radio/client/fmsim/FmFullThread.kt35
-rw-r--r--src/client/kotlin/space/autistic/radio/client/fmsim/NoiseFloor.kt13
-rw-r--r--src/client/kotlin/space/autistic/radio/client/sound/PirateRadioSoundInstance.kt5
-rw-r--r--src/client/kotlin/space/autistic/radio/client/sound/ReceiverAudioStream.kt9
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()