2017-02-26 83 views
1

我可以通過編程使用IAudioEndpointVolumeSetMasterVolumeLevel()方法以C++更改Windows上的默認聲音設備的音量級別。如何以編程方式更改非默認聲音設備的音量級別?

如何更改音量級別非默認聲音設備,在帶有多個聲卡的PC上?

+1

這通常是一個非常糟糕的主意,夥計。除非您正在編寫驅動程序等,否則不必爲用戶管理音量級別。 – vaxquis

+1

是什麼讓你不能在引用所需音頻設備的'IAudioEndpointVolume'接口上調用'SetMasterVolumeLevel()'? – IInspectable

+0

@IInspectable,我可以得到設備列表,但不知道如何從這個列表中選擇另一個聲音設備來改變其音量級別。 我試着用'IMMDeviceEnumerator'和'GetDevice()'方法選擇它來獲得非默認設備,但是它在執行時崩潰。 – Alper

回答

1

我解決它,這是我的代碼:

HRESULT hr = S_OK; 
IMMDeviceEnumerator *pEnumerator = NULL; 
IMMDeviceCollection *pCollection = NULL; 
IMMDevice *pEndpoint = NULL; 
IPropertyStore *pProps = NULL; 
LPWSTR pwszID = NULL; 
CoInitialize(NULL); 

hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL,CLSCTX_ALL, IID_IMMDeviceEnumerator,(void**)&pEnumerator); 
hr = pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE,&pCollection); // ** use "eCapture" for microphones and "eRender" for speakers. 
hr = pCollection->GetCount(&count); 
if (count == 0){ 
    cout <<"No endpoints found."<<endl; 
} 
for (ULONG i = 0; i < count; i++){ 
    hr = pCollection->Item(i, &pEndpoint); 
    hr = pEndpoint->GetId(&pwszID); 
    IAudioEndpointVolume *endpointVolume = NULL; 
    pEnumerator->GetDevice(pwszID,&pEndpoint); 
    pEndpoint->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume); 
    hr = pEndpoint->OpenPropertyStore(STGM_READ, &pProps); 
    PROPVARIANT varName; 
    PropVariantInit(&varName); 
    hr = pProps->GetValue(PKEY_Device_FriendlyName, &varName); 
    printf("Endpoint %d: \"%S\" (%S)\n",i, varName.pwszVal, pwszID); 
    CoTaskMemFree(pwszID); 
    pwszID = NULL; 
    PropVariantClear(&varName); 
    endpointVolume->SetMasterVolumeLevelScalar(0.1, NULL); // set volume level of device to 0.1 (10%) 
    // endpointVolume->Release(); 
    //you can save endpointVolume in a container to set set volume level for each device. 
} 
相關問題