Кто-нибудь еще сталкивался со значительными гармоническими искажениями при использовании шлейфа WASAPI?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Кто-нибудь еще сталкивался со значительными гармоническими искажениями при использовании шлейфа WASAPI?

Сообщение Anonymous »

Я использую петлю WASAPI для визуализации звука в реальном времени и наблюдаю довольно значительные искажения. Когда я воспроизвожу тон 25 Гц из Audacity (и других программ) и записываю семплы, полученные с помощью WASAPI, я вижу множество гармоник, самый высокий из которых составляет -46 дБ. Я использую Windows 11, и моя звуковая карта настроена на 16-битную частоту 44 100 Гц, а пространственный звук отключен, но я тестировал другие комбинации безрезультатно. Мне это кажется невероятно плохим.
Мой код выглядит примерно так:

Код: Выделить всё

int main() {
init_apartment();

com_ptr deviceEnumerator;
check_hresult(CoCreateInstance(
__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL,
__uuidof(IMMDeviceEnumerator), deviceEnumerator.put_void()));

com_ptr device;
check_hresult(deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, device.put()));

com_ptr audioClient;
check_hresult(device->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, audioClient.put_void()));

std::unique_ptr format;
check_hresult(audioClient->GetMixFormat(std::out_ptr(format)));
assertMixFormat(format.get());

check_hresult(audioClient->Initialize(
AUDCLNT_SHAREMODE_SHARED,
AUDCLNT_STREAMFLAGS_LOOPBACK,
0, 0, format.get(), NULL));

while (true) {
auto nextPacketSize = [&] {
UINT32 packetSize = 0;
check_hresult(captureClient->GetNextPacketSize(&packetSize));
return packetSize;
};

while (nextPacketSize() > 0) {
BYTE* pData = nullptr;
UINT32 numFrames = 0;
DWORD flags = 0;

check_hresult(captureClient->GetBuffer(&pData, &numFrames, &flags, NULL, NULL));

auto samples = reinterpret_cast(pData);

for (std::size_t i = 0; i < numFrames; ++i) {
//process samples
}

check_hresult(captureClient->ReleaseBuffer(numFrames));
}
}
}
Изображение



Подробнее здесь: https://stackoverflow.com/questions/798 ... i-loopback
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»