如何解决将C回调API转换为流
我可以通过异步C api访问Pulseaudio。
pub fn get_sink_info_by_index<F>(
&self,index: u32,callback: F
) -> Operation<dyn FnMut(ListResult<&SinkInfo>)> where
F: FnMut(ListResult<&SinkInfo>) + 'static,
我已经实现了一个辅助函数(可以很好地编译),该函数生成一个回调以传递给C函数和输出流。
pub fn callbackStream<T:Sized + Clone>() -> (Box<dyn FnMut(ListResult<&'static T>)>,Box<dyn Stream<Item=T>>) {
let (sender,recv) = channel(1024); // TODO channel size?
let cb = {|c: ListResult<&'static T>| match c {
Item(it) => match sender.try_send(it.clone()) {
Ok(_) => (),Err(err) => () // TODO
},End => (),Error => () // TODO
}};
(Box::new(cb),Box::new(recv))
}
但是,当尝试使用它时,我却无法使用:
fn stream_sink_info_by_index(
&self,index: u32
) -> Box<dyn Stream<Item=SinkInfo>> {
let (callback,stream): (Box<dyn FnMut(ListResult<&SinkInfo>) + 'static>,Box<dyn Stream<Item=SinkInfo>>) = callbackStream();
self.get_sink_info_by_index(index,callback);
stream
}
给我
error[E0308]: mismatched types
--> src/futuristicPulse.rs:31:117
|
31 | let (callback,Box<dyn Stream<Item=SinkInfo>>) = callbackStream();
| --------------------------------------------------------------------------------- ^^^^^^^^^^^^^^^^ expected concrete lifetime,found bound lifetime parameter
| |
| expected due to this
|
= note: expected tuple `(std::boxed::Box<(dyn for<'r,'s> std::ops::FnMut(pulse::callbacks::ListResult<&'r pulse::context::introspect::SinkInfo<'s>>) + 'static)>,std::boxed::Box<dyn futures_core::stream::Stream<Item = pulse::context::introspect::SinkInfo<'_>>>)`
found tuple `(std::boxed::Box<(dyn std::ops::FnMut(pulse::callbacks::ListResult<&'static _>) + 'static)>,std::boxed::Box<(dyn futures_core::stream::Stream<Item = _> + 'static)>)`
error: aborting due to previous error; 10 warnings emitted
如果我将(callback,stream)
上的类型批注调整为类型检查器找到的内容,我会将错误转发给对get_sink_info_by_index
的调用:
error[E0271]: type mismatch resolving `for<'r,'s> <std::boxed::Box<dyn std::ops::FnMut(pulse::callbacks::ListResult<&'static pulse::context::introspect::SinkInfo<'_>>)> as std::ops::FnOnce<(pulse::callbacks::ListResult<&'r pulse::context::introspect::SinkInfo<'s>>,)>>::Output == ()`
--> src/futuristicPulse.rs:32:14
|
32 | self.get_sink_info_by_index(index,callback);
| ^^^^^^^^^^^^^^^^^^^^^^ expected bound lifetime parameter,found concrete lifetime
error: aborting due to previous error; 10 warnings emitted
解决方法
非常粗略的答案-问题确实出在it.clone()
上。它没有正确转移所有权,因为它是SinkInfo<'r>
而不是SinkInfo
。我写了SinkInfo<'r> -> SinkInfo<'static>
,现在一切正常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。