C# 如何在C中使用PaStreamCallbackDelegate#

C# 如何在C中使用PaStreamCallbackDelegate#,c#,callback,delegates,stream,portaudio,C#,Callback,Delegates,Stream,Portaudio,我需要使用PaStreamCallbackDelegate将回调函数传递给Pa_OpenDefaultStream,以便启动流。 我和你一样在网上看了看,但也按照描述做了,它给了我这个错误: 与委托PortAudio.PaStreamCallbackDelegate对应的StreamCallback没有重载 我不知道如何解决它。我对C#语言知之甚少,现在才开始使用库PortAudio 我在这里发布我的代码: unsafe public PortAudio.PaStreamCallbackResu

我需要使用PaStreamCallbackDelegate将回调函数传递给Pa_OpenDefaultStream,以便启动流。 我和你一样在网上看了看,但也按照描述做了,它给了我这个错误:

与委托PortAudio.PaStreamCallbackDelegate对应的StreamCallback没有重载

我不知道如何解决它。我对C#语言知之甚少,现在才开始使用库PortAudio

我在这里发布我的代码:

unsafe public PortAudio.PaStreamCallbackResult StreamCallback(
        IntPtr* input,
        IntPtr* output,
        uint frameCount,
        ref PortAudio.PaStreamCallbackTimeInfo timeInfo,
        PortAudio.PaStreamCallbackFlags statusFlags,
        IntPtr* userData) 
    {
        //Aggiungi roba
        int i;

        for (i = 0; i < frameCount; i++)
        {
             output++;           //LEFT
             output = input++;

             output++;           //RIGHT
             output = input++;
        }
        return PortAudio.PaStreamCallbackResult.paContinue;
    }

    unsafe private void btnStream_Click(object sender, EventArgs e)
    {
        //Dichiarazioni
        IntPtr* input;
        IntPtr* output;
        uint frameCount;
        PortAudio.PaStreamCallbackTimeInfo timeInfo;
        PortAudio.PaStreamCallbackFlags statusFlags;
        IntPtr* userData;

        IntPtr stream;

        PortAudio.PaError err = PortAudio.Pa_Initialize();
        if (err != PortAudio.PaError.paNoError)
            PortAudio.Pa_Terminate();

        err = PortAudio.Pa_OpenDefaultStream(out stream, 
                                                      1,
                                                      1,
               (uint)PortAudio.PaSampleFormat.paFloat32,
                                                  44100,
                 PortAudio.paFramesPerBufferUnspecified,
 new PortAudio.PaStreamCallbackDelegate(StreamCallback),  //In this row it gives me the error
                                          (IntPtr)null);
不安全的公共PortAudio.PaStreamCallbackResult StreamCallback(
IntPtr*输入,
IntPtr*输出,
uint帧计数,
参考PortAudio.PaStreamCallbackTimeInfo时间信息,
PortAudio.PaStreamCallbackFlags状态标志,
IntPtr*用户数据)
{
//阿吉隆吉罗巴酒店
int i;
对于(i=0;i

如果有人知道如何帮助我,我将非常感激,谢谢。

您的输入、输出和用户数据参数应为
IntPtr
类型,而不是
IntPtr*

此外,我认为您并不是真的在回调方法中创建副本。我真的认为您应该使用其中一些方法。我从未在.Net中使用过不安全类型,但看看a,我相信您的算法将类似于:

unsafe public PortAudio.PaStreamCallbackResult StreamCallback(
        IntPtr input,  IntPtr output,  uint frameCount,
        ref PortAudio.PaStreamCallbackTimeInfo timeInfo,
        PortAudio.PaStreamCallbackFlags statusFlags,
        IntPtr userData) 
{
    byte *src = (byte *)input.ToPointer();
    byte *dst = (byte *)output.ToPointer();
    for (int i = 0; i < frameCount; i++)
    {
         *dst++ = *src++;//in c this could be written dst[i] = src[i] maybe you can try that.
    }
    return PortAudio.PaStreamCallbackResult.paContinue;
}

也许这会有帮助:。谢谢你的回复!我遵循了你的建议。我遵循了你链接我的帖子,但它仍然在同一行代码中给出了完全相同的错误。可能是我的某些设置错误?可能是我没有在程序中设置的愚蠢的东西(使用Visual Studio 2010).我不知道该怎么想了..我真的不能做更多的事情了,因为我对portaudio库一无所知…尽管它提醒我你的StreamCallback与委托定义不匹配。你的输入、输出和用户数据参数应该是
IntPtr
类型,而不是
IntPtr*
。Thank告诉你错误是什么!我需要那种格式的指针,否则增加就不允许我这样做,但我成功地在函数中进行了转换,没有问题。我会回答的。你还应该提到,他需要将委托对象存储在类的字段或静态变量中,以便不要被垃圾收集。@Hans Passant我想你说的是err变量(因为它是唯一使用委托的变量)。我假设err将被使用和丢弃,因为我不知道Op打算用它做什么。不,我说的是Pa_OpenDefaultStream()调用。他用new创建委托对象,调用后没有对它的引用,因此它将被垃圾收集。当本机代码进行回调时,这是一个硬崩溃。我不得不多次思考你说的话,我得出结论你是对的(怀疑你可能是犯罪吗?).但我习惯于直接使用托管回调的场景。
unsafe private void btnStream_Click(object sender, EventArgs e)
{
    //Dichiarazioni
    IntPtr* input;
    IntPtr* output;
    uint frameCount;
    PortAudio.PaStreamCallbackTimeInfo timeInfo;
    PortAudio.PaStreamCallbackFlags statusFlags;
    IntPtr* userData;

    IntPtr stream;

    PortAudio.PaError err = PortAudio.Pa_Initialize();
    var callback = new PortAudio.PaStreamCallbackDelegate(StreamCallback);
    if (err != PortAudio.PaError.paNoError)
        PortAudio.Pa_Terminate();

    err = PortAudio.Pa_OpenDefaultStream(out stream,  1, 1,
           (uint)PortAudio.PaSampleFormat.paFloat32,
                                              44100,
             PortAudio.paFramesPerBufferUnspecified,
                          callback,
                                      (IntPtr)null);