gpt4 book ai didi

c++ - 连续 WASAPI 环形缓冲区采样

转载 作者:行者123 更新时间:2023-12-03 02:35:19 26 4
gpt4 key购买 nike

如何使用 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 毫秒的采样间隔。

最佳答案

您的示例使用 waveout API。您可以查看MSDN供 WASAPI 引用和使用。
以下是 WASAPI 使用的基本说明:
客户端调用 IAudioRenderClient 中的方法将渲染数据写入端点缓冲区的接口(interface)。要请求特定大小的端点缓冲区,客户端调用 IAudioClient::Initialize方法。为了获得分配的缓冲区的大小,这可能与请求的大小不同,客户端调用 IAudioClient::GetBufferSize方法。
为了通过端点缓冲区移动渲染数据流,客户端交替调用 IAudioRenderClient::GetBuffer方法和 IAudioRenderClient::ReleaseBuffer方法。客户端以一系列数据包的形式访问端点缓冲区中的数据。 GetBuffer 调用检索下一个数据包,以便客户端可以用渲染数据填充它。将数据写入数据包后,客户端调用 ReleaseBuffer 将完成的数据包添加到渲染队列中。
还有这个 Microsoft C++ WASAPI example .

关于c++ - 连续 WASAPI 环形缓冲区采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53364127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com