Как использовать WASAPI (или что-то подобное) для непрерывной выборки аудио в кольцевой буфер (безопасный для потоков), чтобы потребительский поток мог читать из этого буфера через заданный интервал?
В настоящее время у нас есть метод .sample()
, который возвращает порцию выборок после заданного интервала выборки, но это приводит к дополнительным издержкам из-за выделения памяти и т. Д. Возможно, этот метод можно было бы оптимизировать; Я почти уверен, что мы делаем это неправильно.
std::vector<short> sampler2::sample()
{
// prepare header
waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
// insert a wave input buffer
waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
// commence sampling input
waveInStart(hWaveIn);
// sleep for the duration of a sample interval
std::this_thread::sleep_for(milliseconds(SAMPLE_INTERVAL));
// create vector
std::vector<short> samplesChunk(&waveIn[0], &waveIn[0] + NUMPTS);
// return vector
return samplesChunk;
}
Ссылки на GitHub: sampler2.h & sampler2.cpp
Код очень дерьмовый, и мы понятия не имеем, как правильно использовать WASAPI. Нашей целью было (быстро) создать класс сэмплера, который может использовать интервал сэмплирования> 10 мс.