Skip to content
Snippets Groups Projects
Commit bbbf72dd authored by Andrew Eikum's avatar Andrew Eikum Committed by Alexandre Julliard
Browse files

mmdevapi: Store period size in frames.

There are three different units to represent durations of audio: time,
bytes, and frames. Since all three are in use in this module, we should
be more explicit about the unit of each variable.
parent 1bf86127
No related branches found
No related tags found
No related merge requests found
......@@ -64,7 +64,7 @@ typedef struct ACImpl {
BOOL init, running;
CRITICAL_SECTION *crst;
HANDLE handle;
DWORD locked, flags, bufsize, pad, padpartial, ofs, psize, candisconnect;
DWORD locked, flags, bufsize, pad, padpartial, ofs, periodsize_frames, candisconnect;
BYTE *buffer;
WAVEFORMATEX *pwfx;
ALuint source;
......@@ -515,15 +515,14 @@ static HRESULT WINAPI AC_Initialize(IAudioClient *iface, AUDCLNT_SHAREMODE mode,
if (FAILED(hr))
goto out;
This->psize = (DWORD64)This->pwfx->nSamplesPerSec * time / (DWORD64)10000000;
This->periodsize_frames = (DWORD64)This->pwfx->nSamplesPerSec * time / (DWORD64)10000000;
if (duration > 20000000)
duration = 20000000;
bufsize = duration / time * This->psize;
bufsize = duration / time * This->periodsize_frames;
if (duration % time)
bufsize += This->psize;
bufsize += This->periodsize_frames;
This->bufsize = bufsize;
This->psize *= This->pwfx->nBlockAlign;
bufsize *= pwfx->nBlockAlign;
This->format = get_format(This->pwfx);
......@@ -694,20 +693,20 @@ static HRESULT WINAPI AC_GetCurrentPadding(IAudioClient *iface, UINT32 *numpad)
This->laststamp += period;
if (This->parent->flow == eCapture) {
This->pad += This->psize;
This->pad += This->periodsize_frames;
if (This->pad > This->bufsize)
This->pad = This->bufsize;
} else {
if (This->pad <= This->psize) {
if (This->pad <= This->periodsize_frames) {
This->pad = 0;
break;
} else
This->pad -= This->psize;
This->pad -= This->periodsize_frames;
}
}
if (This->parent->flow == eCapture)
*numpad = This->pad >= This->psize ? This->psize : 0;
*numpad = This->pad >= This->periodsize_frames ? This->periodsize_frames: 0;
else
*numpad = This->pad;
} else if (This->parent->flow == eRender) {
......@@ -726,8 +725,8 @@ static HRESULT WINAPI AC_GetCurrentPadding(IAudioClient *iface, UINT32 *numpad)
#if 0 /* Manipulative lie */
} else if (This->running) {
ALint size = This->pad - padpart;
if (size > This->psize)
size = This->psize;
if (size > This->periodsize_frames)
size = This->periodsize_frames;
played = (gettime() - This->laststamp)*8;
played = played * This->pwfx->nSamplesPerSec / 10000000;
if (played > size)
......@@ -735,13 +734,12 @@ static HRESULT WINAPI AC_GetCurrentPadding(IAudioClient *iface, UINT32 *numpad)
#endif
}
*numpad = This->pad - This->padpartial - played;
if (This->handle && *numpad + This->psize <= This->bufsize)
if (This->handle && (*numpad + This->periodsize_frames) <= This->bufsize)
SetEvent(This->handle);
getALError();
popALContext();
} else {
DWORD block = This->pwfx->nBlockAlign;
DWORD psize = This->psize / block;
palcGetIntegerv(This->dev, ALC_CAPTURE_SAMPLES, 1, &avail);
if (avail) {
DWORD ofs = This->ofs + This->pad;
......@@ -766,15 +764,15 @@ static HRESULT WINAPI AC_GetCurrentPadding(IAudioClient *iface, UINT32 *numpad)
DWORD rest;
WARN("Overflowed! %u bytes\n", This->pad - This->bufsize);
This->ofs += This->pad - This->bufsize;
rest = This->ofs % psize;
rest = This->ofs % This->periodsize_frames;
if (rest)
This->ofs += psize - rest;
This->ofs += This->periodsize_frames - rest;
This->ofs %= This->bufsize;
This->pad = This->bufsize;
}
}
if (This->pad >= psize)
*numpad = psize;
if (This->pad >= This->periodsize_frames)
*numpad = This->periodsize_frames;
else
*numpad = 0;
}
......@@ -1387,8 +1385,8 @@ static HRESULT WINAPI ACC_GetBuffer(IAudioCaptureClient *iface, BYTE **data, UIN
goto out;
IAudioCaptureClient_GetNextPacketSize(iface, frames);
ofs = This->parent->ofs;
if ( (ofs*block) % This->parent->psize)
ERR("Unaligned offset %u with %u\n", ofs*block, This->parent->psize);
if ( ofs % This->parent->periodsize_frames)
ERR("Unaligned offset %u with %u\n", ofs, This->parent->periodsize_frames);
*data = This->parent->buffer + ofs * block;
This->parent->locked = *frames;
if (devpos)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment