📜  windows为应用程序选择音频设备 (1)

📅  最后修改于: 2023-12-03 15:05:57.859000             🧑  作者: Mango

Windows应用程序选择音频设备

在Windows操作系统中,应用程序需要能够选择使用哪个音频设备进行录制或播放音频。这需要使用Windows Core Audio API,该API提供了许多与音频相关的功能。

获取音频设备列表

要获取可用的音频设备列表,需要使用以下步骤:

  1. 初始化Windows Core Audio API
CoInitialize(NULL);
IMMDeviceEnumerator* pEnumerator = NULL;
HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);
  1. 获取音频设备集合
IMMDeviceCollection* pCollection = NULL;
hr = pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pCollection);

该代码片段将返回活动的音频设备集合。

  1. 获取设备数量和每个设备的名称
UINT count;
hr = pCollection->GetCount(&count);

for (int i = 0; i < count; i++)
{
    IMMDevice* pDevice = NULL;
    hr = pCollection->Item(i, &pDevice);

    LPWSTR pwszID = NULL;
    hr = pDevice->GetId(&pwszID);

    IPropertyStore* pStore;
    hr = pDevice->OpenPropertyStore(STGM_READ, &pStore);

    PROPVARIANT varName;
    PropVariantInit(&varName);
    hr = pStore->GetValue(PKEY_Device_FriendlyName, &varName);

    printf("Device %d: %ws\n", i, varName.pwszVal);

    pStore->Release();
    pDevice->Release();
}

该代码段包括获取设备数量以及每个设备的名称。

  1. 释放资源
pEnumerator->Release();
pCollection->Release();
CoUninitialize();

完整代码如下:

#include <stdio.h>
#include <windows.h>
#include <mmdeviceapi.h>

int main()
{
    CoInitialize(NULL);
    IMMDeviceEnumerator* pEnumerator = NULL;
    HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);

    IMMDeviceCollection* pCollection = NULL;
    hr = pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pCollection);

    UINT count;
    hr = pCollection->GetCount(&count);

    for (int i = 0; i < count; i++)
    {
        IMMDevice* pDevice = NULL;
        hr = pCollection->Item(i, &pDevice);

        LPWSTR pwszID = NULL;
        hr = pDevice->GetId(&pwszID);

        IPropertyStore* pStore;
        hr = pDevice->OpenPropertyStore(STGM_READ, &pStore);

        PROPVARIANT varName;
        PropVariantInit(&varName);
        hr = pStore->GetValue(PKEY_Device_FriendlyName, &varName);

        printf("Device %d: %ws\n", i, varName.pwszVal);

        pStore->Release();
        pDevice->Release();
    }

    pEnumerator->Release();
    pCollection->Release();
    CoUninitialize();

    return 0;
}
选择音频设备

选择音频设备可能因应用而异,但以下代码片段可用于将音频设备设置为默认渲染设备:

IMMDevice* pDefaultDevice = NULL;
hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDefaultDevice);

LPWSTR pwszID = NULL;
hr = pDefaultDevice->GetId(&pwszID);

hr = pEnumerator->SetDefaultAudioEndpoint(eRender, eConsole, pDefaultDevice);

该方法选择默认渲染设备。必须选择可用并且当前处于活动状态的设备。

结论

通过使用Windows Core Audio API,应用程序开发人员可以轻松获取设备列表并选择要使用的设备。