Patch 4/5 has `broken(1)` which is probably not very nice, but I don't know how to handle that otherwise. I would say it's a property that we want to enforce for our implementation; at the same time it breaks on older Windows builds without much logic, AFAICT. I would constrain the `brokn()` on the Windows version, but my understanding is that this is not allowed.
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mmdevapi/tests/capture.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/dlls/mmdevapi/tests/capture.c b/dlls/mmdevapi/tests/capture.c index c9ee23b8d51..98255d8e462 100644 --- a/dlls/mmdevapi/tests/capture.c +++ b/dlls/mmdevapi/tests/capture.c @@ -114,9 +114,9 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand
while (idx < packet_count) { - UINT32 next_packet_size, frames, padding; - UINT64 dev_pos, qpc_pos; - DWORD flags; + UINT32 next_packet_size, frames, frames2, padding; + UINT64 dev_pos, dev_pos2, qpc_pos, qpc_pos2; + DWORD flags, flags2; BYTE *ptr;
winetest_push_context("packet %u", idx); @@ -157,6 +157,23 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand ok(padding >= frames, "GetCurrentPadding returns %u, GetBuffer returns %u frames\n", padding, frames);
+ hr = IAudioCaptureClient_ReleaseBuffer(acc, 0); + ok(hr == S_OK, "Releasing buffer returns %08lx\n", hr); + + hr = IAudioCaptureClient_GetBuffer(acc, &ptr, &frames2, &flags2, &dev_pos2, &qpc_pos2); + ok(hr == S_OK, "GetBuffer returns %08lx\n", hr); + + ok(frames == frames2, "First GetBuffer returns %u frames, second GetBuffer returns %u\n", + frames, frames2); + ok(flags == flags2, "First GetBuffer returns %08lx flags, second GetBuffer returns %08lx\n", + flags, flags2); + ok(dev_pos == dev_pos2, "First GetBuffer returns %I64u device position, second GetBuffer returns %I64u\n", + dev_pos, dev_pos2); + /* Works with Pulse, but fails with ALSA and CoreAudio. */ + todo_wine_if(qpc_pos != qpc_pos2) + ok(qpc_pos == qpc_pos2, "First GetBuffer returns %I64u device QPC, second GetBuffer returns %I64u\n", + qpc_pos, qpc_pos2); + hr = IAudioCaptureClient_ReleaseBuffer(acc, frames); ok(hr == S_OK, "Releasing buffer returns %08lx\n", hr);
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mmdevapi/tests/capture.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/mmdevapi/tests/capture.c b/dlls/mmdevapi/tests/capture.c index 98255d8e462..3f0672848bf 100644 --- a/dlls/mmdevapi/tests/capture.c +++ b/dlls/mmdevapi/tests/capture.c @@ -174,6 +174,9 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand ok(qpc_pos == qpc_pos2, "First GetBuffer returns %I64u device QPC, second GetBuffer returns %I64u\n", qpc_pos, qpc_pos2);
+ hr = IAudioCaptureClient_ReleaseBuffer(acc, frames - 1); + ok(hr == AUDCLNT_E_INVALID_SIZE, "Releasing buffer with the wrong frame count returns %08lx\n", hr); + hr = IAudioCaptureClient_ReleaseBuffer(acc, frames); ok(hr == S_OK, "Releasing buffer returns %08lx\n", hr);
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mmdevapi/tests/capture.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/dlls/mmdevapi/tests/capture.c b/dlls/mmdevapi/tests/capture.c index 3f0672848bf..a412032e867 100644 --- a/dlls/mmdevapi/tests/capture.c +++ b/dlls/mmdevapi/tests/capture.c @@ -157,9 +157,27 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand ok(padding >= frames, "GetCurrentPadding returns %u, GetBuffer returns %u frames\n", padding, frames);
+ ptr = (void*)0xdeadf00ddeadf00d; + flags2 = 0xdeadf11d; + dev_pos2 = 0xdeadf22ddeadf22d; + qpc_pos2 = 0xdeadf33ddeadf33d; + hr = IAudioCaptureClient_GetBuffer(acc, &ptr, &frames2, &flags2, &dev_pos2, &qpc_pos2); + ok(hr == AUDCLNT_E_OUT_OF_ORDER, "Second GetBuffer returns %08lx\n", hr); + ok(broken((uintptr_t)ptr == (uintptr_t)0xdeadf00ddeadf00d) || /* <= win8 */ + !ptr, "Unexpected data after second GetBuffer: %p\n", ptr); + ok(flags2 == 0xdeadf11d, "Unexpected flags after second GetBuffer: %08lx\n", flags2); + ok(dev_pos2 == 0xdeadf22ddeadf22d, "Unexpected device position after second GetBuffer: %I64u\n", dev_pos2); + ok(qpc_pos2 == 0xdeadf33ddeadf33d, "Unexpected QPC position after second GetBuffer: %I64u\n", qpc_pos2); + hr = IAudioCaptureClient_ReleaseBuffer(acc, 0); ok(hr == S_OK, "Releasing buffer returns %08lx\n", hr);
+ hr = IAudioCaptureClient_ReleaseBuffer(acc, 0); + ok(hr == S_OK, "Releasing buffer again returns %08lx\n", hr); + + hr = IAudioCaptureClient_ReleaseBuffer(acc, frames); + ok(hr == AUDCLNT_E_OUT_OF_ORDER, "Releasing buffer again returns %08lx\n", hr); + hr = IAudioCaptureClient_GetBuffer(acc, &ptr, &frames2, &flags2, &dev_pos2, &qpc_pos2); ok(hr == S_OK, "GetBuffer returns %08lx\n", hr);
@@ -180,6 +198,9 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand hr = IAudioCaptureClient_ReleaseBuffer(acc, frames); ok(hr == S_OK, "Releasing buffer returns %08lx\n", hr);
+ hr = IAudioCaptureClient_ReleaseBuffer(acc, 0); + ok(hr == S_OK, "Releasing buffer again returns %08lx\n", hr); + ++idx;
winetest_pop_context();
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mmdevapi/tests/capture.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/dlls/mmdevapi/tests/capture.c b/dlls/mmdevapi/tests/capture.c index a412032e867..5d5a59d591e 100644 --- a/dlls/mmdevapi/tests/capture.c +++ b/dlls/mmdevapi/tests/capture.c @@ -21,6 +21,7 @@ * - IAudioClient with eCapture and IAudioCaptureClient */
+#include <stdint.h> #include <math.h>
#include "wine/test.h" @@ -106,8 +107,13 @@ static void test_uninitialized(IAudioClient *ac) CloseHandle(handle); }
+struct read_packets_data +{ + UINT64 expected_dev_pos; +}; + static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE handle, - unsigned int packet_count) + unsigned int packet_count, struct read_packets_data *data) { unsigned int idx = 0; HRESULT hr; @@ -157,6 +163,18 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand ok(padding >= frames, "GetCurrentPadding returns %u, GetBuffer returns %u frames\n", padding, frames);
+ if (data->expected_dev_pos != UINT64_MAX) + { + /* Win <= 8 and some older Win 10 builds sometimes handle discontinuities incorrectly. */ + ok(dev_pos >= data->expected_dev_pos || broken(1), + "GetBuffer returns %I64u device position, expected at least %I64u\n", + dev_pos, data->expected_dev_pos); + if (!(flags & AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY)) + ok(dev_pos == data->expected_dev_pos || broken(1), + "GetBuffer returns %I64u device position, expected %I64u\n", + dev_pos, data->expected_dev_pos); + } + ptr = (void*)0xdeadf00ddeadf00d; flags2 = 0xdeadf11d; dev_pos2 = 0xdeadf22ddeadf22d; @@ -201,6 +219,8 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand hr = IAudioCaptureClient_ReleaseBuffer(acc, 0); ok(hr == S_OK, "Releasing buffer again returns %08lx\n", hr);
+ data->expected_dev_pos = dev_pos + frames; + ++idx;
winetest_pop_context(); @@ -209,6 +229,7 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand
static void test_capture(IAudioClient *ac, HANDLE handle, WAVEFORMATEX *wfx) { + struct read_packets_data packets_data; IAudioCaptureClient *acc; HRESULT hr; UINT32 frames, next, pad, sum = 0; @@ -497,7 +518,9 @@ static void test_capture(IAudioClient *ac, HANDLE handle, WAVEFORMATEX *wfx) hr = IAudioClient_Start(ac); ok(hr == S_OK, "Start on a stopped stream returns %08lx\n", hr);
- read_packets(ac, acc, handle, 10); + packets_data.expected_dev_pos = sum; + + read_packets(ac, acc, handle, 10, &packets_data);
IAudioCaptureClient_Release(acc); }
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/mmdevapi/tests/capture.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/dlls/mmdevapi/tests/capture.c b/dlls/mmdevapi/tests/capture.c index 5d5a59d591e..ebef2258330 100644 --- a/dlls/mmdevapi/tests/capture.c +++ b/dlls/mmdevapi/tests/capture.c @@ -155,6 +155,11 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand hr = IAudioCaptureClient_GetBuffer(acc, &ptr, &frames, &flags, &dev_pos, &qpc_pos); ok(hr == S_OK, "GetBuffer returns %08lx\n", hr);
+ ok(next_packet_size == frames, "GetNextPacketSize returns %u, GetBuffer returns %u frames\n", + next_packet_size, frames); + + hr = IAudioCaptureClient_GetNextPacketSize(acc, &next_packet_size); + ok(hr == S_OK, "GetNextPacketSize returns %08lx\n", hr); ok(next_packet_size == frames, "GetNextPacketSize returns %u, GetBuffer returns %u frames\n", next_packet_size, frames);
@@ -196,6 +201,11 @@ static void read_packets(IAudioClient *ac, IAudioCaptureClient *acc, HANDLE hand hr = IAudioCaptureClient_ReleaseBuffer(acc, frames); ok(hr == AUDCLNT_E_OUT_OF_ORDER, "Releasing buffer again returns %08lx\n", hr);
+ hr = IAudioCaptureClient_GetNextPacketSize(acc, &next_packet_size); + ok(hr == S_OK, "GetNextPacketSize returns %08lx\n", hr); + ok(next_packet_size == frames, "GetNextPacketSize returns %u, GetBuffer returns %u frames\n", + next_packet_size, frames); + hr = IAudioCaptureClient_GetBuffer(acc, &ptr, &frames2, &flags2, &dev_pos2, &qpc_pos2); ok(hr == S_OK, "GetBuffer returns %08lx\n", hr);
Huw Davies (@huw) commented about dlls/mmdevapi/tests/capture.c:
ok(padding >= frames, "GetCurrentPadding returns %u, GetBuffer returns %u frames\n", padding, frames);
if (data->expected_dev_pos != UINT64_MAX)
{
/* Win <= 8 and some older Win 10 builds sometimes handle discontinuities incorrectly. */
ok(dev_pos >= data->expected_dev_pos || broken(1),
How about `... || broken(dev_pos < data->expected_dev_pos)`?