C#을

2014-01-24 4 views
1

에 PaStreamCallbackDelegate를 사용하는 방법 내가 스트림을 시작할 수 있도록 PaStreamCallbackDelegate를 사용하여 Pa_OpenDefaultStream에 콜백 함수를 전달해야합니다. 나는 인터넷에서보고 당신처럼, 또한 한 바와 같이,이 날이 오류를 제공하고 :C#을

내가 해결하는 방법을 모르는

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); 

, 감사 :

여기에 내 코드를 게시 할 수 있습니다.

+0

아마도 도움이 될 것입니다 : https://vstnet.codeplex.com/discussions/246206. –

+0

답장을 보내 주셔서 감사합니다! 귀하의 조언을 따랐습니다. 나는 당신이 나를 링크시킨 포스트를 따라 갔지만 같은 코드 라인에서 똑같은 에러를 계속 주었다. ** 설정이 잘못되었을 수 있습니다 ** ** ** 프로그램에서 설정하지 않은 무언가 어쩌면 (** Visual Studio 2010 ** 사용). 더 이상 무엇을 생각해야할지 모르겠다. – Shafa95

+1

portaudio 라이브러리에 대해 잘 모르기 때문에 나는 그 이상을 할 수 없다. StreamCallback이 위임자 정의. 입력, 출력 및 사용자 데이터 인수는'IntPtr * '대신'IntPtr' 유형이어야합니다. –

답변

1

귀하의 입력, 출력 및 유저 데이터 인수 유형 IntPtr 대신 IntPtr*

또한 난 당신이 정말 당신의 콜백 메서드에서 복사본을 만들고있다 것 같아요이어야한다. 정말로 IntPtr 메소드 중 일부를 사용해야한다고 생각합니다. 나는 닷넷에서 안전하지 않은 형식을 사용하지하지만 난 당신의 알고리즘이 뭔가를 할 것이라고 믿는 copy sample보고 결코 :

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; 
} 

편집 : 그것은 아무튼 그래서 한스 옆모습에 따르면 당신은 또한 필드에 대리자를 저장해야합니다 쓰레기 수거. 그러나 AFAIK 가비지 수집은 적어도 하나의 참조가있는 한 개체를 정리하지 않기 때문에 변수에 저장할 수 있습니다. 콜백이 정의 된 동일한 메소드에서 콜백이 발생하는 경우에만 적용되며, 그렇지 않으면 필드에 명시된대로 저장해야합니다.

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); 
+1

또한 그는 가비지 수집 될 수 없도록 클래스 필드 또는 정적 변수에 대리자 객체를 저장해야한다고 언급해야합니다. –

+0

@Hans Passant 나는 대리 변수를 사용하는 유일한 변수이기 때문에 실수 변수에 대해 이야기하고 있다고 생각합니다. 나는 오르간이 사용하기로 의도 한 단서가 없기 때문에 오용은 사용되고 폐기 될 것이라고 생각했습니다. –

+0

아니요, 저는 Pa_OpenDefaultStream() 호출에 대해 이야기하고 있습니다. 그는 delegate 객체를 * new *로 생성합니다. 호출 후에 참조가 없으므로 가비지 수집됩니다.네이티브 코드가 콜백을 할 때 하드 충돌이 발생합니다. –