1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use teamtalk::Event;
fn main() -> teamtalk::Result<()> {
let client = teamtalk::Client::new()?;
loop {
if let Some((event, message)) = client.poll(100) {
match event {
Event::UserJoined => {
if let Some(user) = message.user() {
let _ = client.subscribe(
user.id,
teamtalk::types::Subscriptions::from_raw(
teamtalk::types::Subscriptions::VOICE,
),
);
let _ = client.enable_audio_block_event(
user.id,
teamtalk::types::Subscriptions::VOICE,
true,
);
}
}
Event::UserFirstVoiceStreamPacket => {
let stream_id = message.source();
let user_id = message.user().map(|u| u.id.0).unwrap_or_default();
println!("first voice stream packet: user_id={user_id}, stream_id={stream_id}");
}
Event::AudioBlock => {
if let Some(user) = message.user() {
let user_id = user.id;
if let Some(ptr) = client.acquire_user_audio_block(
teamtalk::types::Subscriptions::VOICE,
user_id,
) {
let block = unsafe { &*ptr };
let sample_index = block.uSampleIndex;
let samples = block.nSamples;
let channels = block.nChannels;
println!(
"audio block: user_id={}, sample_index={sample_index}, samples={samples}, channels={channels}",
user_id.0
);
unsafe {
let _ = client.release_user_audio_block(ptr);
}
}
}
}
Event::ConnectionLost | Event::ConnectFailed => break,
_ => {}
}
}
}
Ok(())
}