MCI处理2G以上wav文件会有问题

这个问题在我测试查询大于2G的wav文件长度时遇到的,后来在google讨论组进行了讨论,初步可以确定这是MCI库函数中的BUG,在处理2G以上wav文件会出现,其他情况未验证。

bug情况:mciSendCommand函数查询文件长度或查询正在播放的位置会返回错误的结果。

bug重现代码:

    MCI_SET_PARMS mciSetParms;

    mciSetParms.dwTimeFormat = MCI_FORMAT_SAMPLES;

    if(m_ErrorCode = mciSendCommand(m_wDeviceID,MCI_SET,MCI_WAIT|MCI_SET_TIME_FORMAT,

        (DWORD_PTR) &mciSetParms))

    {

        return false;

    }

    MCI_STATUS_PARMS mciStatusParms;

    mciStatusParms.dwItem = MCI_STATUS_LENGTH;

    DWORD flags = MCI_STATUS_ITEM|MCI_WAIT ;

     if(m_ErrorCode = mciSendCommand(m_wDeviceID, MCI_STATUS,flags,

        (DWORD_PTR)&mciStatusParms))

    {

        return false;

    }

测试2.29G大小的wav文件,查询wav文件采样数总数,mciStatusParms.dwReturn正确的返回值应该是1231253424(这个数字可以通过wav头文件信息计算得到),而代码中实际返回值为3378737072. mciStatusParms的内存布局如下:

cc cc cc cc b0 6f 63 c9 01 00 00 00  cc cc cc cc

小端机器,红色部分就是错误的返回值。可以看到错误返回值和正确数值仅仅是最高位不同。因此很有可能是API函数内部处理不当导致的。

同样的情况还会在使用MCI_STATUS_POSITION参数来查询正在播放的位置时出现。返回的位置信息有误。

另外,参考google讨论组中某位的意见,用xp自带的MPLAYER.EXE程序进行测试,因为据说它是完全用MCI实现的。测试结果是,用MPLAYER.EXE打开大于2G的wav文件时,时间轴信息无效,且时间长度无法显示。由此可以更加确定MCI的API在处理2G以上wav文件时有BUG。

希望能尽快得到修复。

del.icio.us: C++, MCI, 多媒体编程
Flickr: C++, MCI, 多媒体编程

posted on 2010-01-21 15:27  absolute  阅读(1293)  评论(2编辑  收藏  举报

导航