我真的需要你的帮助将这个c#代码移植到Delphi one:
public unsafe byte[] Encode(byte[] inputPcmSamples, int sampleLength, out int encodedLength)
{
if (disposed)
throw new ObjectDisposedException("OpusEncoder");
int frames = FrameCount(inputPcmSamples);
IntPtr encodedPtr;
byte[] encoded =new byte [MaxDataBytes];
int length = 0;
/* How this can be ported to delphi */
fixed (byte* benc = encoded)
{
encodedPtr = new IntPtr((void*)benc);
length = API.opus_encode(_encoder, inputPcmSamples, frames, encodedPtr, sampleLength);
}
encodedLength = length;
if (length < 0)
throw new Exception("Encoding failed - " + ((Errors)length).ToString());
return encoded;
}
我正在寻找的主要代码部分是:
fixed (byte* benc = encoded)
{
encodedPtr = new IntPtr((void*)benc);
/* API.opus_encode = is declared in an other Class */
length = API.opus_encode(_encoder, inputPcmSamples, frames, encodedPtr, sampleLength);
}
非常感谢
答案 0 :(得分:0)
您似乎想知道如何处理C#中的fixed
块。
byte[] encoded =new byte [MaxDataBytes];
....
fixed (byte* benc = encoded)
{
encodedPtr = new IntPtr((void*)benc);
length = API.opus_encode(_encoder, inputPcmSamples, frames, encodedPtr, sampleLength);
}
fixed
的这种用法是固定托管数组以获取要传递给非托管代码的指针。
在Delphi中,我们只需要一个字节数组和一个指向该数组的指针。这看起来像这样:
var
encoded: TBytes;
....
SetLength(encoded, MaxDataBytes);
....
length := opus_encode(..., Pointer(encoded), ...);
或者也许:
length := opus_encode(..., PByte(encoded), ...);
或者也许:
length := opus_encode(..., @encoded[0], ...);
取决于您如何声明导入的函数opus_encode
和您的偏好。
如果MaxDataBytes
的值足够小,缓冲区可以在堆栈上存在,并且MaxDataBytes
在编译时已知,那么可以使用固定长度的数组。