Add a test for mmioDescend, make it pass under Wine.
This commit is contained in:
parent
b84e29747b
commit
08de86c831
|
@ -1143,7 +1143,6 @@ MMRESULT WINAPI mmioDescend(HMMIO hmmio, LPMMCKINFO lpck,
|
||||||
FOURCC srchCkId;
|
FOURCC srchCkId;
|
||||||
FOURCC srchType;
|
FOURCC srchType;
|
||||||
|
|
||||||
|
|
||||||
TRACE("(%p, %p, %p, %04X);\n", hmmio, lpck, lpckParent, uFlags);
|
TRACE("(%p, %p, %p, %04X);\n", hmmio, lpck, lpckParent, uFlags);
|
||||||
|
|
||||||
if (lpck == NULL)
|
if (lpck == NULL)
|
||||||
|
@ -1166,57 +1165,54 @@ MMRESULT WINAPI mmioDescend(HMMIO hmmio, LPMMCKINFO lpck,
|
||||||
* examples disagree -Marcus,990216.
|
* examples disagree -Marcus,990216.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
srchCkId = 0;
|
||||||
srchType = 0;
|
srchType = 0;
|
||||||
|
|
||||||
/* find_chunk looks for 'ckid' */
|
/* find_chunk looks for 'ckid' */
|
||||||
if (uFlags & MMIO_FINDCHUNK)
|
if (uFlags & MMIO_FINDCHUNK)
|
||||||
srchCkId = lpck->ckid;
|
srchCkId = lpck->ckid;
|
||||||
|
|
||||||
/* find_riff and find_list look for 'fccType' */
|
/* find_riff and find_list look for 'fccType' */
|
||||||
if (uFlags & MMIO_FINDLIST) {
|
if (uFlags & MMIO_FINDLIST)
|
||||||
|
{
|
||||||
srchCkId = FOURCC_LIST;
|
srchCkId = FOURCC_LIST;
|
||||||
srchType = lpck->ckid;
|
srchType = lpck->fccType;
|
||||||
}
|
}
|
||||||
if (uFlags & MMIO_FINDRIFF) {
|
|
||||||
|
if (uFlags & MMIO_FINDRIFF)
|
||||||
|
{
|
||||||
srchCkId = FOURCC_RIFF;
|
srchCkId = FOURCC_RIFF;
|
||||||
srchType = lpck->ckid;
|
srchType = lpck->fccType;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uFlags & (MMIO_FINDCHUNK|MMIO_FINDLIST|MMIO_FINDRIFF)) {
|
TRACE("searching for %4.4s.%4.4s\n",
|
||||||
TRACE("searching for %.4s.%.4s\n",
|
(LPCSTR)&srchCkId, srchType ? (LPCSTR)&srchType : "any");
|
||||||
(LPSTR)&srchCkId,
|
|
||||||
srchType?(LPSTR)&srchType:"any ");
|
|
||||||
|
|
||||||
while (TRUE) {
|
while (TRUE)
|
||||||
|
{
|
||||||
LONG ix;
|
LONG ix;
|
||||||
|
|
||||||
ix = mmioRead(hmmio, (LPSTR)lpck, 3 * sizeof(DWORD));
|
ix = mmioRead(hmmio, (LPSTR)lpck, 3 * sizeof(DWORD));
|
||||||
if (ix < 2*sizeof(DWORD)) {
|
if (ix < 2*sizeof(DWORD))
|
||||||
|
{
|
||||||
mmioSeek(hmmio, dwOldPos, SEEK_SET);
|
mmioSeek(hmmio, dwOldPos, SEEK_SET);
|
||||||
WARN("return ChunkNotFound\n");
|
WARN("return ChunkNotFound\n");
|
||||||
return MMIOERR_CHUNKNOTFOUND;
|
return MMIOERR_CHUNKNOTFOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
lpck->dwDataOffset = dwOldPos + 2 * sizeof(DWORD);
|
lpck->dwDataOffset = dwOldPos + 2 * sizeof(DWORD);
|
||||||
TRACE("ckid=%.4s fcc=%.4s cksize=%08lX !\n",
|
TRACE("ckid=%4.4s fcc=%4.4s cksize=%08lX !\n",
|
||||||
(LPSTR)&lpck->ckid,
|
(LPCSTR)&lpck->ckid,
|
||||||
srchType?(LPSTR)&lpck->fccType:"<na>",
|
srchType ? (LPCSTR)&lpck->fccType:"<na>",
|
||||||
lpck->cksize);
|
lpck->cksize);
|
||||||
if ((srchCkId == lpck->ckid) &&
|
if ( (!srchCkId || (srchCkId == lpck->ckid)) &&
|
||||||
(!srchType || (srchType == lpck->fccType))
|
(!srchType || (srchType == lpck->fccType)) )
|
||||||
)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
dwOldPos = lpck->dwDataOffset + ((lpck->cksize + 1) & ~1);
|
dwOldPos = lpck->dwDataOffset + ((lpck->cksize + 1) & ~1);
|
||||||
mmioSeek(hmmio, dwOldPos, SEEK_SET);
|
mmioSeek(hmmio, dwOldPos, SEEK_SET);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
/* FIXME: unverified, does it do this? */
|
|
||||||
/* NB: This part is used by WAVE_mciOpen, among others */
|
|
||||||
if (mmioRead(hmmio, (LPSTR)lpck, 3 * sizeof(DWORD)) < 3 * sizeof(DWORD)) {
|
|
||||||
mmioSeek(hmmio, dwOldPos, SEEK_SET);
|
|
||||||
WARN("return ChunkNotFound 2nd\n");
|
|
||||||
return MMIOERR_CHUNKNOTFOUND;
|
|
||||||
}
|
|
||||||
lpck->dwDataOffset = dwOldPos + 2 * sizeof(DWORD);
|
|
||||||
}
|
|
||||||
lpck->dwFlags = 0;
|
lpck->dwFlags = 0;
|
||||||
/* If we were looking for RIFF/LIST chunks, the final file position
|
/* If we were looking for RIFF/LIST chunks, the final file position
|
||||||
* is after the chunkid. If we were just looking for the chunk
|
* is after the chunkid. If we were just looking for the chunk
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
Makefile
|
Makefile
|
||||||
capture.ok
|
capture.ok
|
||||||
mixer.ok
|
mixer.ok
|
||||||
|
mmio.ok
|
||||||
testlist.c
|
testlist.c
|
||||||
timer.ok
|
timer.ok
|
||||||
wave.ok
|
wave.ok
|
||||||
|
|
|
@ -8,6 +8,7 @@ IMPORTS = winmm kernel32
|
||||||
CTESTS = \
|
CTESTS = \
|
||||||
capture.c \
|
capture.c \
|
||||||
mixer.c \
|
mixer.c \
|
||||||
|
mmio.c \
|
||||||
timer.c \
|
timer.c \
|
||||||
wave.c
|
wave.c
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,176 @@
|
||||||
|
/*
|
||||||
|
* Unit tests for mmio APIs
|
||||||
|
*
|
||||||
|
* Copyright 2005 Dmitry Timoshkov
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "mmsystem.h"
|
||||||
|
#include "vfw.h"
|
||||||
|
#include "wine/test.h"
|
||||||
|
|
||||||
|
static const DWORD RIFF_buf[] =
|
||||||
|
{
|
||||||
|
FOURCC_RIFF, 7*sizeof(DWORD)+sizeof(MainAVIHeader), mmioFOURCC('A','V','I',' '),
|
||||||
|
FOURCC_LIST, sizeof(DWORD)+sizeof(MMCKINFO)+sizeof(MainAVIHeader), listtypeAVIHEADER,
|
||||||
|
ckidAVIMAINHDR, sizeof(MainAVIHeader),
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static void test_mmioDescend(void)
|
||||||
|
{
|
||||||
|
MMRESULT ret;
|
||||||
|
HMMIO hmmio;
|
||||||
|
MMIOINFO mmio;
|
||||||
|
MMCKINFO ckRiff, ckList, ck;
|
||||||
|
|
||||||
|
memset(&mmio, 0, sizeof(mmio));
|
||||||
|
mmio.fccIOProc = FOURCC_MEM;
|
||||||
|
mmio.cchBuffer = sizeof(RIFF_buf);
|
||||||
|
mmio.pchBuffer = (char *)&RIFF_buf;
|
||||||
|
|
||||||
|
/*hmmio = mmioOpen("msrle.avi", NULL, MMIO_READ);*/
|
||||||
|
hmmio = mmioOpen(NULL, &mmio, MMIO_READ);
|
||||||
|
ok(hmmio != 0, "mmioOpen error %u\n", mmio.wErrorRet);
|
||||||
|
trace("hmmio = %p\n", hmmio);
|
||||||
|
|
||||||
|
/* first normal RIFF AVI parsing */
|
||||||
|
ret = mmioDescend(hmmio, &ckRiff, NULL, 0);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ckRiff.ckid == FOURCC_RIFF, "wrong ckid: %04lx\n", ckRiff.ckid);
|
||||||
|
ok(ckRiff.fccType == formtypeAVI, "wrong fccType: %04lx\n", ckRiff.fccType);
|
||||||
|
trace("ckid %4.4s cksize %04lx fccType %4.4s off %04lx flags %04lx\n",
|
||||||
|
(LPCSTR)&ckRiff.ckid, ckRiff.cksize, (LPCSTR)&ckRiff.fccType,
|
||||||
|
ckRiff.dwDataOffset, ckRiff.dwFlags);
|
||||||
|
|
||||||
|
ret = mmioDescend(hmmio, &ckList, &ckRiff, 0);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ckList.ckid == FOURCC_LIST, "wrong ckid: %04lx\n", ckList.ckid);
|
||||||
|
ok(ckList.fccType == listtypeAVIHEADER, "wrong fccType: %04lx\n", ckList.fccType);
|
||||||
|
trace("ckid %4.4s cksize %04lx fccType %4.4s off %04lx flags %04lx\n",
|
||||||
|
(LPCSTR)&ckList.ckid, ckList.cksize, (LPCSTR)&ckList.fccType,
|
||||||
|
ckList.dwDataOffset, ckList.dwFlags);
|
||||||
|
|
||||||
|
ret = mmioDescend(hmmio, &ck, &ckList, 0);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ck.ckid == ckidAVIMAINHDR, "wrong ckid: %04lx\n", ck.ckid);
|
||||||
|
ok(ck.fccType == 0, "wrong fccType: %04lx\n", ck.fccType);
|
||||||
|
trace("ckid %4.4s cksize %04lx fccType %4.4s off %04lx flags %04lx\n",
|
||||||
|
(LPCSTR)&ck.ckid, ck.cksize, (LPCSTR)&ck.fccType,
|
||||||
|
ck.dwDataOffset, ck.dwFlags);
|
||||||
|
|
||||||
|
/* test various mmioDescend flags */
|
||||||
|
|
||||||
|
mmioSeek(hmmio, 0, SEEK_SET);
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, MMIO_FINDRIFF);
|
||||||
|
ok(ret == MMIOERR_CHUNKNOTFOUND ||
|
||||||
|
ret == MMIOERR_INVALIDFILE, "mmioDescend returned %u\n", ret);
|
||||||
|
|
||||||
|
mmioSeek(hmmio, 0, SEEK_SET);
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ck.ckid = 0;
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, MMIO_FINDRIFF);
|
||||||
|
ok(ret == MMIOERR_CHUNKNOTFOUND ||
|
||||||
|
ret == MMIOERR_INVALIDFILE, "mmioDescend returned %u\n", ret);
|
||||||
|
|
||||||
|
mmioSeek(hmmio, 0, SEEK_SET);
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ck.fccType = 0;
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, MMIO_FINDRIFF);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ck.ckid == FOURCC_RIFF, "wrong ckid: %04lx\n", ck.ckid);
|
||||||
|
ok(ck.fccType == formtypeAVI, "wrong fccType: %04lx\n", ck.fccType);
|
||||||
|
|
||||||
|
mmioSeek(hmmio, 0, SEEK_SET);
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, 0);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ck.ckid == FOURCC_RIFF, "wrong ckid: %04lx\n", ck.ckid);
|
||||||
|
ok(ck.fccType == formtypeAVI, "wrong fccType: %04lx\n", ck.fccType);
|
||||||
|
|
||||||
|
/* do NOT seek, use current file position */
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ck.fccType = 0;
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, MMIO_FINDLIST);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ck.ckid == FOURCC_LIST, "wrong ckid: %04lx\n", ck.ckid);
|
||||||
|
ok(ck.fccType == listtypeAVIHEADER, "wrong fccType: %04lx\n", ck.fccType);
|
||||||
|
|
||||||
|
mmioSeek(hmmio, 0, SEEK_SET);
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ck.ckid = 0;
|
||||||
|
ck.fccType = listtypeAVIHEADER;
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, MMIO_FINDCHUNK);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ck.ckid == FOURCC_RIFF, "wrong ckid: %04lx\n", ck.ckid);
|
||||||
|
ok(ck.fccType == formtypeAVI, "wrong fccType: %04lx\n", ck.fccType);
|
||||||
|
|
||||||
|
/* do NOT seek, use current file position */
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ck.ckid = FOURCC_LIST;
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, MMIO_FINDCHUNK);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ck.ckid == FOURCC_LIST, "wrong ckid: %04lx\n", ck.ckid);
|
||||||
|
ok(ck.fccType == listtypeAVIHEADER, "wrong fccType: %04lx\n", ck.fccType);
|
||||||
|
|
||||||
|
mmioSeek(hmmio, 0, SEEK_SET);
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ck.ckid = FOURCC_RIFF;
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, MMIO_FINDCHUNK);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ck.ckid == FOURCC_RIFF, "wrong ckid: %04lx\n", ck.ckid);
|
||||||
|
ok(ck.fccType == formtypeAVI, "wrong fccType: %04lx\n", ck.fccType);
|
||||||
|
|
||||||
|
/* do NOT seek, use current file position */
|
||||||
|
memset(&ckList, 0x55, sizeof(ckList));
|
||||||
|
ckList.ckid = 0;
|
||||||
|
ret = mmioDescend(hmmio, &ckList, &ck, MMIO_FINDCHUNK);
|
||||||
|
ok(ret == MMSYSERR_NOERROR, "mmioDescend error %u\n", ret);
|
||||||
|
ok(ckList.ckid == FOURCC_LIST, "wrong ckid: %04lx\n", ckList.ckid);
|
||||||
|
ok(ckList.fccType == listtypeAVIHEADER, "wrong fccType: %04lx\n", ckList.fccType);
|
||||||
|
|
||||||
|
mmioSeek(hmmio, 0, SEEK_SET);
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, MMIO_FINDCHUNK);
|
||||||
|
ok(ret == MMIOERR_CHUNKNOTFOUND ||
|
||||||
|
ret == MMIOERR_INVALIDFILE, "mmioDescend returned %u\n", ret);
|
||||||
|
ok(ck.ckid != 0x55555555, "wrong ckid: %04lx\n", ck.ckid);
|
||||||
|
ok(ck.fccType != 0x55555555, "wrong fccType: %04lx\n", ck.fccType);
|
||||||
|
ok(ck.dwDataOffset != 0x55555555, "wrong dwDataOffset: %04lx\n", ck.dwDataOffset);
|
||||||
|
|
||||||
|
mmioSeek(hmmio, 0, SEEK_SET);
|
||||||
|
memset(&ck, 0x55, sizeof(ck));
|
||||||
|
ret = mmioDescend(hmmio, &ck, NULL, MMIO_FINDRIFF);
|
||||||
|
ok(ret == MMIOERR_CHUNKNOTFOUND ||
|
||||||
|
ret == MMIOERR_INVALIDFILE, "mmioDescend returned %u\n", ret);
|
||||||
|
|
||||||
|
mmioClose(hmmio, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
START_TEST(mmio)
|
||||||
|
{
|
||||||
|
test_mmioDescend();
|
||||||
|
}
|
|
@ -1515,6 +1515,12 @@ UINT WINAPI mixerSetControlDetails(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
|
||||||
#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE + 8) /* cannot expand file */
|
#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE + 8) /* cannot expand file */
|
||||||
#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE + 9) /* chunk not found */
|
#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE + 9) /* chunk not found */
|
||||||
#define MMIOERR_UNBUFFERED (MMIOERR_BASE + 10) /* file is unbuffered */
|
#define MMIOERR_UNBUFFERED (MMIOERR_BASE + 10) /* file is unbuffered */
|
||||||
|
#define MMIOERR_PATHNOTFOUND (MMIOERR_BASE + 11)
|
||||||
|
#define MMIOERR_ACCESSDENIED (MMIOERR_BASE + 12)
|
||||||
|
#define MMIOERR_SHARINGVIOLATION (MMIOERR_BASE + 13)
|
||||||
|
#define MMIOERR_NETWORKERROR (MMIOERR_BASE + 14)
|
||||||
|
#define MMIOERR_TOOMANYOPENFILES (MMIOERR_BASE + 15)
|
||||||
|
#define MMIOERR_INVALIDFILE (MMIOERR_BASE + 16)
|
||||||
|
|
||||||
#define CFSEPCHAR '+' /* compound file name separator char. */
|
#define CFSEPCHAR '+' /* compound file name separator char. */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue