在PortAudio中向Racket FFI注册回调会导致segfault

在PortAudio中向Racket FFI注册回调会导致segfault,racket,ffi,portaudio,Racket,Ffi,Portaudio,我正在尝试为PortAudio编写一个Racket接口。每个音频流具有用于回放的相关回调函数;外国金融机构的文件说我应该能够顺利通过诈骗程序。但是,注册回调的函数似乎会导致分段错误,我认为这是因为我做错了什么。从库标题: //portaudio.h // ... typedef int-PaStreamCallback( 常量无效*输入,无效*输出, 无符号长帧数, const Pastream CallbackTimeInfo*timeInfo, PaStreamCallbackFlags状态

我正在尝试为PortAudio编写一个Racket接口。每个音频流具有用于回放的相关回调函数;外国金融机构的文件说我应该能够顺利通过诈骗程序。但是,注册回调的函数似乎会导致分段错误,我认为这是因为我做错了什么。从库标题:

//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
    ,而不仅仅是
    流回调
有什么建议吗?

我是约翰·克莱门茨——如果您对我的portaudio球拍界面有任何问题,请告诉我!您可以使用安装

raco pkg安装portaudio


。。。假设您使用的是racket 6或更高版本。

我看不到任何明显的变化。也许@john clements有个主意?也许你可以在这里找到解决办法。谢谢--我可能会使用这个预先制作的解决方案。由于GC的延迟问题,作者似乎选择了不在Racket中编写回调。似乎工作得很好。:)虽然我仍然想知道我自己的实现出了什么问题。。。