Skip to content

Commit ffc4ce6

Browse files
committed
ref: event handling
1 parent 76402a3 commit ffc4ce6

File tree

1 file changed

+30
-25
lines changed

1 file changed

+30
-25
lines changed

pulsebeam-cli/src/main.rs

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,56 @@
11
use pulsebeam_agent::{
22
MediaFrame, MediaKind, MediaTime, TransceiverDirection,
3-
actor::{AgentBuilder, AgentEvent},
3+
actor::{AgentBuilder, AgentEvent, TrackReceiver, TrackSender},
44
media::H264Looper,
55
signaling::HttpSignalingClient,
66
};
77
use std::time::Duration;
88
use tokio::time::Instant;
99

10+
const RAW_H264: &[u8] = include_bytes!("video.h264");
11+
1012
#[tokio::main]
1113
async fn main() {
1214
tracing_subscriber::fmt::init();
1315

14-
let raw_bytes = include_bytes!("video.h264");
15-
tracing::info!("joining");
1616
let signaling = HttpSignalingClient::default();
1717
let mut agent = AgentBuilder::new(signaling)
1818
.with_track(MediaKind::Video, TransceiverDirection::SendOnly, None)
1919
.join("demo")
2020
.await
2121
.unwrap();
22-
tracing::info!("joined");
2322

2423
while let Some(ev) = agent.next_event().await {
2524
tracing::info!("received event: {:?}", ev);
2625
match ev {
27-
AgentEvent::SenderAdded(sender) => {
28-
tokio::spawn(async move {
29-
let mut looper = H264Looper::new(raw_bytes);
30-
let mut interval =
31-
tokio::time::interval(Duration::from_nanos(1_000_000_000 / 30));
32-
let start = Instant::now();
33-
loop {
34-
let now = interval.tick().await;
35-
let elapsed = now - start;
36-
37-
// Calculate TS based on actual elapsed time to prevent drift
38-
let ts = (elapsed.as_secs_f64() * 90000.0) as u64;
39-
40-
let frame = MediaFrame {
41-
ts: MediaTime::from_90khz(ts),
42-
data: looper.next().unwrap(),
43-
};
44-
sender.try_send(frame);
45-
}
46-
});
47-
}
26+
AgentEvent::SenderAdded(sender) => handle_sender(sender),
27+
AgentEvent::ReceiverAdded(receiver) => handle_receiver(receiver),
4828
_ => {}
4929
}
5030
}
5131
}
32+
33+
fn handle_sender(sender: TrackSender) {
34+
tokio::spawn(async move {
35+
let mut looper = H264Looper::new(RAW_H264);
36+
let mut interval = tokio::time::interval(Duration::from_nanos(1_000_000_000 / 30));
37+
let start = Instant::now();
38+
loop {
39+
let now = interval.tick().await;
40+
let elapsed = now - start;
41+
42+
// Calculate TS based on actual elapsed time to prevent drift
43+
let ts = (elapsed.as_secs_f64() * 90000.0) as u64;
44+
45+
let frame = MediaFrame {
46+
ts: MediaTime::from_90khz(ts),
47+
data: looper.next().unwrap(),
48+
};
49+
sender.try_send(frame);
50+
}
51+
});
52+
}
53+
54+
fn handle_receiver(_receiver: TrackReceiver) {
55+
// TODO:
56+
}

0 commit comments

Comments
 (0)