Skip to content

Commit 1c2dce6

Browse files
author
LChen
committed
添加截屏失败处理
1 parent d780480 commit 1c2dce6

File tree

1 file changed

+53
-26
lines changed

1 file changed

+53
-26
lines changed

dsserver/src/screen.rs

Lines changed: 53 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub struct Cap {
1010
w: usize,
1111
h: usize,
1212
org_len: usize,
13-
capturer: Capturer,
13+
capturer: Option<Capturer>,
1414
sleep: Duration,
1515
}
1616
impl Cap {
@@ -22,42 +22,69 @@ impl Cap {
2222
w,
2323
h,
2424
org_len: w * h * 4,
25-
capturer,
25+
capturer: Some(capturer),
2626
sleep: Duration::new(1, 0) / 60,
2727
}
2828
}
29+
fn reload(&mut self) {
30+
println!("Reload capturer");
31+
drop(self.capturer.take());
32+
let display = match Display::primary() {
33+
Ok(display) => display,
34+
Err(e) => {
35+
println!("{}", e);
36+
return;
37+
}
38+
};
39+
40+
let capturer = match Capturer::new(display) {
41+
Ok(capturer) => capturer,
42+
Err(_) => return,
43+
};
44+
self.capturer = Some(capturer);
45+
}
2946
pub fn wh(&self) -> (usize, usize) {
3047
return (self.w, self.h);
3148
}
3249
pub fn cap(&mut self, cap_buf: &mut [u8]) {
3350
loop {
34-
// Wait until there's a frame.
35-
let cp = &self.capturer.frame();
36-
let buffer = match cp {
37-
Ok(buffer) => buffer,
38-
Err(error) => {
39-
std::thread::sleep(self.sleep);
40-
if error.kind() == WouldBlock {
41-
// Keep spinning.
42-
continue;
43-
} else {
44-
println!("cap error: {}", error);
45-
continue;
51+
match &mut self.capturer {
52+
Some(capturer) => {
53+
// Wait until there's a frame.
54+
let cp = capturer.frame();
55+
let buffer = match cp {
56+
Ok(buffer) => buffer,
57+
Err(error) => {
58+
std::thread::sleep(self.sleep);
59+
if error.kind() == WouldBlock {
60+
// Keep spinning.
61+
continue;
62+
} else {
63+
std::thread::sleep(std::time::Duration::from_millis(200));
64+
self.reload();
65+
continue;
66+
}
67+
}
68+
};
69+
70+
// 转换成rgb图像数组
71+
let mut k = 0;
72+
let mut n = 0;
73+
while n < self.org_len {
74+
cap_buf[k] = buffer[n + 2] & dscom::BIT_SAVE;
75+
cap_buf[k + 1] = buffer[n + 1] & dscom::BIT_SAVE;
76+
cap_buf[k + 2] = buffer[n] & dscom::BIT_SAVE;
77+
k += 3;
78+
n += 4;
4679
}
80+
break;
81+
}
82+
None => {
83+
std::thread::sleep(std::time::Duration::from_millis(200));
84+
self.reload();
85+
continue;
4786
}
4887
};
49-
50-
// 转换成rgb图像数组
51-
let mut k = 0;
52-
let mut n = 0;
53-
while n < self.org_len {
54-
cap_buf[k] = buffer[n + 2] & dscom::BIT_SAVE;
55-
cap_buf[k + 1] = buffer[n + 1] & dscom::BIT_SAVE;
56-
cap_buf[k + 2] = buffer[n] & dscom::BIT_SAVE;
57-
k += 3;
58-
n += 4;
59-
}
60-
break;
6188
}
6289
}
6390
}

0 commit comments

Comments
 (0)