@@ -16,6 +16,8 @@ import kotlinx.coroutines.delay
1616import kotlinx.coroutines.flow.Flow
1717import kotlinx.coroutines.flow.channelFlow
1818import kotlinx.coroutines.launch
19+ import java.nio.ByteBuffer
20+ import java.nio.ByteOrder
1921
2022// manage microphone recording
2123class MicAudioManager (
@@ -35,6 +37,8 @@ class MicAudioManager(
3537 private val recorder: AudioRecord
3638 private val bufferSize: Int
3739 private val buffer: ByteArray
40+ private val bufferFloat: FloatArray
41+ private val bufferFloatConvert: ByteBuffer
3842 private var streamJob: Job ? = null
3943
4044 init {
@@ -79,6 +83,8 @@ class MicAudioManager(
7983 }
8084
8185 buffer = ByteArray (bufferSize)
86+ bufferFloat = FloatArray (bufferSize / 4 ) // float is 4 bytes
87+ bufferFloatConvert = ByteBuffer .allocate(bufferSize).order(ByteOrder .nativeOrder())
8288 }
8389
8490 // audio stream publisher
@@ -90,17 +96,37 @@ class MicAudioManager(
9096 delay(RECORD_DELAY_MS )
9197 continue
9298 }
93- val bytesRead = recorder.read(buffer, 0 , buffer.size)
9499
95- if (bytesRead <= 0 ) {
100+ val readCount: Int // number of samples read (for float) or number of bytes read (for int)
101+ val packetBuffer: ByteArray
102+
103+ if (audioFormat == AudioFormat .ENCODING_PCM_FLOAT ) {
104+ readCount =
105+ recorder.read(bufferFloat, 0 , bufferFloat.size, AudioRecord .READ_BLOCKING )
106+
107+ if (readCount > 0 ) {
108+ bufferFloatConvert.clear()
109+ bufferFloatConvert.asFloatBuffer().put(bufferFloat, 0 , readCount)
110+ packetBuffer = bufferFloatConvert.array()
111+ } else {
112+ packetBuffer = ByteArray (0 )
113+ }
114+ } else {
115+ readCount = recorder.read(buffer, 0 , buffer.size)
116+
117+ if (readCount > 0 ) {
118+ packetBuffer = ByteArray (readCount)
119+ buffer.copyInto(packetBuffer, 0 , 0 , readCount)
120+ } else {
121+ packetBuffer = ByteArray (0 )
122+ }
123+ }
124+
125+ if (readCount <= 0 ) {
96126 delay(RECORD_DELAY_MS )
97127 continue
98128 }
99129
100- // Log.d(TAG, "audioStream: $bytesRead bytes read")
101-
102- val packetBuffer = ByteArray (bytesRead)
103- buffer.copyInto(packetBuffer, 0 , 0 , bytesRead)
104130 send(
105131 AudioPacket (
106132 buffer = packetBuffer,
0 commit comments