struct SndHandler {
inner: Arc<Mutex<Inner>>,
task: Option<tokio::task::JoinHandle<()>>,
}
impl RdpsndServerHandler for SndHandler {
fn get_formats(&self) -> &[AudioFormat] {
&[
AudioFormat {
format: WaveFormat::OPUS,
n_channels: 2,
n_samples_per_sec: 48000,
n_avg_bytes_per_sec: 192000,
n_block_align: 4,
bits_per_sample: 16,
data: None,
},
AudioFormat {
format: WaveFormat::PCM,
n_channels: 2,
n_samples_per_sec: 44100,
n_avg_bytes_per_sec: 176400,
n_block_align: 4,
bits_per_sample: 16,
data: None,
},
]
}
fn start(&mut self, client_format: &ClientAudioFormatPdu) -> Option<u16> {
let Some(nfmt) = self.choose_format(&client_format.formats) else {
return Some(0);
};
let fmt = client_format.formats[usize::from(nfmt)].clone();
let mut opus_enc = /* create OPUS encoder if needed */;
let inner = Arc::clone(&self.inner);
self.task = Some(tokio::spawn(async move {
let mut interval = time::interval(Duration::from_millis(20));
let mut ts = 0;
let mut phase = 0.0f32;
loop {
interval.tick().await;
// Generate 440 Hz sine wave
let wave = generate_sine_wave(
fmt.n_samples_per_sec,
440.0,
20,
&mut phase
);
// Encode with OPUS if configured
let data = if let Some(ref mut enc) = opus_enc {
enc.encode_vec(&wave, wave.len()).unwrap()
} else {
wave.into_iter()
.flat_map(|v| v.to_le_bytes())
.collect()
};
// Send to client
let inner = inner.lock().unwrap();
if let Some(sender) = inner.ev_sender.as_ref() {
let _ = sender.send(ServerEvent::Rdpsnd(
RdpsndServerMessage::Wave(data, ts)
));
}
ts = ts.wrapping_add(100);
}
}));
Some(nfmt)
}
fn stop(&mut self) {
if let Some(task) = self.task.take() {
task.abort();
}
}
}