Je l'ai résolu, voici mon code:
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.
}
ce qui est généralement une très mauvaise idée, mon pote. Sauf si vous écrivez des pilotes etc., laissez la possibilité de gérer les niveaux de volume à l'utilisateur. – vaxquis
Qu'est-ce qui vous empêche d'appeler 'SetMasterVolumeLevel()' sur l'interface 'IAudioEndpointVolume' en référence au périphérique audio désiré? – IInspectable
@IInspectable, je peux obtenir la liste des périphériques mais je ne sais pas comment sélectionner un autre périphérique audio de cette liste pour modifier son niveau de volume. J'ai essayé de le sélectionner en utilisant la méthode 'IMMDeviceEnumerator' et' GetDevice() 'pour obtenir un périphérique autre que celui par défaut, mais il se bloque lors de l'exécution. – Alper