This commit is contained in:
loliball 2024-08-31 03:38:20 +08:00
parent c29eca959b
commit 6d388e4db4

View File

@ -1,10 +1,7 @@
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import java.io.IOException import java.io.IOException
import java.io.InputStream
import java.io.OutputStream
import java.net.ServerSocket import java.net.ServerSocket
import java.net.Socket import java.net.Socket
import java.util.* import java.util.*
@ -13,8 +10,6 @@ import java.util.concurrent.CopyOnWriteArrayList
var clientAudios: MutableList<ClientAudio> = CopyOnWriteArrayList() var clientAudios: MutableList<ClientAudio> = CopyOnWriteArrayList()
var BUFFER_SIZE: Int = 2048 * CHANNELS var BUFFER_SIZE: Int = 2048 * CHANNELS
var buffer: ByteArray = ByteArray(BUFFER_SIZE * 2)
fun main() = runBlocking { fun main() = runBlocking {
//混音 //混音
launch(Dispatchers.Default) { launch(Dispatchers.Default) {
@ -31,11 +26,11 @@ fun main() = runBlocking {
for (client in clientAudios) { for (client in clientAudios) {
launch(Dispatchers.Default) { launch(Dispatchers.Default) {
for (audio in clientAudios) { for (audio in clientAudios) {
if (audio != client) if (audio != client) {
audio.mix(client.mixSample) audio.mix(client.sample)
}
} }
AudioConvert.convertFloatToShortByte(client.mixSample, buffer) client.send()
client.send(buffer)
} }
} }
} }
@ -50,35 +45,28 @@ fun main() = runBlocking {
} }
class ClientAudio(var socket: Socket) { class ClientAudio(var socket: Socket) {
var `in`: InputStream? = null val `in` = socket.getInputStream()
var out: OutputStream? = null val out = socket.getOutputStream()
var buffer: ByteArray = ByteArray(BUFFER_SIZE * 2) val buffer: ByteArray = ByteArray(BUFFER_SIZE * 2)
var sample: FloatArray = FloatArray(BUFFER_SIZE) val sample: FloatArray = FloatArray(BUFFER_SIZE)
var mixSample: FloatArray = FloatArray(BUFFER_SIZE) val mixSample: FloatArray = FloatArray(BUFFER_SIZE)
var mixBuffer: ByteArray = ByteArray(BUFFER_SIZE * 2)
init {
try {
`in` = socket.getInputStream()
out = socket.getOutputStream()
} catch (e: IOException) {
throw RuntimeException(e)
}
}
val isConnected: Boolean val isConnected: Boolean
get() = socket.isConnected get() = socket.isConnected
fun send(buffer: ByteArray) { fun send() {
try { try {
out!!.write(buffer) AudioConvert.convertFloatToShortByte(mixSample, mixBuffer)
out!!.flush() out.write(mixBuffer)
out.flush()
} catch (e: IOException) { } catch (e: IOException) {
} }
} }
fun read() { fun read() {
try { try {
`in`!!.read(buffer) `in`.read(buffer)
AudioConvert.convertShortByteToFloat(buffer, sample) AudioConvert.convertShortByteToFloat(buffer, sample)
Arrays.fill(mixSample, 0f) Arrays.fill(mixSample, 0f)
} catch (e: IOException) { } catch (e: IOException) {
@ -88,7 +76,7 @@ class ClientAudio(var socket: Socket) {
fun mix(sample: FloatArray) { fun mix(sample: FloatArray) {
for (i in sample.indices) { for (i in sample.indices) {
sample[i] += this.sample[i] mixSample[i] += sample[i]
} }
} }
} }