From c777831fdef0a54456d0d14545aa19d2a8ace24d Mon Sep 17 00:00:00 2001 From: loliball <26589867+loliball@users.noreply.github.com> Date: Sat, 31 Aug 2024 04:01:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E6=94=B92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Client.kt | 23 ++++++++++++++++------- src/Server.kt | 17 +++++++---------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/Client.kt b/src/Client.kt index 4f00e78..de4fc2d 100644 --- a/src/Client.kt +++ b/src/Client.kt @@ -4,22 +4,27 @@ import kotlinx.coroutines.runBlocking import java.io.IOException import java.io.InputStream import java.io.OutputStream +import java.net.InetSocketAddress import java.net.Socket +import java.util.Arrays import javax.sound.sampled.AudioFormat import javax.sound.sampled.AudioSystem +import kotlin.system.measureTimeMillis -var `in`: InputStream? = null -var out: OutputStream? = null +var SAMPLE_RATE: Int = 48000 +var CHANNELS: Int = 1 +var BUFFER_SIZE: Int = 2048 * CHANNELS var sample = FloatArray(BUFFER_SIZE) var bufferOut = ByteArray(sample.size * 2) var bufferIn = ByteArray(sample.size * 2) -var SAMPLE_RATE: Int = 48000 -var CHANNELS: Int = 1 var format: AudioFormat = AudioConvert.getAudioFormat(SAMPLE_RATE, CHANNELS) var socket: Socket? = null var targetDataLine = AudioSystem.getTargetDataLine(format) var sourceDataLine = AudioSystem.getSourceDataLine(format) +var `in`: InputStream? = null +var out: OutputStream? = null + object Client { @JvmStatic fun main(args: Array) { @@ -28,7 +33,11 @@ object Client { } fun mainClient() = runBlocking { - socket = Socket("127.0.0.1", 7860) + val t = measureTimeMillis { +// socket = Socket("zedo.top", 7860) + socket = Socket("127.0.0.1", 7860) + } + println("connect done! $t") `in` = socket!!.getInputStream() out = socket!!.getOutputStream() @@ -38,7 +47,7 @@ fun mainClient() = runBlocking { sourceDataLine.open(format, bufferIn.size) sourceDataLine.start() - launch(Dispatchers.Default) { + launch(Dispatchers.IO) { while (true) { //Arrays.fill(bufferOut, (byte) 0); targetDataLine.read(bufferOut, 0, bufferOut.size) @@ -52,7 +61,7 @@ fun mainClient() = runBlocking { } } - launch { + launch(Dispatchers.IO) { while (true) { try { `in`!!.read(bufferIn, 0, bufferIn.size) diff --git a/src/Server.kt b/src/Server.kt index be8e44d..2bf3997 100644 --- a/src/Server.kt +++ b/src/Server.kt @@ -8,27 +8,25 @@ import java.util.* import java.util.concurrent.CopyOnWriteArrayList var clientAudios: MutableList = CopyOnWriteArrayList() -var BUFFER_SIZE: Int = 2048 * CHANNELS fun main() = runBlocking { //混音 - launch(Dispatchers.Default) { + launch(Dispatchers.IO) { while (true) { for (client in clientAudios) { if (!client.isConnected) { clientAudios.remove(client) - println("现在是: " + clientAudios) + println("现在是: $clientAudios") continue } client.read() } for (client in clientAudios) { - launch(Dispatchers.Default) { + launch(Dispatchers.IO) { for (audio in clientAudios) { - if (audio != client) { + if (audio != client) audio.mix(client.sample) - } } client.send() } @@ -51,9 +49,7 @@ class ClientAudio(var socket: Socket) { val sample: FloatArray = FloatArray(BUFFER_SIZE) val mixSample: FloatArray = FloatArray(BUFFER_SIZE) var mixBuffer: ByteArray = ByteArray(BUFFER_SIZE * 2) - - val isConnected: Boolean - get() = socket.isConnected + var isConnected = true fun send() { try { @@ -61,6 +57,7 @@ class ClientAudio(var socket: Socket) { out.write(mixBuffer) out.flush() } catch (e: IOException) { + isConnected = false } } @@ -70,7 +67,7 @@ class ClientAudio(var socket: Socket) { AudioConvert.convertShortByteToFloat(buffer, sample) Arrays.fill(mixSample, 0f) } catch (e: IOException) { - //throw new RuntimeException(e); + isConnected = false } }