(lib)mpg123在C#中使用函数mpg123_index

时间:2018-03-05 07:51:54

标签: c# c pointers mono

我在我的项目中使用mpg123解码mp3。我与开发人员(Thomas Orgis)讨论了搜索时的性能问题并且他有一个好主意:扫描文件,然后将扫描的索引设置为播放句柄。 所以我想在我的C#项目中使用mpg123_index和mpg123_set_index,并在libmpg123周围使用一个包装器。

包装器不是自编的,我也联系了开发人员,但他似乎无法使用。所以也许有人掌握了指针编程的知识,我自己也做了一些事情,但是目前我在调用方法时只得到一个AccessViolationException。

这里有一些代码: 包装规范(也许这是错的?!):

[DllImport(Mpg123Dll)]public static extern int mpg123_index(IntPtr mh, IntPtr offsets, IntPtr step, IntPtr fill);

网站上的规范(C):

https://www.mpg123.de/api/group__mpg123__seek.shtml#gae1d174ac632ec72df7dead94c04865fb

  

MPG123_EXPORT int mpg123_index(mpg123_handle * mh,off_t **     偏移,off_t * step,size_t * fill)

     

允许访问为搜索而管理的帧索引表。您   被要求不要修改值...使用mpg123_set_index来设置   寻求指数

     

参数       把柄       偏移指向索引数组的指针       第一步索引字节偏移推进了这么多MPEG帧       填写记录索引偏移的数量;数组的大小

     

返回       MPG123_OK成功

我尝试在C#中使用该功能:

IntPtr pIndex = IntPtr.Zero;
IntPtr pFill = IntPtr.Zero;
IntPtr pStep = IntPtr.Zero;
if (MPGImport.mpg123_index(this.mp3Handle,pIndex,pStep,pFill) != (int)MPGImport.mpg123_errors.MPG123_OK)) 
{
    log.error("Failed!");
}

那么,有谁有想法,如何在C#端正确使用该功能?从mpg123的作者我得到的信息,pIndex将是一个指向内部索引的指针。所以这个指针将被这个函数改变。

感谢您的帮助。

此致 斯文

编辑: 现在,以下代码几乎可以工作:

[DllImport(Mpg123Dll)]public unsafe static extern int mpg123_index(IntPtr mh, long **offsets, long *step, ulong *fill);
[DllImport(Mpg123Dll)]public unsafe static extern int mpg123_set_index(IntPtr mh, long* offsets, long step, ulong fill);

public static Boolean CopyIndex(IntPtr _sourceHandle,IntPtr _destinationHandle)
{
    Boolean copiedIndex = false;
    unsafe
    {
        long* offsets = null; 
        long step = 0;
        ulong fill = 0;
        int result = MPGImport.mpg123_index(_sourceHandle, &offsets, &step, &fill);
        if (result == (int)MPGImport.mpg123_errors.MPG123_OK)
        {
            result = MPGImport.mpg123_set_index(_destinationHandle, offsets, step, fill);
            if (result == (int)mpg123_errors.MPG123_OK)
            {
                copiedIndex = true;
            }
        }
    }
    return copiedIndex;
}

result = MPGImport.mpg123_set_index(_destinationHandle, offsets, step, fill);上,结果为-1,即MPG123_ERR = -1, /**< Generic Error */

1 个答案:

答案 0 :(得分:2)

工作代码:

[DllImport(Mpg123Dll)]public unsafe static extern int mpg123_index(IntPtr mh, long **offsets, long *step, ulong *fill);
[DllImport(Mpg123Dll)]public unsafe static extern int mpg123_set_index(IntPtr mh, long* offsets, long step, ulong fill);

public static Boolean CopyIndex(IntPtr _sourceHandle,IntPtr _destinationHandle)
{
    Boolean copiedIndex = false;
    unsafe
    {
        long* offsets = null; 
        long step = 0;
        ulong fill = 0;
        int result = MPGImport.mpg123_index(_sourceHandle, &offsets, &step, &fill);
        if (result == (int)MPGImport.mpg123_errors.MPG123_OK)
        {
            result = MPGImport.mpg123_set_index(_destinationHandle, offsets, step, fill);
            if (result == (int)mpg123_errors.MPG123_OK)
            {
                copiedIndex = true;
            }
        }
    }
    return copiedIndex;
}

_sourceHandle和_destinationHandle可能不是IntPtr.Zero,这是我的错误。感谢Stargateur,真的很好!