在PortAudio中向Racket FFI注册回调会导致segfault
我正在尝试为PortAudio编写一个Racket接口。每个音频流具有用于回放的相关回调函数;外国金融机构的文件说我应该能够顺利通过诈骗程序。但是,注册回调的函数似乎会导致分段错误,我认为这是因为我做错了什么。从库标题:在PortAudio中向Racket FFI注册回调会导致segfault,racket,ffi,portaudio,Racket,Ffi,Portaudio,我正在尝试为PortAudio编写一个Racket接口。每个音频流具有用于回放的相关回调函数;外国金融机构的文件说我应该能够顺利通过诈骗程序。但是,注册回调的函数似乎会导致分段错误,我认为这是因为我做错了什么。从库标题: //portaudio.h // ... typedef int-PaStreamCallback( 常量无效*输入,无效*输出, 无符号长帧数, const Pastream CallbackTimeInfo*timeInfo, PaStreamCallbackFlags状态
//portaudio.h
// ...
typedef int-PaStreamCallback(
常量无效*输入,无效*输出,
无符号长帧数,
const Pastream CallbackTimeInfo*timeInfo,
PaStreamCallbackFlags状态标志,
void*用户数据);
// ...
PaError Pa_OpenDefaultStream(PaStream**stream,
int NuminputChannel,
int NumoutputChannel,
PaSampleFormat样本格式,
双采样器,
未签名的长帧缓冲,
PaStreamCallback*streamCallback,//\u PaStreamCallbackResult)
; ...
(定义portaudio Pa_OpenDefaultStream
(_fun(s:(_ptro_PaStream-pointer))
_int _int
_帕萨姆弗马特
_双重的
_乌龙
_PaStreamCallback;(r:_PaError)
->(开始(勾选r'Pa_OpenDefaultStream)s))
#:wrap(分配器Pa_CloseStream))
但下面给出了一个分段错误:
(需要“portaudio.rkt”)
; ...
(定义(流回调_1输出缓冲区帧计数_2 _3数据)
... )
; ...
(定义流(Pa_OpenDefaultStream 0(输出通道计数)
(格式符号->格式(示例格式))
(抽样率)
(每个缓冲区的帧数)
流回调
#f) )
结果是:
SIGSEGV MAPERR si_code 1 fault on addr (nil)
Aborted
我尝试过的事情(单独和组合):
- 在
的定义中将Pa\u OpenDefaultStream
更改为\u PaStreamCallback
\u指针
- 在同一定义中将
更改为\u PaStreamCallback
(\u ptr i\u PaStreamCallback)
- 将
传递到(函数ptr stream callback\u PaStreamCallback)
,而不仅仅是Pa\u OpenDefaultStream
流回调
raco pkg安装portaudio
。。。假设您使用的是racket 6或更高版本。我看不到任何明显的变化。也许@john clements有个主意?也许你可以在这里找到解决办法。谢谢--我可能会使用这个预先制作的解决方案。由于GC的延迟问题,作者似乎选择了不在Racket中编写回调。似乎工作得很好。:)虽然我仍然想知道我自己的实现出了什么问题。。。