Skip to content

Commit eb5cff6

Browse files
authored
Merge pull request #109 from teamclouday/android-f32
Enable android f32 audio recording
2 parents f9863a0 + 987af2b commit eb5cff6

5 files changed

Lines changed: 44 additions & 11 deletions

File tree

Android/app/src/main/java/io/github/teamclouday/AndroidMic/domain/audio/MicAudioManager.kt

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import kotlinx.coroutines.delay
1616
import kotlinx.coroutines.flow.Flow
1717
import kotlinx.coroutines.flow.channelFlow
1818
import kotlinx.coroutines.launch
19+
import java.nio.ByteBuffer
20+
import java.nio.ByteOrder
1921

2022
// manage microphone recording
2123
class 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,

RustApp/src/streamer/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,9 @@ impl StreamerTrait for DummyStreamer {
156156
}
157157

158158
impl AudioPacketMessage {
159-
fn to_wave_data(buffer: &[f32]) -> Vec<(f32, f32)> {
160-
let window_size = 50;
159+
fn to_wave_data(buffer: &[f32], sample_rate: u32) -> Vec<(f32, f32)> {
160+
const DEFAULT_WINDOW_DURATION_MS: f32 = 10.0; // 10ms window
161+
let window_size = ((sample_rate as f32 * DEFAULT_WINDOW_DURATION_MS) / 1000.0) as usize;
161162

162163
buffer
163164
.chunks_exact(window_size)

RustApp/src/streamer/tcp_streamer.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,16 @@ impl StreamerTrait for TcpStreamer {
113113
match AudioPacketMessage::decode(frame) {
114114
Ok(packet) => {
115115
let buffer_size = packet.buffer.len();
116+
let sample_rate = packet.sample_rate;
116117

117118
if let Ok(buffer) = self.stream_config.process_audio_packet(packet)
118119
{
119120
// compute the audio wave from the buffer
120121
res = Some(StreamerMsg::UpdateAudioWave {
121-
data: AudioPacketMessage::to_wave_data(&buffer),
122+
data: AudioPacketMessage::to_wave_data(
123+
&buffer,
124+
sample_rate,
125+
),
122126
});
123127

124128
debug!("received {} bytes", buffer_size);

RustApp/src/streamer/udp_streamer.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,12 @@ impl StreamerTrait for UdpStreamer {
8383

8484
let packet = packet.audio_packet.unwrap();
8585
let buffer_size = packet.buffer.len();
86+
let sample_rate = packet.sample_rate;
8687

8788
if let Ok(buffer) = self.stream_config.process_audio_packet(packet) {
8889
// compute the audio wave from the buffer
8990
res = Some(StreamerMsg::UpdateAudioWave {
90-
data: AudioPacketMessage::to_wave_data(&buffer),
91+
data: AudioPacketMessage::to_wave_data(&buffer, sample_rate),
9192
});
9293

9394
debug!("From {:?}, received {} bytes", addr, buffer_size);

RustApp/src/streamer/usb_streamer.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,11 +198,12 @@ impl StreamerTrait for UsbStreamer {
198198
match AudioPacketMessage::decode(frame) {
199199
Ok(packet) => {
200200
let buffer_size = packet.buffer.len();
201+
let sample_rate = packet.sample_rate;
201202

202203
if let Ok(buffer) = self.stream_config.process_audio_packet(packet) {
203204
// compute the audio wave from the buffer
204205
res = Some(StreamerMsg::UpdateAudioWave {
205-
data: AudioPacketMessage::to_wave_data(&buffer),
206+
data: AudioPacketMessage::to_wave_data(&buffer, sample_rate),
206207
});
207208

208209
debug!("received {} bytes", buffer_size);

0 commit comments

Comments
 (0)