You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实时音频可视化与生成音频样本同步问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:42:24