2012-04-15 5 views
0

これは、ライブラリSecret Rabbit Code (aka libsamplerate)の.NETラッパーですが、CallbackReadsrc_callback_read呼び出すとき:AccessViolationExceptionを - 保護されたメモリを読み書きしようとしました。 CヘッダからC#のCコールバックの使い方

/* Opaque data type SRC_STATE. */ 
typedef struct SRC_STATE_tag SRC_STATE ; 

typedef long (*src_callback_t) (void *cb_data, float **data) ; 

SRC_STATE* src_callback_new (src_callback_t func, int converter_type, int channels,     int *error, void* cb_data) ; 

long src_callback_read (SRC_STATE *state, double src_ratio, long frames, float * 

私は、次のように作成しました:

C Cライブラリを呼び出す++/CLIクラスライブラリ:

public delegate long SRCCallback (void *cb_data, float **data) ; 

static IntPtr CallbackNew (SRCCallback ^func, RabbitConverter converter_type, int channels, int *error, void* cb_data) 
     { 
      src_callback_t* cb = (src_callback_t*) &func; 
      SRC_STATE* state = src_callback_new (*cb, (int) converter_type, channels, error, cb_data); 
      IntPtr ptr = IntPtr (state); 
      return ptr; 
     } 

static long CallbackRead (IntPtr src_state, double src_ratio, long frames , float * data) 
     { 
      void* toPointer = src_state.ToPointer(); 
      SRC_STATE* state = (SRC_STATE*) toPointer; 
      long l = src_callback_read (state, src_ratio, frames, data); 
      return l; 
     } 
Cを使用しています

C#アプリケーション++/CLIライブラリ:

private static readonly unsafe SRCCallback _callback = target; 

private static unsafe void Callback() 
{ 
    var input = GetSine(1000.0d, 44100, 1); 
    fixed (float* f = input) 
    { 
     RabbitError error = RabbitError.SRC_ERR_NO_ERROR; 
     var @void = Rabbit.CallbackNew(_callback, RabbitConverter.SRC_SINC_BEST_QUALITY, 1, (int*) (&error), 
             (void*) IntPtr.Zero); 
     var callbackRead = Rabbit.CallbackRead(@void , 1d, input.Length/2, f); 
     if (callbackRead != input.Length) 
     { 
      // throw new InvalidOperationException(); 
     } 
    } 
} 

private static unsafe int target(void* cb_data, float** data) 
{ 
    return 9; 
} 
+0

これは可能です。http://stackoverflow.com/questions/1241080/problem-with-c-callback-function-in-c-sharp-how-to-pass-value-to-a-pointer ? –

+0

"この場合、入力と出力のサンプルレートの比が非合理的な数値になる可能性があることを意味します" ...このサウンドを10000 \ pi Hzにリサンプリングしてください。実際、有理数が何であるかを明確に知らない人には、信号再構成を信頼することが重要です。 –

+0

昇進システム:私はrefを使用しようとしましたが、それはしませんでした。 – Aybe

答えて

0

私は、次を使用して、それを修正した:

要するに
[System::Runtime::InteropServices::UnmanagedFunctionPointerAttribute (CallingConvention::Cdecl)] 
public delegate long SRCCallback (void *cb_data, float **data) ; 

static IntPtr CallbackNew (SRCCallback^% func, RabbitConverter converter_type, int channels, int *error, void* cb_data) { ... } 

:今ではC呼び出し規約およびC#REFキーワードを使用しています。

関連する問題