Fix buffering issues

master
Nikola Forró 7 years ago
parent b065c3f7e3
commit acf168b042

@ -261,6 +261,8 @@ bool mirror(IMMDevice *monitor, IMMDevice *output)
break;
}
for (;;)
{
UINT32 padding = 0;
if ((res = out_client->lpVtbl->GetCurrentPadding(out_client, &padding)) != S_OK)
@ -284,23 +286,31 @@ bool mirror(IMMDevice *monitor, IMMDevice *output)
UINT32 frames = 0;
DWORD flags = 0;
if (packet_size > buffer_size - padding)
if (packet_size == 0)
{
if ((res = capture->lpVtbl->GetBuffer(capture, &mon_data, &frames, &flags,
NULL, NULL)) != S_OK)
// no input data, play silence
if ((res = render->lpVtbl->GetBuffer(render, buffer_size - padding, &out_data)) != S_OK)
{
fprintf(stderr, "Failed to get capture buffer of monitor client! [0x%08lx]\n", res);
fprintf(stderr, "Failed to get render buffer of output client! [0x%08lx]\n", res);
goto out;
}
if ((res = capture->lpVtbl->ReleaseBuffer(capture, 0)) != S_OK)
if ((res = render->lpVtbl->ReleaseBuffer(render, buffer_size - padding,
AUDCLNT_BUFFERFLAGS_SILENT)) != S_OK)
{
fprintf(stderr, "Failed to release capture buffer of monitor client! [0x%08lx]\n", res);
fprintf(stderr, "Failed to release render buffer of output client! [0x%08lx]\n", res);
goto out;
}
break;
}
else if (packet_size > 0)
else if (packet_size > buffer_size - padding)
{
// output buffer is full, we have to wait
break;
}
else
{
if ((res = capture->lpVtbl->GetBuffer(capture, &mon_data, &frames, &flags,
NULL, NULL)) != S_OK)
@ -329,20 +339,6 @@ bool mirror(IMMDevice *monitor, IMMDevice *output)
goto out;
}
}
else
{
if ((res = render->lpVtbl->GetBuffer(render, buffer_size - padding, &out_data)) != S_OK)
{
fprintf(stderr, "Failed to get render buffer of output client! [0x%08lx]\n", res);
goto out;
}
if ((res = render->lpVtbl->ReleaseBuffer(render, buffer_size - padding,
AUDCLNT_BUFFERFLAGS_SILENT)) != S_OK)
{
fprintf(stderr, "Failed to release render buffer of output client! [0x%08lx]\n", res);
goto out;
}
}
}

Loading…
Cancel
Save