首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用wasapi绘制音频时遇到的问题

使用wasapi绘制音频时遇到的问题
EN

Stack Overflow用户
提问于 2020-05-01 04:35:14
回答 1查看 112关注 0票数 0

过了一段时间,音频音高变得更清晰,然后只发出一些注释,这使我认为问题在于我填充缓冲区的方式

代码语言:javascript
复制
int AudioThreadProc(AUDIOSTRUCT* audio) {
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
    HANDLE buffReady = CreateEvent(0, 0, 1, 0);
    audio->client->lpVtbl->SetEventHandle(audio->client, buffReady);

    unsigned int soundBuffSize;
    audio->client->lpVtbl->GetBufferSize(audio->client, &soundBuffSize);
    audio->client->lpVtbl->Start(audio.client);

    static float time = 0;
    float dtime = 1 / (float)44100;

    for (;;) {
        WaitForSingleObject(buffReady, INFINITE);

        unsigned int soundFrames;
        audio->client->lpVtbl->GetCurrentPadding(audio->client, &soundFrames);
        unsigned int FramesToFill = soundBuffSize - soundFrames;
        unsigned short int* soundBuff;
        audio->render->lpVtbl->GetBuffer(audio.render, FramesToFill, &soundBuff);

        for (unsigned int i = 0; i < FramesToFill; i++) {
            unsigned short int soundWave = audio->callback(time);
            time += dtime;
            *soundBuff++ = soundWave;
            *soundBuff++ = soundWave;
        }
        audio->render->lpVtbl->ReleaseBuffer(audio.render, FramesToFill, 0);

    }
    return 0;
}

回调函数是唯一的正弦波发生器。

代码语言:javascript
复制
float callback(float time){
 returns sin(pitch * PI2 * time) * 0xFFFF;
}

//...
audio.callback = callback;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-01 04:59:26

我认为这里的答案几乎相当于我几年前给出的this answer。随着time的上升,计算pitch*2π*time的浮点精度下降。调整您的代码,使time重置回零或is,并在完成完整的数据波后从零抵消。

就像这样:

代码语言:javascript
复制
time += dtime;
if (time > 1.0) {
    time -= 1.0;
}

此外,调用每个示例的函数调用的总开销也可能是一个问题。将callback转换为宏。你不会后悔的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61536861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档