繁体   English   中英

如何获得Windows音频播放的当前采样率?

[英]How do you get the current sample rate of Windows audio playback?

我正在使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM