[Speex-dev] using speex in C#
SAITAMA Taro
game72 at gmail.com
Thu Dec 28 00:09:08 PST 2006
Hi,
I have read the message below,
http://lists.xiph.org/pipermail/speex-dev/2006-October/004924.html
and try to use P/Invoke to use speex in C#.
This is a part of my code.
[StructLayout(LayoutKind.Sequential)]
public struct SpeexBits {
IntPtr chars; // "raw" data
int nbBits; // Total number of bits stored in the stream
int charPtr; // Position of the byte "cursor"
int bitPtr; // Position of the bit "cursor" within the current char
int owner; // Does the struct "own" the "raw" buffer (member "chars")
int overflow; // Set to one if we try to read past the valid data
int buf_size; // Allocated size for buffer
int reserved1; // Reserved for future use
IntPtr reserved2; // Reserved for future use
}
[DllImport("libspeex.dll")]
public static extern IntPtr speex_lib_get_mode(int mode); // Obtain one of the modes available
[DllImport("libspeex.dll")]
public static extern IntPtr speex_encoder_init(ref SpeexMode mode);
[DllImport("libspeex.dll")]
public static extern void speex_bits_init(ref SpeexBits bits);
[DllImport("libspeex.dll")]
public static extern int speex_encode_int(IntPtr state, Int16[] in_, ref SpeexBits bits);
SpeexBits bits = new SpeexBits();
SpeexMode mode = (SpeexMode)Marshal.PtrToStructure(Speex.speex_lib_get_mode(1), typeof(SpeexMode));
Speex.speex_bits_init(ref bits);
IntPtr enc_state = Speex.speex_encoder_init(ref mode);
Int16[] CaptureData = null;
(CaptureData receives data recorded from mic...)
CaptureData = (Int16[])dsCapBuffer.Read(NextCaptureOffset, typeof(Int16), LockFlag.None, LockSize);
Speex.speex_bits_reset(ref bits);
Speex.speex_encode_int(enc_state, CaptureData, ref bits); // at this point, System.AccessViolationException occurs
Whould anyone tell me what wrong about my code?
Please help me.
Regards
Kaihong
More information about the Speex-dev
mailing list