Типовое решение этой проблемы -- накапливать данные у себя и обрабатывать, когда накоплено столько, сколько нужно. Совсем тупая реализация на С:
char *buf;
size_t buf_sz;
...
BOOL CALLBACK DuffRecording(HRECORD hangle, const void *buffer, DWORD lenght, void *user)
{
buf = realloc(buf, buf_sz + length);
memcpy(buf + buf_sz, buffer, lenght);
buf_sz += length;
return TRUE;
}
// эту функцию нужно вызывать когда есть новые данные,
// например, после каждого вызова DuffRecording
void chunk_handler(void)
{
size_t offset = 0;
while (buf_sz >= offset + CHUNK_SIZE) {
do_something_with_data(buf + offset);
offset += CHUNK_SIZE;
}
if (offset) {
memmove(buf, buf + offset, buf_sz - offset);
buf_sz -= offset;
}
}
// эта функция будет вызвана с p указывающим на буфер длиной CHUNK_SIZE
void do_something_with_data(void *p)
{
...
}