【发布时间】:2020-05-01 04:35:14
【问题描述】:
一段时间后,音频音调变得更尖锐,然后只发出噪音 这让我觉得问题出在我填充缓冲区的方式上
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;
}
回调函数只是一个正弦波发生器
float callback(float time){
returns sin(pitch * PI2 * time) * 0xFFFF;
}
//...
audio.callback = callback;
【问题讨论】:
-
这看起来不像是有效的 C:
AudioThreadProc有一个void参数,这是不允许的,但可能意味着void *用于通用参数。但即便如此,它也必须转换为正确的结构类型才能引用它。这甚至可以编译吗? -
它是void*,它指向一个包含renderclient和audioclient的结构
-
没有强制转换就不能引用 void 指针,而且“audio.client”无论如何都不正确。此代码是否在没有警告的情况下编译?你打开最大警告吗?
标签: c