2014-10-09 440 views
2

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

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

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

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/dd316580%28v=vs.85%29.aspx – 2014-10-09 19:26:26

+0

谢谢您的回答。它看起来有点复杂(考虑程序中的特征有多小),但我最终可能会解决它。 – Blake 2014-10-16 22:56:59

回答

3
//#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; 
} 
+0

再次感谢汉斯指引我朝着正确的方向。此代码示例获取默认回放设备(不是原始问题的一部分,但这类代码的大多数示例都是用于获取系统上所有设备的属性...),并获取可以看到的“默认格式”在控制面板>声音中。如果有人对此感到好奇,我也可以把它翻译成帕斯卡。 – Blake 2014-10-21 23:26:45