📅  最后修改于: 2023-12-03 15:05:57.859000             🧑  作者: Mango
在Windows操作系统中,应用程序需要能够选择使用哪个音频设备进行录制或播放音频。这需要使用Windows Core Audio API,该API提供了许多与音频相关的功能。
要获取可用的音频设备列表,需要使用以下步骤:
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();
完整代码如下:
#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,应用程序开发人员可以轻松获取设备列表并选择要使用的设备。