Всё, я разобрался. На самом деле там данные типа float. Например, если размер пакета возвращает 441, и там 2 канала, значит там будет 882 семпла, левый и правый чередуются. Такой код выдаёт правдоподобный результат для синусоиды в одном канале:
do
{
Sleep(10);
hr = pCaptureClient->GetNextPacketSize(&packetLength);
if (packetLength != 0)
{
hr = pCaptureClient->GetBuffer(&pData,
&numFramesAvailable,
&flags, NULL, NULL);
if (!(flags & AUDCLNT_BUFFERFLAGS_SILENT))
{
printf("Packet size: %d\n", packetLength);
if (pwfx->nChannels == 2 && pwfx->wBitsPerSample == 32)
{
for (i = 0; i < numFramesAvailable * 2; i+=2)
{
CopyMemory(&f[0], &((float*)pData)[i], sizeof(float));
CopyMemory(&f[1], &((float*)pData)[i+1], sizeof(float));
//printf("%8d %7.4f %7.4f\n", i, f[0], f[1]);
}
}
}
hr = pCaptureClient->ReleaseBuffer(numFramesAvailable);
}
}
while (1);