Add a test for mmioDescend, make it pass under Wine.

This commit is contained in:
Dmitry Timoshkov 2005-09-16 19:40:27 +00:00 committed by Alexandre Julliard
parent b84e29747b
commit 08de86c831
5 changed files with 218 additions and 38 deletions

View File

@ -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

View File

@ -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

View File

@ -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

176
dlls/winmm/tests/mmio.c Normal file
View File

@ -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();
}

View File

@ -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. */