Hey Joerg, Op 12-03-12 11:01, joerg-cyril.hoe...@t-systems.com schreef: > Hi, > >>> A. mmdevapi fills the whole buffer once. >>> B. mmdevapi continuously overwrites the circular buffer. >>> I think A makes sense but really I don't know. >> I suspect B > I realized that I don't need a microphone if I can trust > IAC_CaptureClient's pu64QPCPosition output parameter: "the value of > the performance counter at the time that the audio endpoint device > recorded the device position of the first audio frame in the data > packet." > > Modifying the capture tests to trace that value shows that mmdevapi > mostly implements behaviour A with a few quirks. Please visit bug > #30147 for details. > Thanks for figuring it out. winepulse v10 carries the fixed behavior, diff with v9 attached below for completeness.
commit 9173c8dd53438eeb395ff7ac66498bdbb383474f Author: Maarten Lankhorst <m.b.lankho...@gmail.com> Date: Tue Mar 13 11:04:04 2012 +0100 winepulse: v10 diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index af8a826..50dcd4a 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -1,4 +1,5 @@ /* + * Copyright 2011-2012 Maarten Lankhorst * Copyright 2010-2011 Maarten Lankhorst for CodeWeavers * Copyright 2011 Andrew Eikum for CodeWeavers * @@ -574,9 +575,11 @@ static void pulse_rd_loop(ACImpl *This, size_t bytes) UINT32 src_len, copy, rem = This->capture_period; if (!(p = (ACPacket*)list_head(&This->packet_free_head))) { p = (ACPacket*)list_head(&This->packet_filled_head); - - next = (ACPacket*)p->entry.next; - next->discont = 1; + if (!p->discont) { + next = (ACPacket*)p->entry.next; + next->discont = 1; + } else + p = (ACPacket*)list_tail(&This->packet_filled_head); assert(This->pad == This->bufsize_bytes); } else { assert(This->pad < This->bufsize_bytes);