76 lines
1.9 KiB
Rust
76 lines
1.9 KiB
Rust
use std::ptr;
|
|
|
|
use hbb_common::libc::c_void;
|
|
|
|
use super::ffi::*;
|
|
|
|
//TODO: Color space, YCbCr matrix.
|
|
pub struct Config {
|
|
/// Whether the cursor is visible.
|
|
pub cursor: bool,
|
|
/// Whether it should letterbox or stretch.
|
|
pub letterbox: bool,
|
|
/// Minimum seconds per frame.
|
|
pub throttle: f64,
|
|
/// How many frames are allocated.
|
|
/// 3 is the recommended value.
|
|
/// 8 is the maximum value.
|
|
pub queue_length: i8,
|
|
}
|
|
|
|
impl Config {
|
|
/// Don't forget to CFRelease this!
|
|
pub fn build(self) -> CFDictionaryRef {
|
|
unsafe {
|
|
let throttle = CFNumberCreate(
|
|
ptr::null_mut(),
|
|
CFNumberType::Float64,
|
|
&self.throttle as *const _ as *const c_void,
|
|
);
|
|
let queue_length = CFNumberCreate(
|
|
ptr::null_mut(),
|
|
CFNumberType::SInt8,
|
|
&self.queue_length as *const _ as *const c_void,
|
|
);
|
|
|
|
let keys: [CFStringRef; 4] = [
|
|
kCGDisplayStreamShowCursor,
|
|
kCGDisplayStreamPreserveAspectRatio,
|
|
kCGDisplayStreamMinimumFrameTime,
|
|
kCGDisplayStreamQueueDepth,
|
|
];
|
|
let values: [*mut c_void; 4] = [
|
|
cfbool(self.cursor),
|
|
cfbool(self.letterbox),
|
|
throttle,
|
|
queue_length,
|
|
];
|
|
|
|
let res = CFDictionaryCreate(
|
|
ptr::null_mut(),
|
|
keys.as_ptr(),
|
|
values.as_ptr(),
|
|
4,
|
|
&kCFTypeDictionaryKeyCallBacks,
|
|
&kCFTypeDictionaryValueCallBacks,
|
|
);
|
|
|
|
CFRelease(throttle);
|
|
CFRelease(queue_length);
|
|
|
|
res
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Default for Config {
|
|
fn default() -> Config {
|
|
Config {
|
|
cursor: false,
|
|
letterbox: true,
|
|
throttle: 0.0,
|
|
queue_length: 3,
|
|
}
|
|
}
|
|
}
|