实时音频可视化与生成音频样本同步问题求助
WASAPI音频波形实时可视化问题求助
正在构建一款可视化生成音频样本波形的应用,该应用持续生成音频样本、填充缓冲区并将其提供给WASAPI进行播放。用户可通过按下不同键盘按键(覆盖C4到B4范围,对应频率261.6256 Hz至493.8833 Hz)更改生成音频的频率。目前音频生成功能运行正常,但实现实时波形可视化(显示扬声器当前播放的波形)时遇到瓶颈,已尝试多种方案均未解决:
- 尝试直接获取WASAPI待播放音频缓冲区指针,未找到可行方法;
- 使用最近提交的缓冲区数据近似波形,因音频生成循环与渲染循环的时序/同步问题,出现正弦波形重叠;
- 基于按键时长估算波形,存在抖动且重叠问题仍存在;
- 在渲染循环中添加
std::cout或锁定帧率,要么程序卡顿要么重叠/闪烁问题并存; - 关闭背景清除后,发现波形存在相位偏移;
- 后续更新为环形缓冲区+事件回调模式,又尝试将过零点固定在窗口左侧,问题仍未解决。
音频生成核心代码
void Update() { static float prev_freq = 0; //process input & events { if (main_window->IsKeyPressed(KeyCode::C)) { pressed = PIANO::C; frequency = C4_FREQUENCY; } else if (main_window->IsKeyPressed(KeyCode::F)) { pressed = PIANO::C_SHARP; frequency = C4_SHARP_FREQUENCY; } else { pressed = PIANO::NONE; frequency = 0.0f; } } if (prev_freq != frequency) { prev_freq = frequency; time_held = 0; } //grab all available audio frames static float time = 0; HRESULT hr; UINT32 num_frames, padding_frames; hr = pAudioClient->GetBufferSize(&num_frames); hr = pAudioClient->GetCurrentPadding(&padding_frames); available_frames = num_frames - padding_frames; //write data to audio frames hr = pAudioRenderClient->GetBuffer(available_frames, (BYTE**)&buffer); for (unsigned int i = 0; i < available_frames; i++) { float amp = max_amplitude * sin(2 * PI * frequency * time); buffer[i] = (int16_t)amp; time += 1.f / wave_fmt->nSamplesPerSec; } hr = pAudioRenderClient->ReleaseBuffer(available_frames, NULL); //time one key has been held in milliseconds time_held += (frequency == 0 ? (-time_held) : dt); }
内容的提问来源于stack exchange,提问作者J.T. Freeman
相关产品推荐
相关产品推荐

