2 * Unit tests for mmio APIs
4 * Copyright 2005 Dmitry Timoshkov
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
29 #include "wine/test.h"
31 static DWORD RIFF_buf
[] =
33 FOURCC_RIFF
, 32*sizeof(DWORD
), mmioFOURCC('A','V','I',' '),
34 FOURCC_LIST
, 29*sizeof(DWORD
), listtypeAVIHEADER
, ckidAVIMAINHDR
,
35 sizeof(MainAVIHeader
), 0xdeadbeef, 0xdeadbeef, 0xdeadbeef,
36 0xdeadbeef, 0xdeadbeef, 0xdeadbeef,0xdeadbeef,
37 0xdeadbeef, 0xdeadbeef, 0xdeadbeef,0xdeadbeef,
38 0xdeadbeef, 0xdeadbeef, 0xdeadbeef,
39 FOURCC_LIST
, 10*sizeof(DWORD
),listtypeSTREAMHEADER
, ckidSTREAMHEADER
,
40 7*sizeof(DWORD
), streamtypeVIDEO
, 0xdeadbeef, 0xdeadbeef,
41 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef,
42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
43 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
48 static void expect_buf_offset_dbg(HMMIO hmmio
, LONG off
, int line
)
53 memset(&mmio
, 0, sizeof(mmio
));
54 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
55 ok_(__FILE__
, line
)(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
56 ok_(__FILE__
, line
)(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
57 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
58 ok_(__FILE__
, line
)(ret
== off
, "expected %d, got %d\n", off
, ret
);
61 #define expect_buf_offset(a1, a2) expect_buf_offset_dbg(a1, a2, __LINE__)
63 static void test_mmioDescend(char *fname
)
68 MMCKINFO ckRiff
, ckList
, ck
;
70 memset(&mmio
, 0, sizeof(mmio
));
71 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
72 mmio
.cchBuffer
= sizeof(RIFF_buf
);
73 mmio
.pchBuffer
= (char *)RIFF_buf
;
74 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
);
77 skip("%s file is missing, skipping the test\n", fname
);
80 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
82 expect_buf_offset(hmmio
, 0);
84 /* first normal RIFF AVI parsing */
85 ret
= mmioDescend(hmmio
, &ckRiff
, NULL
, 0);
86 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
87 ok(ckRiff
.ckid
== FOURCC_RIFF
, "wrong ckid: %04x\n", ckRiff
.ckid
);
88 ok(ckRiff
.fccType
== formtypeAVI
, "wrong fccType: %04x\n", ckRiff
.fccType
);
89 ok(ckRiff
.dwDataOffset
== 8, "expected 8 got %u\n", ckRiff
.dwDataOffset
);
90 trace("ckid %4.4s cksize %04x fccType %4.4s off %04x flags %04x\n",
91 (LPCSTR
)&ckRiff
.ckid
, ckRiff
.cksize
, (LPCSTR
)&ckRiff
.fccType
,
92 ckRiff
.dwDataOffset
, ckRiff
.dwFlags
);
94 expect_buf_offset(hmmio
, 12);
96 ret
= mmioDescend(hmmio
, &ckList
, &ckRiff
, 0);
97 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
98 ok(ckList
.ckid
== FOURCC_LIST
, "wrong ckid: %04x\n", ckList
.ckid
);
99 ok(ckList
.fccType
== listtypeAVIHEADER
, "wrong fccType: %04x\n", ckList
.fccType
);
100 ok(ckList
.dwDataOffset
== 20, "expected 20 got %u\n", ckList
.dwDataOffset
);
101 trace("ckid %4.4s cksize %04x fccType %4.4s off %04x flags %04x\n",
102 (LPCSTR
)&ckList
.ckid
, ckList
.cksize
, (LPCSTR
)&ckList
.fccType
,
103 ckList
.dwDataOffset
, ckList
.dwFlags
);
105 expect_buf_offset(hmmio
, 24);
107 ret
= mmioDescend(hmmio
, &ck
, &ckList
, 0);
108 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
109 ok(ck
.ckid
== ckidAVIMAINHDR
, "wrong ckid: %04x\n", ck
.ckid
);
110 ok(ck
.fccType
== 0, "wrong fccType: %04x\n", ck
.fccType
);
111 trace("ckid %4.4s cksize %04x fccType %4.4s off %04x flags %04x\n",
112 (LPCSTR
)&ck
.ckid
, ck
.cksize
, (LPCSTR
)&ck
.fccType
,
113 ck
.dwDataOffset
, ck
.dwFlags
);
115 expect_buf_offset(hmmio
, 32);
117 /* Skip chunk data */
118 ret
= mmioSeek(hmmio
, ck
.cksize
, SEEK_CUR
);
119 ok(ret
== 0x58, "expected 0x58, got %#x\n", ret
);
121 ret
= mmioDescend(hmmio
, &ckList
, &ckList
, 0);
122 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
123 ok(ckList
.ckid
== FOURCC_LIST
, "wrong ckid: %04x\n", ckList
.ckid
);
124 ok(ckList
.fccType
== listtypeSTREAMHEADER
, "wrong fccType: %04x\n", ckList
.fccType
);
125 trace("ckid %4.4s cksize %04x fccType %4.4s off %04x flags %04x\n",
126 (LPCSTR
)&ckList
.ckid
, ckList
.cksize
, (LPCSTR
)&ckList
.fccType
,
127 ckList
.dwDataOffset
, ckList
.dwFlags
);
129 expect_buf_offset(hmmio
, 100);
131 ret
= mmioDescend(hmmio
, &ck
, &ckList
, 0);
132 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
133 ok(ck
.ckid
== ckidSTREAMHEADER
, "wrong ckid: %04x\n", ck
.ckid
);
134 ok(ck
.fccType
== 0, "wrong fccType: %04x\n", ck
.fccType
);
135 trace("ckid %4.4s cksize %04x fccType %4.4s off %04x flags %04x\n",
136 (LPCSTR
)&ck
.ckid
, ck
.cksize
, (LPCSTR
)&ck
.fccType
,
137 ck
.dwDataOffset
, ck
.dwFlags
);
139 expect_buf_offset(hmmio
, 108);
141 /* test various mmioDescend flags */
143 mmioSeek(hmmio
, 0, SEEK_SET
);
144 memset(&ck
, 0x66, sizeof(ck
));
145 ret
= mmioDescend(hmmio
, &ck
, NULL
, MMIO_FINDRIFF
);
146 ok(ret
== MMIOERR_CHUNKNOTFOUND
||
147 ret
== MMIOERR_INVALIDFILE
, "mmioDescend returned %u\n", ret
);
149 mmioSeek(hmmio
, 0, SEEK_SET
);
150 memset(&ck
, 0x66, sizeof(ck
));
152 ret
= mmioDescend(hmmio
, &ck
, NULL
, MMIO_FINDRIFF
);
153 ok(ret
== MMIOERR_CHUNKNOTFOUND
||
154 ret
== MMIOERR_INVALIDFILE
, "mmioDescend returned %u\n", ret
);
156 mmioSeek(hmmio
, 0, SEEK_SET
);
157 memset(&ck
, 0x66, sizeof(ck
));
159 ret
= mmioDescend(hmmio
, &ck
, NULL
, MMIO_FINDRIFF
);
160 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
161 ok(ck
.ckid
== FOURCC_RIFF
, "wrong ckid: %04x\n", ck
.ckid
);
162 ok(ck
.fccType
== formtypeAVI
, "wrong fccType: %04x\n", ck
.fccType
);
164 mmioSeek(hmmio
, 0, SEEK_SET
);
165 memset(&ck
, 0x66, sizeof(ck
));
166 ret
= mmioDescend(hmmio
, &ck
, NULL
, 0);
167 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
168 ok(ck
.ckid
== FOURCC_RIFF
, "wrong ckid: %04x\n", ck
.ckid
);
169 ok(ck
.fccType
== formtypeAVI
, "wrong fccType: %04x\n", ck
.fccType
);
171 /* do NOT seek, use current file position */
172 memset(&ck
, 0x66, sizeof(ck
));
174 ret
= mmioDescend(hmmio
, &ck
, NULL
, MMIO_FINDLIST
);
175 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
176 ok(ck
.ckid
== FOURCC_LIST
, "wrong ckid: %04x\n", ck
.ckid
);
177 ok(ck
.fccType
== listtypeAVIHEADER
, "wrong fccType: %04x\n", ck
.fccType
);
179 mmioSeek(hmmio
, 0, SEEK_SET
);
180 memset(&ck
, 0x66, sizeof(ck
));
182 ck
.fccType
= listtypeAVIHEADER
;
183 ret
= mmioDescend(hmmio
, &ck
, NULL
, MMIO_FINDCHUNK
);
184 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
185 ok(ck
.ckid
== FOURCC_RIFF
, "wrong ckid: %04x\n", ck
.ckid
);
186 ok(ck
.fccType
== formtypeAVI
, "wrong fccType: %04x\n", ck
.fccType
);
188 /* do NOT seek, use current file position */
189 memset(&ck
, 0x66, sizeof(ck
));
190 ck
.ckid
= FOURCC_LIST
;
191 ret
= mmioDescend(hmmio
, &ck
, NULL
, MMIO_FINDCHUNK
);
192 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
193 ok(ck
.ckid
== FOURCC_LIST
, "wrong ckid: %04x\n", ck
.ckid
);
194 ok(ck
.fccType
== listtypeAVIHEADER
, "wrong fccType: %04x\n", ck
.fccType
);
196 mmioSeek(hmmio
, 0, SEEK_SET
);
197 memset(&ck
, 0x66, sizeof(ck
));
198 ck
.ckid
= FOURCC_RIFF
;
199 ret
= mmioDescend(hmmio
, &ck
, NULL
, MMIO_FINDCHUNK
);
200 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
201 ok(ck
.ckid
== FOURCC_RIFF
, "wrong ckid: %04x\n", ck
.ckid
);
202 ok(ck
.fccType
== formtypeAVI
, "wrong fccType: %04x\n", ck
.fccType
);
204 /* do NOT seek, use current file position */
205 memset(&ckList
, 0x66, sizeof(ckList
));
207 ret
= mmioDescend(hmmio
, &ckList
, &ck
, MMIO_FINDCHUNK
);
208 ok(ret
== MMSYSERR_NOERROR
, "mmioDescend error %u\n", ret
);
209 ok(ckList
.ckid
== FOURCC_LIST
, "wrong ckid: %04x\n", ckList
.ckid
);
210 ok(ckList
.fccType
== listtypeAVIHEADER
, "wrong fccType: %04x\n", ckList
.fccType
);
212 mmioSeek(hmmio
, 0, SEEK_SET
);
213 memset(&ck
, 0x66, sizeof(ck
));
214 ret
= mmioDescend(hmmio
, &ck
, NULL
, MMIO_FINDCHUNK
);
215 ok(ret
== MMIOERR_CHUNKNOTFOUND
||
216 ret
== MMIOERR_INVALIDFILE
, "mmioDescend returned %u\n", ret
);
217 ok(ck
.ckid
!= 0x66666666, "wrong ckid: %04x\n", ck
.ckid
);
218 ok(ck
.fccType
!= 0x66666666, "wrong fccType: %04x\n", ck
.fccType
);
219 ok(ck
.dwDataOffset
!= 0x66666666, "wrong dwDataOffset: %04x\n", ck
.dwDataOffset
);
221 mmioSeek(hmmio
, 0, SEEK_SET
);
222 memset(&ck
, 0x66, sizeof(ck
));
223 ret
= mmioDescend(hmmio
, &ck
, NULL
, MMIO_FINDRIFF
);
224 ok(ret
== MMIOERR_CHUNKNOTFOUND
||
225 ret
== MMIOERR_INVALIDFILE
, "mmioDescend returned %u\n", ret
);
230 static void test_mmioOpen(char *fname
)
232 char buf
[MMIO_DEFAULTBUFFER
];
237 memset(&mmio
, 0, sizeof(mmio
));
238 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
239 mmio
.cchBuffer
= sizeof(buf
);
240 mmio
.pchBuffer
= buf
;
241 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
);
244 skip("%s file is missing, skipping the test\n", fname
);
247 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
249 memset(&mmio
, 0, sizeof(mmio
));
250 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
251 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
252 ok(mmio
.dwFlags
== MMIO_READ
, "expected MMIO_READ, got %x\n", mmio
.dwFlags
);
253 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
254 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
255 ok(mmio
.cchBuffer
== sizeof(buf
), "got %u\n", mmio
.cchBuffer
);
256 ok(mmio
.pchBuffer
== buf
, "expected %p, got %p\n", buf
, mmio
.pchBuffer
);
257 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
258 if (mmio
.fccIOProc
== FOURCC_DOS
)
259 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
261 ok(mmio
.pchEndRead
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndRead
);
262 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndWrite
);
263 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
264 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
266 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
267 ok(ret
== 0, "expected 0, got %d\n", ret
);
271 memset(&mmio
, 0, sizeof(mmio
));
272 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
274 mmio
.pchBuffer
= buf
;
275 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
);
276 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
278 memset(&mmio
, 0, sizeof(mmio
));
279 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
280 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
281 ok(mmio
.dwFlags
== MMIO_READ
, "expected MMIO_READ, got %x\n", mmio
.dwFlags
);
282 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
283 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
284 ok(mmio
.cchBuffer
== 0, "expected 0, got %u\n", mmio
.cchBuffer
);
285 ok(mmio
.pchBuffer
== buf
, "expected %p, got %p\n", buf
, mmio
.pchBuffer
);
286 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
287 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
288 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndWrite
);
289 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
290 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
292 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
293 ok(ret
== 0, "expected 0, got %d\n", ret
);
297 memset(&mmio
, 0, sizeof(mmio
));
298 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
300 mmio
.pchBuffer
= NULL
;
301 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
);
302 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
304 memset(&mmio
, 0, sizeof(mmio
));
305 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
306 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
307 ok(mmio
.dwFlags
== MMIO_READ
, "expected MMIO_READ, got %x\n", mmio
.dwFlags
);
308 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
309 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
310 ok(mmio
.cchBuffer
== 0, "expected 0, got %u\n", mmio
.cchBuffer
);
311 ok(mmio
.pchBuffer
== NULL
, "expected NULL\n");
312 ok(mmio
.pchNext
== NULL
, "expected NULL\n");
313 ok(mmio
.pchEndRead
== NULL
, "expected NULL\n");
314 ok(mmio
.pchEndWrite
== NULL
, "expected NULL\n");
315 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
316 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
318 #if 0 /* remove once passes under Wine */
319 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
320 ok(ret
== 0, "expected 0, got %d\n", ret
);
325 memset(&mmio
, 0, sizeof(mmio
));
326 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
327 mmio
.cchBuffer
= 256;
328 mmio
.pchBuffer
= NULL
;
329 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
);
330 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
332 memset(&mmio
, 0, sizeof(mmio
));
333 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
334 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
335 ok(mmio
.dwFlags
== (MMIO_READ
|MMIO_ALLOCBUF
), "expected MMIO_READ|MMIO_ALLOCBUF, got %x\n", mmio
.dwFlags
);
336 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
337 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
338 ok(mmio
.cchBuffer
== 256, "expected 256, got %u\n", mmio
.cchBuffer
);
339 ok(mmio
.pchBuffer
!= NULL
, "expected not NULL\n");
340 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
341 if (mmio
.fccIOProc
== FOURCC_DOS
)
342 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
344 ok(mmio
.pchEndRead
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndRead
);
345 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndWrite
);
346 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
347 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
349 #if 0 /* remove once passes under Wine */
350 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
351 ok(ret
== 0, "expected 0, got %d\n", ret
);
356 memset(&mmio
, 0, sizeof(mmio
));
357 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
358 mmio
.cchBuffer
= sizeof(buf
);
359 mmio
.pchBuffer
= buf
;
360 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
| MMIO_ALLOCBUF
);
361 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
363 memset(&mmio
, 0, sizeof(mmio
));
364 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
365 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
366 ok(mmio
.dwFlags
== MMIO_READ
, "expected MMIO_READ, got %x\n", mmio
.dwFlags
);
367 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
368 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
369 ok(mmio
.cchBuffer
== sizeof(buf
), "got %u\n", mmio
.cchBuffer
);
370 ok(mmio
.pchBuffer
== buf
, "expected %p, got %p\n", buf
, mmio
.pchBuffer
);
371 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
372 if (mmio
.fccIOProc
== FOURCC_DOS
)
373 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
375 ok(mmio
.pchEndRead
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndRead
);
376 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndWrite
);
377 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
378 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
380 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
381 ok(ret
== 0, "expected 0, got %d\n", ret
);
385 memset(&mmio
, 0, sizeof(mmio
));
386 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
388 mmio
.pchBuffer
= NULL
;
389 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
| MMIO_ALLOCBUF
);
390 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
392 memset(&mmio
, 0, sizeof(mmio
));
393 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
394 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
395 ok(mmio
.dwFlags
== (MMIO_READ
|MMIO_ALLOCBUF
), "expected MMIO_READ|MMIO_ALLOCBUF, got %x\n", mmio
.dwFlags
);
396 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
397 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
398 ok(mmio
.cchBuffer
== MMIO_DEFAULTBUFFER
, "expected MMIO_DEFAULTBUFFER, got %u\n", mmio
.cchBuffer
);
399 ok(mmio
.pchBuffer
!= NULL
, "expected not NULL\n");
400 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
401 if (mmio
.fccIOProc
== FOURCC_DOS
)
402 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
404 ok(mmio
.pchEndRead
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndRead
);
405 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndWrite
);
406 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
407 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
409 #if 0 /* remove once passes under Wine */
410 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
411 ok(ret
== 0, "expected 0, got %d\n", ret
);
416 memset(&mmio
, 0, sizeof(mmio
));
417 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
418 mmio
.cchBuffer
= 256;
419 mmio
.pchBuffer
= NULL
;
420 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
| MMIO_ALLOCBUF
);
421 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
423 memset(&mmio
, 0, sizeof(mmio
));
424 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
425 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
426 ok(mmio
.dwFlags
== (MMIO_READ
|MMIO_ALLOCBUF
), "expected MMIO_READ|MMIO_ALLOCBUF, got %x\n", mmio
.dwFlags
);
427 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
428 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
429 ok(mmio
.cchBuffer
== 256, "expected 256, got %u\n", mmio
.cchBuffer
);
430 ok(mmio
.pchBuffer
!= NULL
, "expected not NULL\n");
431 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
432 if (mmio
.fccIOProc
== FOURCC_DOS
)
433 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
435 ok(mmio
.pchEndRead
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndRead
);
436 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndWrite
);
437 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
438 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
440 #if 0 /* remove once passes under Wine */
441 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
442 ok(ret
== 0, "expected 0, got %d\n", ret
);
447 memset(&mmio
, 0, sizeof(mmio
));
448 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
450 mmio
.pchBuffer
= buf
;
451 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
| MMIO_ALLOCBUF
);
452 if (!hmmio
&& mmio
.wErrorRet
== ERROR_BAD_FORMAT
)
454 /* Seen on Win9x, WinMe but also XP-SP1 */
455 skip("Some Windows versions don't like a 0 size and a given buffer\n");
458 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
460 memset(&mmio
, 0, sizeof(mmio
));
461 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
462 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
463 ok(mmio
.dwFlags
== MMIO_READ
, "expected MMIO_READ, got %x\n", mmio
.dwFlags
);
464 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
465 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
466 ok(mmio
.cchBuffer
== MMIO_DEFAULTBUFFER
, "expected MMIO_DEFAULTBUFFER, got %u\n", mmio
.cchBuffer
);
467 ok(mmio
.pchBuffer
== buf
, "expected %p, got %p\n", buf
, mmio
.pchBuffer
);
468 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
469 if (mmio
.fccIOProc
== FOURCC_DOS
)
470 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
472 ok(mmio
.pchEndRead
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndRead
);
473 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndWrite
);
474 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
475 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
477 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
478 ok(ret
== 0, "expected 0, got %d\n", ret
);
483 static void test_mmioSetBuffer(char *fname
)
490 memset(&mmio
, 0, sizeof(mmio
));
491 mmio
.fccIOProc
= fname
? FOURCC_DOS
: FOURCC_MEM
;
492 mmio
.cchBuffer
= sizeof(buf
);
493 mmio
.pchBuffer
= buf
;
494 hmmio
= mmioOpen(fname
, &mmio
, MMIO_READ
);
497 skip("%s file is missing, skipping the test\n", fname
);
500 ok(hmmio
!= 0, "mmioOpen error %u\n", mmio
.wErrorRet
);
502 memset(&mmio
, 0, sizeof(mmio
));
503 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
504 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
505 ok(mmio
.dwFlags
== MMIO_READ
, "expected MMIO_READ, got %x\n", mmio
.dwFlags
);
506 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
507 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
508 ok(mmio
.cchBuffer
== sizeof(buf
), "got %u\n", mmio
.cchBuffer
);
509 ok(mmio
.pchBuffer
== buf
, "expected %p, got %p\n", buf
, mmio
.pchBuffer
);
510 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
511 if (mmio
.fccIOProc
== FOURCC_DOS
)
512 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
514 ok(mmio
.pchEndRead
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndRead
);
515 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndWrite
);
516 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
517 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
519 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
520 ok(ret
== 0, "expected 0, got %d\n", ret
);
522 ret
= mmioSetBuffer(hmmio
, NULL
, 0, 0);
523 ok(ret
== MMSYSERR_NOERROR
, "mmioSetBuffer error %u\n", ret
);
525 memset(&mmio
, 0, sizeof(mmio
));
526 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
527 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
528 ok(mmio
.dwFlags
== MMIO_READ
, "expected MMIO_READ, got %x\n", mmio
.dwFlags
);
529 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
530 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
531 ok(mmio
.cchBuffer
== 0, "got not 0\n");
532 ok(mmio
.pchBuffer
== NULL
, "got not NULL buf\n");
533 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
534 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
535 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndWrite
);
536 #if 0 /* remove once passes under Wine */
537 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
538 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
541 #if 0 /* remove once passes under Wine */
542 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
543 ok(ret
== 0, "expected 0, got %d\n", ret
);
546 ret
= mmioSetBuffer(hmmio
, NULL
, 0, MMIO_ALLOCBUF
);
547 ok(ret
== MMSYSERR_NOERROR
, "mmioSetBuffer error %u\n", ret
);
549 memset(&mmio
, 0, sizeof(mmio
));
550 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
551 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
552 ok(mmio
.dwFlags
== MMIO_READ
, "expected MMIO_READ, got %x\n", mmio
.dwFlags
);
553 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
554 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
555 ok(mmio
.cchBuffer
== 0, "got not 0\n");
556 ok(mmio
.pchBuffer
== NULL
, "got not NULL buf\n");
557 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
558 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
559 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndWrite
);
560 #if 0 /* remove once passes under Wine */
561 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
562 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
565 #if 0 /* remove once passes under Wine */
566 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
567 ok(ret
== 0, "expected 0, got %d\n", ret
);
570 ret
= mmioSetBuffer(hmmio
, buf
, 0, MMIO_ALLOCBUF
);
571 ok(ret
== MMSYSERR_NOERROR
, "mmioSetBuffer error %u\n", ret
);
573 memset(&mmio
, 0, sizeof(mmio
));
574 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
575 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
576 ok(mmio
.dwFlags
== MMIO_READ
, "expected MMIO_READ, got %x\n", mmio
.dwFlags
);
577 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
578 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
579 ok(mmio
.cchBuffer
== 0, "got not 0\n");
580 ok(mmio
.pchBuffer
== buf
, "expected %p, got %p\n", buf
, mmio
.pchBuffer
);
581 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
582 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndRead
);
583 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchEndWrite
);
584 #if 0 /* remove once passes under Wine */
585 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
586 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
589 #if 0 /* remove once passes under Wine */
590 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
591 ok(ret
== 0, "expected 0, got %d\n", ret
);
594 ret
= mmioSetBuffer(hmmio
, NULL
, 256, MMIO_WRITE
|MMIO_ALLOCBUF
);
595 ok(ret
== MMSYSERR_NOERROR
, "mmioSetBuffer error %u\n", ret
);
597 memset(&mmio
, 0, sizeof(mmio
));
598 ret
= mmioGetInfo(hmmio
, &mmio
, 0);
599 ok(ret
== MMSYSERR_NOERROR
, "mmioGetInfo error %u\n", ret
);
600 ok(mmio
.dwFlags
== (MMIO_READ
|MMIO_ALLOCBUF
), "expected MMIO_READ|MMIO_ALLOCBUF, got %x\n", mmio
.dwFlags
);
601 ok(mmio
.wErrorRet
== MMSYSERR_NOERROR
, "expected MMSYSERR_NOERROR, got %u\n", mmio
.wErrorRet
);
602 ok(mmio
.fccIOProc
== (fname
? FOURCC_DOS
: FOURCC_MEM
), "got %4.4s\n", (LPCSTR
)&mmio
.fccIOProc
);
603 ok(mmio
.cchBuffer
== 256, "got %u\n", mmio
.cchBuffer
);
604 ok(mmio
.pchBuffer
!= NULL
, "expected not NULL\n");
605 ok(mmio
.pchBuffer
!= buf
, "expected != buf\n");
606 ok(mmio
.pchNext
== mmio
.pchBuffer
, "expected %p, got %p\n", mmio
.pchBuffer
, mmio
.pchNext
);
607 ok(mmio
.pchEndRead
== mmio
.pchBuffer
, "expected %p, got %p\n", buf
, mmio
.pchEndRead
);
608 ok(mmio
.pchEndWrite
== mmio
.pchBuffer
+ mmio
.cchBuffer
, "expected %p + %d, got %p\n", mmio
.pchBuffer
, mmio
.cchBuffer
, mmio
.pchEndWrite
);
609 #if 0 /* remove once passes under Wine */
610 ok(mmio
.lBufOffset
== 0, "expected 0, got %d\n", mmio
.lBufOffset
);
611 ok(mmio
.lDiskOffset
== 0, "expected 0, got %d\n", mmio
.lDiskOffset
);
614 #if 0 /* remove once passes under Wine */
615 ret
= mmioSeek(hmmio
, 0, SEEK_CUR
);
616 ok(ret
== 0, "expected 0, got %d\n", ret
);
624 char fname
[] = "msrle.avi";
626 test_mmioDescend(NULL
);
627 test_mmioDescend(fname
);
629 test_mmioOpen(fname
);
630 test_mmioSetBuffer(NULL
);
631 test_mmioSetBuffer(fname
);