gpt4 book ai didi

c++ - 如何获取当前 Windows 音频播放的采样率?

转载 作者:可可西里 更新时间:2023-11-01 14:49:48 26 4
gpt4 key购买 nike

我正在使用 Windows waveOut API(又名 MME 或多媒体扩展)mmsystem.h。某些程序会更改音频播放采样率(例如,从 44.1kHz 到 48kHz),这对我的程序检测当前播放采样率非常有用,因此它可以警告用户 Windows 将重新采样程序的输出。

根据本文档http://msdn.microsoft.com/en-us/library/aa909811.aspx , waveOutGetPlaybackRate 返回设备当前正在执行的重采样百分比(例如,设备以 44.1 播放,而程序以 44.1 播放音频,因此它将返回 1.0)。我很好奇是否有办法获得设备的绝对采样率,而不是相对的。在 Windows Vista/7/8 中,您可以通过以下方式手动查找此值:控制面板 > 声音 > 播放,右键单击默认播放设备并选择属性,然后选择高级选项卡。因此,我试图通过查询操作系统来获取此处找到的“默认格式”值。

有问题的程序是用 Pascal 编写的,但是,我通常使用 C/C++ 引用。

最佳答案

    //#include <iostream>
//#include <initguid.h>
//#include <Mmdeviceapi.h>

int main() {
HRESULT hr;
IMMDevice * pDevice = NULL;
IMMDeviceEnumerator * pEnumerator = NULL;
IPropertyStore* store = nullptr;
PWAVEFORMATEX deviceFormatProperties;
PROPVARIANT prop;

CoInitialize(NULL);

// get the device enumerator
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (LPVOID *)&pEnumerator);

// get default audio endpoint
hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);

hr = pDevice->OpenPropertyStore(STGM_READ, &store);
if (FAILED(hr)) {
std::cout << "OpenPropertyStore failed!" << std::endl;
}

hr = store->GetValue(PKEY_AudioEngine_DeviceFormat, &prop);
if (FAILED(hr)) {
std::cout << "GetValue failed!" << std::endl;
}

deviceFormatProperties = (PWAVEFORMATEX)prop.blob.pBlobData;
std::cout << "Channels = " << deviceFormatProperties->nChannels << std::endl;
std::cout << "Sample rate = " << deviceFormatProperties->nSamplesPerSec << std::endl;
std::cout << "Bit depth = " << deviceFormatProperties->wBitsPerSample << std::endl;

system("pause");
return 0;
}

关于c++ - 如何获取当前 Windows 音频播放的采样率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com