Skip to content

Commit 4d14d4a

Browse files
committed
opti: don't send audio wave data when ui not visible
1 parent 47fe89d commit 4d14d4a

File tree

8 files changed

+113
-109
lines changed

8 files changed

+113
-109
lines changed

RustApp/src/audio/process.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ impl AudioStream {
1515
/// This function converts an audio stream from packet into producer
1616
/// apply any necessary conversions based on the audio format
1717
/// and returns mono channel f32 vector for audio wave display
18-
pub fn process_audio_packet(&mut self, packet: AudioPacketMessage) -> anyhow::Result<Vec<f32>> {
18+
pub fn process_audio_packet(
19+
&mut self,
20+
packet: AudioPacketMessage,
21+
) -> anyhow::Result<Option<Vec<f32>>> {
1922
match self.audio_params.target_format.audio_format {
2023
AudioFormat::I16 => self.process_audio_packet_internal::<i16>(packet),
2124
AudioFormat::I24 => self.process_audio_packet_internal::<f32>(packet),
@@ -32,7 +35,7 @@ impl AudioStream {
3235
fn process_audio_packet_internal<F>(
3336
&mut self,
3437
packet: AudioPacketMessage,
35-
) -> anyhow::Result<Vec<f32>>
38+
) -> anyhow::Result<Option<Vec<f32>>>
3639
where
3740
F: cpal::SizedSample + AudioBytes + std::fmt::Debug + 'static,
3841
{
@@ -130,18 +133,22 @@ impl AudioStream {
130133
}
131134
}
132135

133-
// prepare mono channel buffer to return
134-
let buffer_mono = if config.target_format.channel_count.to_number() == 1 {
135-
buffer[0].clone()
136-
} else {
137-
// if not mono, average the channels
138-
let mut mono_buffer: Vec<f32> = Vec::with_capacity(buffer[0].len());
139-
for i in 0..buffer[0].len() {
140-
let sample: f32 = buffer.iter().map(|ch| ch[i]).sum::<f32>()
141-
/ config.target_format.channel_count.to_number() as f32;
142-
mono_buffer.push(sample);
136+
let buffer_mono = if self.is_window_visible {
137+
// prepare mono channel buffer to return
138+
if config.target_format.channel_count.to_number() == 1 {
139+
Some(buffer[0].clone())
140+
} else {
141+
// if not mono, average the channels
142+
let mut mono_buffer: Vec<f32> = Vec::with_capacity(buffer[0].len());
143+
for i in 0..buffer[0].len() {
144+
let sample: f32 = buffer.iter().map(|ch| ch[i]).sum::<f32>()
145+
/ config.target_format.channel_count.to_number() as f32;
146+
mono_buffer.push(sample);
147+
}
148+
Some(mono_buffer)
143149
}
144-
mono_buffer
150+
} else {
151+
None
145152
};
146153

147154
Ok(buffer_mono)

RustApp/src/streamer/mod.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,28 @@ const MAX_PORT: u16 = 60000;
3636
pub struct AudioStream {
3737
pub buff: Producer<u8>,
3838
pub audio_params: AudioProcessParams,
39+
pub is_window_visible: bool,
3940
}
4041

4142
impl AudioStream {
42-
pub fn new(buff: Producer<u8>, audio_params: AudioProcessParams) -> Self {
43-
Self { buff, audio_params }
43+
pub fn new(
44+
buff: Producer<u8>,
45+
audio_params: AudioProcessParams,
46+
is_window_visible: bool,
47+
) -> Self {
48+
Self {
49+
buff,
50+
audio_params,
51+
is_window_visible,
52+
}
4453
}
4554
}
4655

4756
impl Debug for AudioStream {
4857
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4958
f.debug_struct("AudioStream")
5059
.field("audio_params", &self.audio_params)
60+
.field("is_window_visible", &self.is_window_visible)
5161
.finish()
5262
}
5363
}

RustApp/src/streamer/streamer_runner.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@ pub enum StreamerCommand {
3737
connect_options: ConnectOption,
3838
buff: Producer<u8>,
3939
audio_params: AudioProcessParams,
40+
is_window_visible: bool,
4041
},
4142
ReconfigureStream {
4243
buff: Producer<u8>,
4344
audio_params: AudioProcessParams,
45+
is_window_visible: bool,
4446
},
4547
Stop,
4648
}
@@ -52,17 +54,21 @@ impl Debug for StreamerCommand {
5254
connect_options,
5355
buff: _,
5456
audio_params,
57+
is_window_visible,
5558
} => f
5659
.debug_struct("Connect")
5760
.field("connect_options", connect_options)
5861
.field("audio_params", audio_params)
62+
.field("is_window_visible", is_window_visible)
5963
.finish(),
6064
Self::ReconfigureStream {
6165
buff: _,
6266
audio_params,
67+
is_window_visible,
6368
} => f
6469
.debug_struct("ReconfigureStream")
6570
.field("audio_params", audio_params)
71+
.field("is_window_visible", is_window_visible)
6672
.finish(),
6773
Self::Stop => write!(f, "Stop"),
6874
}
@@ -130,8 +136,10 @@ pub fn sub() -> impl Stream<Item = StreamerMsg> {
130136
connect_options,
131137
buff,
132138
audio_params,
139+
is_window_visible,
133140
} => {
134-
let stream_config = AudioStream::new(buff, audio_params);
141+
let stream_config =
142+
AudioStream::new(buff, audio_params, is_window_visible);
135143
let new_streamer: Result<Streamer, ConnectError> =
136144
match connect_options {
137145
ConnectOption::Tcp { ip } => {
@@ -169,8 +177,13 @@ pub fn sub() -> impl Stream<Item = StreamerMsg> {
169177
}
170178
}
171179
}
172-
StreamerCommand::ReconfigureStream { buff, audio_params } => {
173-
let stream_config = AudioStream::new(buff, audio_params);
180+
StreamerCommand::ReconfigureStream {
181+
buff,
182+
audio_params,
183+
is_window_visible,
184+
} => {
185+
let stream_config =
186+
AudioStream::new(buff, audio_params, is_window_visible);
174187

175188
streamer.reconfigure_stream(stream_config);
176189
}

RustApp/src/streamer/tcp_streamer.rs

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -112,34 +112,26 @@ impl StreamerTrait for TcpStreamer {
112112
disconnect_loop_detecter: _,
113113
} => {
114114
match framed.next().await {
115-
Some(Ok(frame)) => {
116-
let mut res = None;
117-
118-
match AudioPacketMessage::decode(frame) {
119-
Ok(packet) => {
120-
let buffer_size = packet.buffer.len();
121-
let sample_rate = packet.sample_rate;
122-
123-
if let Ok(buffer) = self.stream_config.process_audio_packet(packet)
124-
{
125-
// compute the audio wave from the buffer
126-
res = Some(StreamerMsg::UpdateAudioWave {
115+
Some(Ok(frame)) => match AudioPacketMessage::decode(frame) {
116+
Ok(packet) => {
117+
let buffer_size = packet.buffer.len();
118+
let sample_rate = packet.sample_rate;
119+
120+
match self.stream_config.process_audio_packet(packet) {
121+
Ok(Some(buffer)) => {
122+
debug!("received {} bytes", buffer_size);
123+
Ok(Some(StreamerMsg::UpdateAudioWave {
127124
data: AudioPacketMessage::to_wave_data(
128125
&buffer,
129126
sample_rate,
130127
),
131-
});
132-
133-
debug!("received {} bytes", buffer_size);
134-
};
135-
}
136-
Err(e) => {
137-
return Err(ConnectError::WriteError(WriteError::Deserializer(e)));
128+
}))
129+
}
130+
_ => Ok(None),
138131
}
139132
}
140-
141-
Ok(res)
142-
}
133+
Err(e) => Err(ConnectError::WriteError(WriteError::Deserializer(e))),
134+
},
143135

144136
Some(Err(e)) => {
145137
match e.kind() {

RustApp/src/streamer/udp_streamer.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ impl StreamerTrait for UdpStreamer {
7272
async fn next(&mut self) -> Result<Option<StreamerMsg>, ConnectError> {
7373
match self.framed.next().await {
7474
Some(Ok((frame, addr))) => {
75-
let mut res = None;
76-
7775
match AudioPacketMessageOrdered::decode(frame) {
7876
Ok(packet) => {
7977
if packet.sequence_number < self.tracked_sequence {
@@ -89,21 +87,18 @@ impl StreamerTrait for UdpStreamer {
8987
let buffer_size = packet.buffer.len();
9088
let sample_rate = packet.sample_rate;
9189

92-
if let Ok(buffer) = self.stream_config.process_audio_packet(packet) {
93-
// compute the audio wave from the buffer
94-
res = Some(StreamerMsg::UpdateAudioWave {
95-
data: AudioPacketMessage::to_wave_data(&buffer, sample_rate),
96-
});
97-
98-
debug!("From {:?}, received {} bytes", addr, buffer_size);
90+
match self.stream_config.process_audio_packet(packet) {
91+
Ok(Some(buffer)) => {
92+
debug!("From {:?}, received {} bytes", addr, buffer_size);
93+
Ok(Some(StreamerMsg::UpdateAudioWave {
94+
data: AudioPacketMessage::to_wave_data(&buffer, sample_rate),
95+
}))
96+
}
97+
_ => Ok(None),
9998
}
10099
}
101-
Err(e) => {
102-
return Err(ConnectError::WriteError(WriteError::Deserializer(e)));
103-
}
100+
Err(e) => Err(ConnectError::WriteError(WriteError::Deserializer(e))),
104101
}
105-
106-
Ok(res)
107102
}
108103

109104
Some(Err(e)) => {

RustApp/src/streamer/usb_streamer.rs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -195,27 +195,23 @@ impl StreamerTrait for UsbStreamer {
195195
Some(Ok(frame)) => {
196196
self.state = UsbStreamerState::Streaming;
197197

198-
let mut res = None;
199198
match AudioPacketMessage::decode(frame) {
200199
Ok(packet) => {
201200
let buffer_size = packet.buffer.len();
202201
let sample_rate = packet.sample_rate;
203202

204-
if let Ok(buffer) = self.stream_config.process_audio_packet(packet) {
205-
// compute the audio wave from the buffer
206-
res = Some(StreamerMsg::UpdateAudioWave {
207-
data: AudioPacketMessage::to_wave_data(&buffer, sample_rate),
208-
});
209-
210-
debug!("received {} bytes", buffer_size);
203+
match self.stream_config.process_audio_packet(packet) {
204+
Ok(Some(buffer)) => {
205+
debug!("received {} bytes", buffer_size);
206+
Ok(Some(StreamerMsg::UpdateAudioWave {
207+
data: AudioPacketMessage::to_wave_data(&buffer, sample_rate),
208+
}))
209+
}
210+
_ => Ok(None),
211211
}
212212
}
213-
Err(e) => {
214-
return Err(ConnectError::WriteError(WriteError::Deserializer(e)));
215-
}
213+
Err(e) => Err(ConnectError::WriteError(WriteError::Deserializer(e))),
216214
}
217-
218-
Ok(res)
219215
}
220216
Some(Err(e)) => {
221217
panic!("{}", e);

0 commit comments

Comments
 (0)